sendmsg(2)与recvmsg(2)函数
这些函数为程序提供了一些其他的套接口I/O接口所不具备的高级特性。下面的内容我们将会先来看一下sendmsg来介绍这些主题。然后将会完整的介绍recvmsg函数,因为他们的函数接口是相似的。接下来,将会描述msghdr的完整结构。
sendmsg(2)函数
现在是时候进入这个大同盟了。从概念上说,sendmsg函数是所有写入函数的基础,而他是从属于套接口的。下面的列表以复杂增加的顺序列出了所有与入函数。在每一个层次上,同时列出了所增加的特性。
函数        增加的特性
write        最简单的套接口写入函数
send        增加了flags标记
sendto        增加了套接口地址与套接口长度参数
writev        没有标记与套接口地址,但是具有分散写入的能力
sendmsg        增加标记,套接口地址与长度,分散写入以及附属数据的能力
sendmsg(2)函数原型如下:
#include 
#include 
int sendmsg(int s, const struct msghdr *msg, unsigned int flags);
函数参数描述如下:
要在其上发送消息的套接口s
信息头结构指针msg,这会控制函数调用的功能
可选的标记位参数flags。这与send或是sendto函数调用的标记参数相同。
函数的返回值为实际发送的字节数。否则,返回-1表明发生了错误,而errno表明错误原因。
recvmsg(2)函数
recvmsg是与sendmsg函数相对的函数。这个函数原型如下:
#include 
#include 
int recvmsg(int s, struct msghdr *msg, unsigned int flags);
函数参数如下:
要在其上接收信息的套接口s
信息头结构指针msg,这会控制函数调用的操作。
可选标记位参数flags。这与recv或是recvfrom函数调用的标记参数相同。
这个函数的返回值为实际接收的字节数。否则,返回-1表明发生了错误,而errno表明错误原因。
理解struct msghdr
当我第一次看到他时,他看上去似乎是一个需要创建的巨大的结构。但是不要怕。其结构定义如下:
struct msghdr {
    void         *msg_name;
    socklen_t    msg_namelen;
    struct iovec *msg_iov;
    size_t       msg_iovlen;
    void         *msg_control;
    size_t       msg_controllen;
    int          msg_flags;
};
结构成员可以分为四组。他们是:
套接口地址成员msg_name与msg_namelen。
I/O向量引用msg_iov与msg_iovlen。
附属数据缓冲区成员msg_control与msg_controllen。
接收信息标记位msg_flags。
在我们将这个结构分为上面的几类以后,结构看起来就不那样巨大了。
成员msg_name与msg_namelen
这些成员只有当我们的套接口是一个数据报套接口时才需要。msg_name成员指向我们要发送或是接收信息的套接口地址。成员msg_namelen指明了这个套接口地址的长度。
当调用recvmsg时,msg_name会指向一个将要接收的地址的接收区域。当调用sendmsg时,这会指向一个数据报将要发送到的目的地址。
注意,msg_name定义为一个(void *)数据类型。我们并不需要将我们的套接口地址转换为(struct sockaddr *)。
成员msg_iov与msg_iovlen
这些成员指定了我们的I/O向量数组的位置以及他包含多少项。msg_iov成员指向一个struct iovec数组。我们将会回忆起I/O向量指向我们的缓冲区。成员msg_iov指明了在我们的I/O向量数组中有多少元素。
成员msg_control与msg_controllen
这些成员指向了我们附属数据缓冲区并且表明了缓冲区大小。msg_control指向附属数据缓冲区,而msg_controllen指明了缓冲区大小。
成员msg_flags
当使用recvmsg时,这个成员用于接收特定的标记位(他并不用于sendmsg)。在这个位置可以接收的标记位如下表所示:
标记位        描述
MSG_EOR        当接收到记录结尾时会设置这一位。这通常对于SOCK_SEQPACKET套接口类型十分有用。
MSG_TRUNC    这个标记位表明数据的结尾被截短,因为接收缓冲区太小不足以接收全部的数据。
MSG_CTRUNC    这个标记位表明某些控制数据(附属数据)被截短,因为缓冲区太小。
MSG_OOB        这个标记位表明接收了带外数据。
MSG_ERRQUEUE    这个标记位表明没有接收到数据,但是返回一个扩展错误。
我们可以在recvmsg(2)与sendmsg(2)的man手册页中查看更多的信息。
附属数据结构与宏
recvmsg与sendmsg函数允许程序发送或是接收附属数据。然而,这些额外的信息受限于一定的格式规则。这一节将会介绍控制信息头与程序将会用来管理这些信息的宏。

sendmsg recvmsg函数相关推荐

  1. Linux系统调用-- recv/recvfrom/recvmsg函数详解(转)

    Linux系统调用-- recv/recvfrom/recvmsg函数详解 2007-09-10 23:37 [recv/recvfrom/recvmsg系统调用]   功能描述: 从套接字上接收一个 ...

  2. 进程间传递文件描述符--sendmsg,recvmsg(可用)

    UNIX域套接字可以在同一台主机上各进程之间传递文件描述符. 下面先来看两个函数: #include <sys/types.h> #include <sys/socket.h> ...

  3. recv、recvfrom、recvmsg函数

    转载地址:https://blog.csdn.net/jiahehao/article/details/8858131 1. recv #include <sys/socket.h> ss ...

  4. Linux内核分析:recv、recvfrom、recvmsg函数实现

    先看一下这三个函数的声明: 1 #include <sys/types.h> 2 #include <sys/socket.h> 3 ssize_t recv(int sock ...

  5. C语言 recv()函数、recvfrom()函数、recvmsg()函数

    文章目录 man man RECV(2) Linux Programmer's Manual RECV(2)NAMErecv, recvfrom, recvmsg - receive a messag ...

  6. Linux Socket编程

    IP socket 是在其上建立高级Internet 协议的最低级的层:从HTTP到SSL到POP3到Kerberos再到UDP-Time,每种Internet协议都建立在它的基础上.为了实现自定义的 ...

  7. Linux高级进程编程———在任意两个进程间传递文件描述符:使用 sendmsg 和 recvmsg 实现

    进程间传递打开的文件描述符,并不是传递文件描述符的值.那么在传递时究竟传递了什么?我们要先搞明白这个问题. 1.文件描述符 文件描述符的值与文件没有任何联系,只是该文件在进程中的一个标识,所以同一文件 ...

  8. c语言 recv_sin,C++_C语言中经socket接收数据的相关函数详解,recv()函数: 头文件:#incl - phpStudy...

    C语言中经socket接收数据的相关函数详解 recv()函数:头文件: #include #include 定义函数: int recv(int s, void *buf, int len, uns ...

  9. socketpair函数用法

    Unix套接字好像是套接字和管道的混合,socketpair()可以创建一对无命名的.相互连接的Unix域套接字. 管道历史上,它们是半双工的(数据只能在一个方向上流动),但是现在也有全双工管道.管道 ...

最新文章

  1. systemd 对你的进程数限制横插一脚啦
  2. Kotlin一大特色之空安全
  3. java feature get_Java ShapeFeature.getLocations方法代码示例
  4. Google和Baidu常用的搜索技巧--转
  5. 时隔两周,我给阎王设计的地府CRM终于做完了
  6. Git之深入解析如何运行自己的Git仓库托管服务器
  7. ZOJ - 2972 Hurdles of 110m(记忆化搜索/动态规划)
  8. 20分钟打造你的Bootstrap站点
  9. 安卓第一行代码第3版pdf_SPECFEM2D用户手册——第3章 网格生成——3.1 如何使用SPECFEM2D...
  10. button执行onclick函数_JavaScript 函数定义与调用
  11. java 根据ftl文件生成word
  12. 图表背后的秘密 | 技术指标讲解:唐奇安通道
  13. APP支付宝登录第三方授权如何签约入口在哪里
  14. 初探MUI制作微信APP页面(二)
  15. iOS 玩不转的GCD第0课时
  16. Thinkbook14G2ITL笔记本重装系统遇到的问题?
  17. 老旧小区为什么要进行安防升级改造
  18. video.js 视频截图、录制、自定义全屏,hls、flv、mp4视频播放
  19. java微信红包开发_Java实现微信发红包
  20. 这 10 种 MySQL 经典错误案例,99% 的程序员一定遇到过!你呢?

热门文章

  1. dataframe常用处理
  2. 使用Picasso实现图片圆角和图片圆形
  3. 在.NET Core中三种实现“可插拔”AOP编程方式(附源码)
  4. 未能使用“Csc”任务的输入参数初始化该任务
  5. 第一阶段站立会议05
  6. python 学习 [day6]
  7. 第十一回:琴房外度曲生慕意 书店里软语救阿四[林大帅作品集]
  8. MySoft组件之MySoft.Data更新日志
  9. 当对项目强名时自动构建失败(TeamFoudationServer试用笔记)
  10. imf瞬时频率跳变问题