Linux网络套接字

ADRV9026初始化避坑指南:手把手调试PostMcsInit常见故障 本文详细解析了ADRV9026多片同步初始化过程中的PostMcsInit常见故障,包括时钟校准失败、JESD链路建立问题和ARM核通信异常等。通过实际项目经验,提供了硬件检查清单、软件配置要点和分层诊断方法,帮助工程师快速定位和解决问题,提升系统稳定性。 阅读详情
Linux网络套接字 

分类: LINUX

    套接字连接的过程如同(客户)打一个电话到一个大公司,接线员(服务器进程)接听电话并把它转接到你要找的部门,然后再从那里转到你要找的人(服务器套接字),然后接线员(服务器进程)再继续转接其它(客户)的电话。
    套接字有本地套接字和网络套接字两种。本地套接字的名字是Linux文件系统中的文件名,一般放在/tmp或/usr/tmp目录中;网络套接字的名字是与客户连接的特定网络有关的服务标识符(端口号或访问点)。这个标识符允许Linux将进入的针对特定端口号的连接转到正确的服务器进程。
 
套接字通信建立过程
服务器端:
  1. 服务器应用程序用系统调用socket创建一个套接字。 它是系统分配给服务器进程的类似文件描述符的资源。
  2. 服务器进程用系统调用bind命名套接字。 然后服务器进程就开始等待客户连接到这个命名套接字。
  3. 系统调用listen创建一个队列用来存放来自客户的进入连接。
  4. 服务器通过系统调用accept来接受客户的连接。 accept会创建一个不同于命名套接字的新套接字来与这个特定客户进行通信,而命名套接字则被保留下来继续处理其他客户的连接请求。

客户端:

  1. 调用socket创建一个未命名套接字。
  2. 调用connect与服务器建立连接,将服务器的命名套接字作为一个地址。

套接字地址

每个套接字域都有自己的地址格式。

AF_UNIX 域套接字格式

  1. #include <sys/un.h>
  2. struct sockaddr_un
  3. {
  4.   sa_family_t sun_family;  //AF_UNIX
  5.   char        sun_path[];  //文件路径,Linux规定不超过108个字符
  6. }

AF_INET 域套接字格式

  1. #include <netinet/in.h>
  2. struct sockaddr_in
  3. {
  4.   short int           sin_family;   //AF_INET
  5.   unsigned short int  sin_port;     //端口号
  6.   struct in_addr      sin_addr;     //IP地址
  7. };

  8. IP地址结构
  9. struct in_addr
  10. {
  11.   unsigned long int s_addr;
  12. };

IP地址是由4个字节组成的一个32位的值。

对于应用程序来说,套接字就和文件描述符一样,并且通过一个唯一的整数值来区分。

套接字通信涉及的系统调用

1.创建套接字(服务器/客户端)

  1. #include <sys/types.h>
  2. #include <sys/socket.h>

  3. int socket(int domain, int type, int protocol);
  • domain:套接字域,用于指定协议族。 最常用的套接字域是AF_UNIX和AF_INET。前者用于通过*inx文件系统实现的本地套接字,后者用于UNIX网络套接字。 
  • type:通信类型。 取值包括SOCK_STREAM 和 SOCK_DGRAM 。对AF_INET域来说,前者默认是通过TCP连接实现的,是有序、可靠和面向连接的双向字节流,可重传丢失的数据;后者默认通过UDP数据报来实现,不保证消息肯定会被正确和有序地传递。
  • protocol:使用的协议。由套接字类型和套接字域来决定,一般设置为0,表示使用默认协议。

socket系统调用返回一个描述符,当连接建立以后,就可以通过这个描述符在套接字上发送和接收数据了。

close系统调用用于结束套接字连接。

2.命名套接字(服务器)

  1. #include <sys/socket.h>

  2. int bind(int socket, const struct sockaddr *addr, size_t addr_len);

通过socket调用创建的套接字必须经过命名后才能使用。

bind系统调用把addr中的地址分配给与描述符socket关联的未命名套接字,地址结构的长度由addr_len指定。 addr和addr_len因地址族(AF_UNIX、AF_INET等)的不同而不同,bind调用时需要将指向特定地址结构的指针转化为指向通用地址的指针,即(struct sockaddr *)。

参数socket为由服务器创建的未命名的套接字描述符;

参数addr为通用地址结构,一般只需提供固定的端口号,即如下设置

  1. struct sockaddr_in server_add;
  2. server_add.sin_family = AF_INET;
  3. server_add.sin_addr.s_addr = htonl(INADDR_ANY);  //接受任意IP地址的客户连接
  4. server_add.sin_port = htons(port);       //port为服务器端指定的端口号,unsigned short int类型

  5. server_len = sizeof(server_add);

  6. bind(server_sockfd, (struct sockaddr*)&server_add, server_len);

参数addr_len为服务器地址结构的长度;

bind调用成功返回0,失败返回-1并设置errno的值。

errno的值及意义

  • EBADF:描述符无效
  • ENOTSOCK:描述符对应的不是一个套接字
  • EINVAL:描述符对应的是一个已命名的套接字
  • EADDRNOTAVAIL:地址不可用
  • EADDRINUSE:地址已经绑定了一个套接字
  • EACCESS:(AF_UNIX特有)权限不够,无法创建文件系统中的路径名
  • ENOTDIR、ENAMETOOLONG:(AF_UNIX特有)文件名不符合要求

3.创建套接字队列(服务器)

  1. #include <sys/socket.h>

  2. int listen(int socket, int backlog);

服务器调用listen创建一个队列来保存未来得及处理的请求。

参数socket为被服务器命名过的套接字描述符;backlog为设置的队列的长度,常用值为5.

listen调用成功时返回0,失败时返回-1并设置errno的值。

4.接受连接(服务器)

  1. #include <sys/socket.h>

  2. int accept(int socket, struct sockaddr *addr, size_t *addr_len);

服务器通过accept系统调用来等待客户端对该套接字的连接。

accept只有当有客户程序试图连接到由socket参数指定的套接字时才会返回。

accept将会创建一个新的套接字来与该客户进行通信,并且返回新套接字的描述符。

参数socket为被服务器命名过的套接字描述符;

参数addr指向的socketadd地址结构用来存放将要连接到的客户的地址,只有accept成功返回时才有效。如果不关心客户地址,可以将addr参数指定为空指针;

  1. int client_sockfd;
  2. struct sockaddr_in client_add;
  3. clinet_len = sizeof(client_add);

  4. client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_add, &client_len);

参数addr_len指定客户地址结构的长度。如果超过这个值,客户地址将被截断。在accept调用之前,需要将其设置为预期的地址长度,当accept调用返回之后,addr_len将被设置为客户地址的实际长度。

注:accept中的addr_len为指向size_t类型的指针,bind中的addr_len为size_t类型。

如果套接字队列中没有未处理的连接,accept将阻塞(程序将暂停)直到有客户建立连接请求。

可以通过对套接字描述符设置 O_NONBLOCK 标志来改变这一行为,使用的函数是 fcntl,如下:

  1. int flag = fcntl(socket, F_GETFL, 0);

  2. fcntl(socket, F_SETFL, O_NONBLOCK | flag);

当有未处理的请求时,accept返回一个新的套接字描述符。发生错误时,accept返回-1,并且设置errno的值。除了前面提到的之外,其他的错误有 EWOULDBLOCK 和 ENITR。前者是指定了O_NONBLOCK标志,但队列中没有未处理的请求;后者是当进程阻塞在accept调用时执行被中断。

5.请求连接(客户端)

  1. #include <sys/socket.h>

  2. int connect(int socket, const struct sockaddr *addr, size_t addr_len);

“擦,跟bind的参数类型一样一样一样滴。。”

客户端首先利用socket系统调用创建一个套接字,但不给它命名,然后利用connect系统调用建立起该未命名套接字与服务器监听套接字之间的连接。

参数socket为客户端程序创建的未命名套接字描述符;

参数addr指向的为服务器端的地址结构;

  1. struct sockaddr_in server_add;
  2. server_add.sin_family = AF_INET;
  3. serevr_add.sin_addr.s_addr = inet_addr("***.***.***.***");
  4. //服务器地址,无需htonl转换,因为inet_addr已定义为网络字节序
  5. server_add.sin_addr.sin_port = htons(port);  //port,int型变量,与服务器端相同的端口号
  6. len = sizeof(server_add);

  7. connect(sockfd, (struct sockaddr *)&server_add, len);  //可根据返回值判断连接状态

参数addr_len为addr指向的地址结构(即服务器地址)的长度。

connect调用成功时返回0,失败时返回-1并设置错误代码errno。

errno可能的值有:

  • EBADF:参数socket的描述符无效
  • EALREADY:该套接字上已经有一个正在进行中的连接
  • ETIMEDOUT:请求超时
  • ECONNREFUSED:连接请求被服务器拒绝

如果连接不能立刻建立,connect将会阻塞一段时间,如果超过某个超时时间,连接将被放弃,connect调用失败。

如果连接被一个信号中断,而该信号又得到了处理,connect依然会调用失败(erron=EINTR),但连接尝试交不会放弃,而是以异步方式继续建立,程序必须在此后进行检查以查看连接是否成功建立。

connect调用的阻塞特性可以通过设置该套接字描述符的O_NONBLOCK标志来改变。此时,如果连接不能立刻建立,connect将失败并把errno设置为EINPROGRESS,而连接将以异步方式继续进行
28_Spring AI 干货笔记之 OpenAI 聊天功能 本文详细介绍了在Spring AI框架中集成OpenAI聊天模型的方法。内容涵盖API密钥配置、通过starter依赖启用自动配置、连接与模型参数的详细设置,并重点说明了运行时选项的动态覆盖机制。文章还深入讲解了多模态处理(图像与音频)、结构化输出、函数调用等高级功能,提供了示例控制器和手动配置指南,并讨论了与OpenAI兼容服务器的适配与推理模型思维链的获取。 阅读详情

相关推荐

华三(H3C)网络设备配置命令大全与学习指南

本文全面介绍 H3C 网络设备的配置命令,涵盖路由器、交换机、ACL、NAT、VTY、SSH、本地用户、日志、STP、防火墙、QoS 等模块,适合网络工程初学者与运维人员参考。

DreamCollector的博客 6562

错误“hwaddr_len must be the same as ETH_HWADDR_LEN”的可能原因

Assertion "netif->hwaddr_len must be the same as ETH_HWADDR_LEN for etharp!" failed at line 1130 in ../../../../../../Middlewares/Third_Party/LwIP/src/core/ipv4/etharp.c Assertion "netif->hwaddr...

Flyaswing的博客 993

html一号店项目代码,项目一号店素材(html模板)

【实例简介】【实例截图】【核心代码】oneShop├── css│ ├── ShopShow.css│ ├── base.css│ ├── load.css│ ├── logo.css│ ├── register.css│ └── style.css├── detail.html├── images│ ├── Thumbs.db│ ├── a_close.png│...

weixin_35390150的博客 4989

Linux之网络套接字

首先我们在网络基础1的基础上就要先初步认识一下UDP和TCP协议此处我们先对TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识;后面我们再详细讨论TCP的一 些细节问题.此处我们也是对UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识;后面再详细讨论两者并没有绝对的好坏之分。通知像对可靠性要求非常高的就选tcp(银行等不允许信息丢失的),较低的就选udp(比如网络直播这种可以允许少量信息丢失的)。

qq_35639854的博客 804

【数学模型】灰色关联分析

数学模型-灰色关联分析

suic009的博客 1万+

滑模观测器与锁相环结合应用:让电机“无感”也能精准旋转的奥秘

本文介绍了永磁同步电机无传感器控制中的滑模观测器(SMO)结合锁相环(PLL)技术。SMO通过创建虚拟电机模型,利用电流误差产生控制信号来估计反电动势;PLL则从反电动势中解码转子位置和速度信息。该组合方案兼具SMO的鲁棒性和PLL的高精度,计算量小且硬件要求低。文章详细阐述了原理、数学模型、参数整定方法及实际实现技巧,包括离散化处理、符号函数替代等优化手段,并分析了低速性能限制、抖振问题等常见挑战及解决方案。最后指出该技术未来将与人工智能、多观测器融合等方向结合发展。

汽车软件开发 193

Linux原始套接字实现分析

并将套接字结构的ops设置为inet_sockraw_ops,将套接字结构的sk_prot设置为raw_prot。网卡驱动收到报文后在软中断上下文中由netif_receive_skb()处理,匹配是否有注册的链路层原始套接字,若匹配上就通过skb_clone()来克隆报文,并将报文交给相应的原始套接字。对于IP报文,在协议栈的ip_local_deliver_finish()函数中会匹配是否有注册的网络层原始套接字,若匹配上就通过skb_clone()克隆报文并交给相应的原始套接字来处理。

木牛的博客 714

控制科学与工程(自动化)保研经验【1】——预备篇

个人情况 学校:中末流211 专业:自动化(学科评估B-) 年份:2019 排名:4/128 绩点:4.16/5 竞赛:三个国二(包括数模国赛美赛)、两个省一(机器人、电子设计竞赛) 【本科期间竞赛做的比较多,是我的一大亮点,可以在筛简历这关适当弥补专业排名的不足】 科研:一个校级的大创项目(水) 夏令营报名:中科大科学岛、中科大本部、自动化所、沈自所、北航(仪器17系)、山大、浙江大学、南开、同...

Control Everything 1万+

linux网络编程----套接字编程

源代码在github上点击这里TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节 套接字:IP地址 + TCP端口号 (socket) 一个套接字,唯一标识网络通讯中的一个进程 TCP/IP协议中,两个进程若想建立连接,就离不开套接字,它是TCP连接中的端点套接字地址结构:(用来保存套接字的相应信息)linux下I

逆向飞翔的博客 439

展锐平台wifi连接性问题解决方案

对于断开连接的问题,需要从kernel log中确认下,是上 层主动发起的断开(会下发disconnect的命令),还是CP侧上报的断开事件。同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。1、出现wifi连接正常,但无法上网问题,首先确认其他手机是否可以正常上网,排除网络自身问题;3 路由器配置问题,出现过一个案例,恢复出场设置问题就解决了,具体根因。

手机-手表蓝牙开发工程师的博客 2022

【Spring Cloud Alibaba】Linux安装RocketMQ以及RocketMQ Dashboard可视化工具

在当今分布式架构的开发中,消息队列成为了一种常见的解决方案。RocketMQ是阿里巴巴开源的分布式消息中间件,具有高吞吐量、高可用性和强大的扩展性,因此在构建大规模、高可靠性的应用系统时备受推崇。而在使用RocketMQ时,为了更好地了解消息的流动和监控,RocketMQ Dashboard成为了一个不可或缺的可视化工具。本篇博客将带大家一步步在Linux系统中安装RocketMQ,并介绍如何配置和使用RocketMQ Dashboard。

编码人生 3381

[Linux网络编程]Socket套接字

socket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。本文归纳整理Socket的使用

weixin_44972997的博客 3671

【数据集介绍】MVTec 3D AD数据集介绍

MVTec AD(MVTec Anomaly Detection)数据集是用于异常检测的计算机视觉数据集。该数据集包含来自工业生产中不同材料和产品的图像,包括玻璃、塑料、纺织品等。每个类别都包含正常样本和异常样本。这些异常样本包括各种常见的生产缺陷,如划痕、裂纹、凹陷等。MVTec AD数据集旨在帮助研究人员和从业者开发和评估用于检测工业制造中物体缺陷的算法和系统。

原来也有北瓜 7748

【Linux网络】网络套接字socket

💬 hello!各位铁子们大家好哇。今日更新了Linux网络编程的内容。

qinjh_的博客 2621

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Linux】网络套接字

是在后台运行的进程,它通常不与任何终端交互,并且在系统启动时或系统运行过程中自动启动。守护进程化(Daemonization)指的是将一个普通的进程转变为守护进程的过程。需要注意的是,这个返回值是一个静态缓冲区的指针,因此在多线程环境中使用时需要小心。的区分主要是通过进程的输入/输出交互方式来确定的,具体来说是基于终端控制和进程的执行方式。后台进程是指在系统后台运行的进程,它不会占用当前终端的输入输出流。是一个系统调用函数,用于创建一个新的套接字,用于在应用程序和操作系统的网络协议栈之间进行数据传输。

Raizeroko的博客 957

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【Linux网络】网络套接字编程

tcp_echo服务器tcp网络计算机。

weixin_64906519的博客 810

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux 网络套接字编程基础

Linux 网络套接字编程基础

m0_73096566的博客 1170

Linux网络:socket网络套接字

本文深入探讨网络通信基础与套接字原理。第一部分补充网络基础知识,解析以太网通信机制(通过MAC地址识别)、局域网数据封装/分用过程,以及跨网络通信中路由器的关键作用,区分IP地址与MAC地址功能差异。第二部分聚焦网络套接字,阐明端口号标识网络进程的唯一性,对比其与进程PID的区别,解答端口绑定规则,并强调网络字节序统一采用大端格式。全文通过问答形式系统梳理网络通信的核心概念,为理解网络协议栈底层逻辑提供清晰框架。

知北游天的博客 1759

Linux网络套接字编程——创建并绑定

如果将进程比作一个房子,那套接字相当于是一扇门,通向与外界通信的通道。在网络中,如何理解套接字呢,时刻记住套接字是为了标识互联网中的某一台主机上的某一个进程,因此它就是IP地址 + 端口号。现在你完全可以把套接字当成一个结构体,里面包含了这台主机的IP地址和端口号。(只为了方便理解,实际中可能并不止如此)在介绍套接字前,先来认识一下网络字节序。

roboko_的博客 1022

【Linux | 网络】网络编程套接字

本篇文章先讲解 IP 地址、端口号、网络套接字等基础概念,讲解端口号与进程 ID在网络中的作用,介绍 TCP、UDP 协议及网络字节序。再详述 socket 编程接口,包括 socket、bind 等常见 API,主机与网络字节序转换函数,IP 地址形式转换函数,数据收发函数及 sockaddr 结构。

是阿建吖! 2333

Linux网络编程 套接字

Linux网络编程 套接字    一:概述    Socket 的英文原意就是“孔”或“插座”,现在,作为BSD UNIX 的进程通讯机制,取其后一种意义。日常生活中常见的插座,有的是信号插座,有的是电源插座,有的可以接受信号(或能量),有的可以发送信号(或能量)。假如电话线与电话机之间安放一个插座(相当于二者之间的接口,这一部分装置物理上是存在的)则Socket 非常相似于电话插座。

mazidao2008的专栏 3647

【Linux网络】:套接字之UDP

UDP聊天室

2201_75956982的博客 1386

Linux网络——套接字编程

在公网上, ip 地址能标识唯一一台主机,端口号 port 能标识该主机上的唯一一个进程,因此我们可以使用 ip:port 来表示全网唯一的一个进程而我们将 client_ip:client_port 与 server_ip:server_port 间的通信称为套接字编程!

qq_73201597的博客 1184

Linux网络-套接字编程基础

本章就Linux网络编程进行概念及接口学习,下一篇则是简单的进行上手网络套接字编程。

~ 1262

Linux UDP网络编程套接字sockets

在学校我们用学号,相比于身份证更简便,假如我的学号是2211211023,这样就能看到我是22级的,方便阅读信息。但是,这两个结构体都不用,我们用 sockaddr。网络通信的本质是进程间通信,有了 IP 就可以标识公网内唯一的一台主机,想要完成网络通信我们还需要一个东西来标识一台主机上的某个进程,这个标识就是端口号(port)。三种应用场景:网络套接字主要运用于跨主机之间的通信,也能支持本地通信,而域间套接字只能在本地通信,而原始套接字可以跨过传输层(TCP/IP 协议)访问底层的数据。

puppy_1mo的博客 1125
上一篇: Linux网络编程之套接字基础
下一篇: ubuntu运行android studio出错unable to run mksdcard sdk
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值