高级套接口-(sendmsg和recvmsg)

本文介绍了高级套接字接口sendmsg和recvmsg的使用,这两个接口支持多缓冲区报文发送和接收,以及携带辅助数据。通过示例展示了如何在服务器端接收客户端发送的描述符,并利用发送的描述符进行文件操作。
摘要由CSDN通过智能技术生成

已经工作了接近一年的时间,工作之余也只能看看书,了解一下相关的技术细节,在网络设备公司不可避免的要和socket打交道,但通常都是调用公司封装好的接口,没有去考虑这些封装背后的工作,回过头来看真的觉得进步很小,我只能逼自己看看书,看看一些好的代码。

sendmsg和recvmsg这两个接口是高级套接口,这两个接口支持一般数据的发送和接收,还支持多缓冲区的报文发送和接收(readv和sendv支持多缓冲区发送和接收),还可以在报文中带辅助数据。这些功能是常用的send、recv等接口无法完成的。
接口的声明如下:

点击(此处)折叠或打开

  1. #include <sys/socket.h>

  2. ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
  3. ssize_t sendmsg(int sockfd, struct msghdr *msg, int flags);
上述接口的参数分别是套接字描述符,消息的头部,已经对应的标识,这些标识主要用于对该套接口进行设置,如:MSG_DONTWAI(将本操作设置为非阻塞模式),MSG_OOB(发送或接受带外数据)等。
在该接口的声明中包含了在其他发送接收函数中不用使用的接口体struct msghdr,该结构体是一个消息的头部结构体。

点击(此处)折叠或打开

  1. struct msghdr {
  2.     void *msg_name; /* 消息的协议地址 */
  3.     socklen_t msg_namelen; /* 地址的长度 */
  4.     struct iovec *msg_iov; /* 多io缓冲区的地址 */
  5.     int msg_iovlen; /* 缓冲区的个数 */
  6.     void *msg_control; /* 辅助数据的地址 */
  7.     socklen_t msg_controllen; /* 辅助数据的长度 */
  8.     int msg_flags; /* 接收消息的标识 */
  9. };
其中的前两个成员主要用于保存当前使用的协议的地址,比如使用了tcp协议、udp协议、UNIX domain协议等,每种地址都存在一定的差异,比如unix domain的地址就是(AF_UNIX, file_path)。这样就使得该接口更加的通用,针对各种类型的协议都是有效的。

接下来的两个成员是关于接受和发送数据的的。其中的strcut iovec是io向量,如下所示:

点击(此处)折叠或打开

  1. struct iovec {
  2.     void *io_base; /* buffer空间的基地址 */
  3.     size_t iov_len; /* 该buffer空间的长度 */
  4. };
多缓冲区的发送和接收处理就是一个struct iovec的数组,每个成员的io_base都指向了不同的buffer的地址。io_len是指该buffer中的数据长度。而在struct msghdr中的msg_iovlen是指buffer缓冲区的个数,即iovec数组的长度。

msg_control字段的也是指向一段内存,msg_controllen是指该内存的总大小长度,通常该内存被用来存储辅助数据,辅助数据可用于一些特殊的处理。msg_control通常指向一个控制消息头部,其结构体如下所示:

点击(此处)折叠或打开

  1. struct cmsghdr {
  2.     socklen_t cmsg_len; /* 包含该头部的数据长度 */
  3.     
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值