千家信息网

Linux C Socket Api是什么

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本文小编为大家详细介绍"Linux C Socket Api是什么",内容详细,步骤清晰,细节处理妥当,希望这篇"Linux C Socket Api是什么"文章能帮助大家解决疑惑,下面跟着小编的思路
千家信息网最后更新 2026年11月01日Linux C Socket Api是什么

本文小编为大家详细介绍"Linux C Socket Api是什么",内容详细,步骤清晰,细节处理妥当,希望这篇"Linux C Socket Api是什么"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

UNIX 环境高级编程对 Socket 通信的描述是套接字网络 IPC( 进程间通信 ) ,可以用于计算机间通信也可用于计算机内通信,管道、消息队列、信号量以及共享内存等都是属于计算机内通信的情况。

套接字Api详细介绍

1.套接字描述符

首先会先到的是文件描述符,对Linux一切皆文件的哲学又多懂了一点儿点儿。

套接字是通信端点的抽象。与应用程序使用文件描述符一样,访问套接字需要使用套接字描述符。套接字描述符在UNIX系统是用文件描述符实现的。

include

int  socket (int domain, int type, int protocal);返回值:成功返回文件(套接字)描述符,出错返回-1

参数 domain( 域 ) 确定通信的特性,包括地址格式。各个域都有自己的格式表示地址,表示各个域的常数都以 AF_开头,意指地址族 (address family).

参数type确定套接字的类型,进一步确定通信特征。下图给出了一些类型,但在实现中可以自由增加对其他类型的支持。

参数protocol通常是 0 ,表示按给定的域和套接字类型选择默认的协议。当对同一域和套接字类型支持多个协议时,可以使用 proticol 参数选择一个特定协议。在 A_FINET 通信域中套接字类型 SOCK_STREAM 的默认协议是 TCP( 传输控制协议 ) ; A_FINET 通信域中套接字类型 SOCK_DGRAM 的默认协议是 UDP( 用户数据报协议 ) 。

字节流(SOCK_STREAM)要求在交换数据之前,在本地套接字和远程套接字之间建立一个逻辑联系。

Tcp : 没有报文界限,提供的是字节流服务 。之前写过 Qt 传输图片的拆包与解包,原因就是如此吧。

调用socket与调用 open 类型,均可获得用于输入、输出的文件描述符。不用的时候记得 close 关闭。

2.寻址

如何确定一个目标通信进程?

进程的标识有两个部分:计算机的网络地址可以确定网络上与之想要通信的计算机

服务可以确定计算机上的特定进程。

2.1 字节序

在同一台计算机上进程间通信时,一般无需考虑字节序。

TCP/IP协议栈使用大端字节序。有关字节序大家可自行百度。

Linux系统是小端字节序。

2.2 地址格式

地址确定了特定通信域中的套接字端点,地址格式与特定的通信域相关。为使不同格式的地址能够被传入到套接字函数,地址被强转换成通用的地址结构sockaddr表示。

Linux中,sockaddr_in定义如下;

struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; };

其中成员sin_zero为填充字段,必须全部置0. 所以在网上搜到的例子有使用bzero.

我目前使用的ubuntu定义如下:

/ Structure describing an Internet socket address. / struct sockaddr_in { __SOCKADDRCOMMON (sin); in_port_t sin_port; / Port number. / struct in_addr sin_addr; / Internet address. /

/* Pad to size of `struct sockaddr'.  */    unsigned char sin_zero[sizeof (struct sockaddr) -               __SOCKADDR_COMMON_SIZE -               sizeof (in_port_t) -               sizeof (struct in_addr)];  };

还有很多关于地址查询的函数,这里就不一一列举了。

3. 将套接字与地址绑定

使用bind函数将地址绑定到一个套接字上。

include

int bind(int  sockfd, const struct sockaddr * addr, socklen_t  len);返回值:成功返回0,出错返回-1

参数socklen_t使用sizeof来计算就好了。

对于使用地址的一些限制:

端口号不能小于1024,除非该进程具有相应的特权(即为超级用户)。可见规则总是因人而异,计算机也是如此~

对于因特网域,如果指定IP地址为ADDR_ANY,套接字端点可以被绑定到所有的系统网络接口。

注意: linux的man命令可以查看api的详细说明,而且还有例子,也挺不错的。

4. 建立连接

1> connect

如果处理的是面向连接的网络服务(SOCK_STREAM或SOCK_SEQPACKET),在开始交换数据前,需要在请求服务的进程套接字(客户端)和提供服务的进程套接字(服务器)之间建立一个连接。使用connect.

include

int connect(int  sockfd, const struct sockaddr  *addr,  socklen_t  len);返回值:成功返回0,出错返回-1

诶,这个参数好熟悉呀,和bind函数的参数一模一样呀~

当client连接server时,由于一些原因,连接可能会失败。可以使用指数补偿的算法解决,了解一下即可。

2> listen

server调用listen来宣告可以接受连接请求:

include

Int listen(int  sockfd, int  backlog);返回值:成功返回0,出错返回-1

参数backlog提供了一个提示,用于表示该进程所要入队的连接请求数量。其值由系统决定,但上限由中SOMAXCONN指定。

一旦队列满,系统会拒绝多余的连接请求。

3> accept

一旦服务器调用了listen,套接字就能接收连接请求。使用函数accept获得连接请求并建立连接。

include

Int accept(int sockfd,  struct sockaddr *restrict  addr, socklen_t *restrict  len);返回值:成功返回文件(套接字)描述符,出错返回-1

函数accept所返回的文件描述符是套接字描述符,该描述符连接到调用connect的客户端。这个新的套接字描述符和原始套接字(sockfd)具有相同的套接字类型和地址族。传给accept的原始套接字没有关联到这个连接,而是继续保持可用状态并接受其他连接请求。

如果不关心客户端标识,可以将addr和len设置为NULL,否则addr存放的是连接的客户端的地址。

如果没有连接请求等待处理,accept会阻塞直到有请求到来。另外server可以使用poll或select来等待一个请求的到来。

5. 数据传输

既然将套接字端点表示为文件描述符,那么只要建立连接,就可以使用read和write来通过套接字通信。read和write函数我几乎不用,了解一下即可。

1> send

include

Int send(int sockfd,  const void *buf,  size_t  nbytes,  int  flags);返回值:成功返回发送的字节数,出错返回-1

注意:如果send成功返回,并不一定并表示连接的另一端的进程接收数据。可以保证的是数据已经无误的发送到网络上。

标志我一直用的是0

2> recv

include

int recv(int sockfd,  const void *buf,  size_t  nbytes,  int  flags);返回值:以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,         出错返回-1

仍然一直是0

如果想定位发送者,可以使用recvfrom来得到数据发送者的源地址。

3> recvfrom

include

int recv(int sockfd,  void *restrict buf, size_t len, int flag, struct sockaddr *restrict  addr, socklen_t *restrict  len);返回值:以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,         出错返回-1

因为可以获得发送者的地址,recvfrom通常用于无连接套接字。否则,recvfrom等同于recv。

读到这里,这篇"Linux C Socket Api是什么"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

套接字 地址 通信 进程 文件 类型 参数 字节 成功 函数 数据 计算机 服务 网络 格式 消息 系统 客户 端点 发送者 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 江苏根荣互联网科技 金融科技还是互联网 杭州互联网科技公司 广州宏创互联网科技 互联网科技缩写 上游互联网科技 深圳期待互联网科技 互联网科技视频素材 互联网实体化科技化 中国互联网有什么科技含量 成都互联网科技公司100强 华夏互联网科技业 互联网科技大奖都有哪些公司 乌鲁木齐新华智原互联网科技学校 上海互联网科技公司ppt 有人说阿里系是互联网科技企业 福州德业互联网科技 中国科技和美国互联网 福仕德教育科技互联网 米泉互联网科技专业怎么样 湖北九亚互联网络科技有限公司 为想互联网科技怎么样 互联网科技公司名称 安控科技rtu产品工业互联网 乌苏新华互联网科技做什么的 佛山市翊博互联网络科技有限公司 每天都有哪些好的互联网科技 35岁以上互联网科技行业 济南小医互联网科技有限公司招聘 昆明中奇联合互联网科技
0