这两个函数是最通用的I/O函数。实际上我们把所有read、readv、recv和recvfrom调用替换成recvmsg调用。类似地,各种输出函数调用也可以替换成sendmsg调用 

#include <sys/socket.h>
ssize_t  recvmsg(int sockfd,struct msghdr *msg,int flags);
ssize_t  sendmsg(int sockfd,stuct msghdr *msg,int flags);

  这两个函数把大部分参数封装到一个msghdr结构中:

struct msghdr{void                *msg_name;        /*protocol address*/socklen_t         msg_namelen;    /*size of protocol address*/struct     iovec  *msg_iov;          /*scatter/gather array*/int                    msg_iovlen;        /*#elements in msg_iov*/void                  *msg_control;    /*ancillary data (cmsghdr struct)*/socklen_t         msg_controllen;  /*length of ancillary data */int                    msg_flags;          /*flags returned by recvmsg()*/

  msg_name和msg_namelen这两个成员用于套接字未连接的场合。他们类似于recvfrom和sendto的第五个和第六个参数:msg_name指向一个套接字地址结构,调用者在其中存放接收者(对于sendmsg调用)或发送者(对于recvmsg调用)的协议地址。如果无需指明协议地址,msg_name应置为空指针。msg_namelen对于sendmsg是一个值参数,对于recvmsg却是一个值-结果参数。

  msg_iov和msg_iovlen这两个指定输入或输出缓冲区数组(即iovec结构数组),类似readv和writev的第二个和第三个参数。msg_control和msg_controllen这两个成员指定可选的辅助数据的位置和大小。msg_controllen对于recvmsg是一个值-结果参数。

  对于recvmsg和sendmsg,我们必须区别他们的两个标志变量,一个是传递值的flags参数,另一个是所传递msghdr结构的msg_flags成员,它传递的是引用,因为传递函数的是该结构的地址。

  • 只用recvmsg使用msg_flags成员。recvmsg被调用时,flags参数被复制到msg_flags成员,并由内核使用其值驱动接收处理过程。内核还依据recvmsg的结果更新msg_flags成员的值。
  • sendmsg则忽略msg_flags成员,因为它直接使用flags参数驱动发送处理过程。这一点意味着如果想在某个sendmsg调用中设置MSG_DONTWAIT标志,那就把flags参数设置为该值,把msg_flags成员设置为该值不起作用。

  

转载于:https://www.cnblogs.com/awy-blog/p/3202810.html

recvmsg和sendmsg函数相关推荐

  1. 网络编程学习笔记(recvmsg和sendmsg函数)

    这两个函数是最通用的I/O函数.实际上,可以用recvmsg代替read.readv.recv和redvfrom.同样,各种输出函数都可以用sendmsg取代 #include<sys/sock ...

  2. Socket API: setsockopt(), recvmsg(), sendmsg()函数

    https://man.cx/ip(7)/zh_CN LinuxC下获取UDP包中的路由目的IP地址和头标识目的地址 在接收到UDP包后,有时候我们需要根据所接收到得UDP包,获取它的路由目的IP地址 ...

  3. Socket API: I/O函数recvmsg()与sendmsg()

    转自: https://memorymyann.iteye.com/blog/648513 作者: memorymyann 以下为正文 17.I/O函数recvmsg与sendmsg 博客分类: 网络 ...

  4. sendmsg recvmsg函数

    sendmsg(2)与recvmsg(2)函数 这些函数为程序提供了一些其他的套接口I/O接口所不具备的高级特性.下面的内容我们将会先来看一下sendmsg来介绍这些主题.然后将会完整的介绍recvm ...

  5. UNP学习 高级I/O函数

    首先为一个I/O函数设置超时,这有三种方法.然后是三个read和write函数的变体: recv和send,他们可以把含有标志的第四个参数从进程传给内核: readv和writev这两个函数可以指定一 ...

  6. Linux I/O函数

    pipe函数 pipe函数可用于创建一个管道,以实现进程间通信. #include<unistd.h>/* Create a one-way communication channel ( ...

  7. LinuxC下获取UDP包中的路由目的IP地址和头标识目的地址

    在接受到UDP包后,有时候我们需要根据所接收到得UDP包,获取它的路由目的IP地址和头标识目的地址. (一)主要的步骤: 在setsockopt中设置IP_PKTINFO,然后通过recvmsg来获取 ...

  8. Linux kernel crypto的介绍

    目录 1.linux kernel crypto的软件框图 2.sendmsg/recvmsg如何调用到底层encrypt/decrypt 3.算法的底层实现(以为aes/hash为例) 1.linu ...

  9. Linux内核 crypto文件夹 密码学知识学习

    密码算法分类 对称算法 非对称算法 消息摘要(单向哈希)算法 这些算法作为加密函数框架的最底层,提供加密和解密的实际操作.这些函数可以在内核crypto文件夹下,相应的文件中找到.不过内核模块不能直接 ...

  10. UNP学习笔记3——基本UDP套接字编程

    1 概述 TCP和UDP网络编程存在一些本质的差异,主要是由于传输层的差别:UDP是无连接的不可靠的数据报协议,而TCP是面向连接的字节流协议. 下图是典型的UDP客户端和服务器之间的通信流程.客户不 ...

最新文章

  1. java 获取页面元素的位置_Selenium Java 页面元素定位2
  2. java.lang.Long cannot be cast to java.lang.Integer解决办法
  3. 天翼云从业认证课后习题(3.1天翼云计算产品)
  4. 关于Windows Unicode 编码的问题
  5. 预测分析算法的设计与实现_基于LD(编辑距离算法)的单词速记数据库分析设计与实现...
  6. python标准库math用法精要
  7. openSearch支持mysql版本_OpenSearch 使用二三事-阿里云开发者社区
  8. 线程的四种实现方式,一些方法及线程的同步
  9. python 构造http请求对象-Request对象
  10. java下载m3u8视频,解密并合并ts(一)
  11. 0708-/etc/login.defs
  12. 如何阻止手机虚拟键盘弹起
  13. swift实现python中的spicy.signal.find_peaks
  14. Unity出IOS包报错记 -1
  15. Android手机适配,手机尺寸、px、dpi、dp、sp详解
  16. HowTo如何制作一个文字冒险游戏-里篇(1)
  17. css过渡和css动画的区别是什么?
  18. 爬虫—有道翻译案例(史上最详细分析教程)
  19. 我是怎么提升写作能力的
  20. linux查看是什么系统

热门文章

  1. kafka 安装步骤
  2. CentOS6.5 linux 逻辑卷管理 调整分区大小
  3. [SDK]新浪微博请求授权显示错误页面的解决方法
  4. 学习MVC3(二)——创建自己的第一个网页:实现用户登陆(1)
  5. 项目实战中的防御性编程
  6. Luogu4366[CodePlus#4] 最短路
  7. nvidia显示设置不可用_白送大福利?实战FreeSync显示器开启NVIDIA G-Sync Compatible
  8. pl/mysql安装_PL/SQL环境安装设置
  9. 项目管理实践_8Manage:保险行业的项目管理实践
  10. pdo怎么建mysql表_PDO操作数据库的基本步骤