recvmsg和sendmsg函数
这两个函数是最通用的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函数相关推荐
- 网络编程学习笔记(recvmsg和sendmsg函数)
这两个函数是最通用的I/O函数.实际上,可以用recvmsg代替read.readv.recv和redvfrom.同样,各种输出函数都可以用sendmsg取代 #include<sys/sock ...
- Socket API: setsockopt(), recvmsg(), sendmsg()函数
https://man.cx/ip(7)/zh_CN LinuxC下获取UDP包中的路由目的IP地址和头标识目的地址 在接收到UDP包后,有时候我们需要根据所接收到得UDP包,获取它的路由目的IP地址 ...
- Socket API: I/O函数recvmsg()与sendmsg()
转自: https://memorymyann.iteye.com/blog/648513 作者: memorymyann 以下为正文 17.I/O函数recvmsg与sendmsg 博客分类: 网络 ...
- sendmsg recvmsg函数
sendmsg(2)与recvmsg(2)函数 这些函数为程序提供了一些其他的套接口I/O接口所不具备的高级特性.下面的内容我们将会先来看一下sendmsg来介绍这些主题.然后将会完整的介绍recvm ...
- UNP学习 高级I/O函数
首先为一个I/O函数设置超时,这有三种方法.然后是三个read和write函数的变体: recv和send,他们可以把含有标志的第四个参数从进程传给内核: readv和writev这两个函数可以指定一 ...
- Linux I/O函数
pipe函数 pipe函数可用于创建一个管道,以实现进程间通信. #include<unistd.h>/* Create a one-way communication channel ( ...
- LinuxC下获取UDP包中的路由目的IP地址和头标识目的地址
在接受到UDP包后,有时候我们需要根据所接收到得UDP包,获取它的路由目的IP地址和头标识目的地址. (一)主要的步骤: 在setsockopt中设置IP_PKTINFO,然后通过recvmsg来获取 ...
- Linux kernel crypto的介绍
目录 1.linux kernel crypto的软件框图 2.sendmsg/recvmsg如何调用到底层encrypt/decrypt 3.算法的底层实现(以为aes/hash为例) 1.linu ...
- Linux内核 crypto文件夹 密码学知识学习
密码算法分类 对称算法 非对称算法 消息摘要(单向哈希)算法 这些算法作为加密函数框架的最底层,提供加密和解密的实际操作.这些函数可以在内核crypto文件夹下,相应的文件中找到.不过内核模块不能直接 ...
- UNP学习笔记3——基本UDP套接字编程
1 概述 TCP和UDP网络编程存在一些本质的差异,主要是由于传输层的差别:UDP是无连接的不可靠的数据报协议,而TCP是面向连接的字节流协议. 下图是典型的UDP客户端和服务器之间的通信流程.客户不 ...
最新文章
- java 获取页面元素的位置_Selenium Java 页面元素定位2
- java.lang.Long cannot be cast to java.lang.Integer解决办法
- 天翼云从业认证课后习题(3.1天翼云计算产品)
- 关于Windows Unicode 编码的问题
- 预测分析算法的设计与实现_基于LD(编辑距离算法)的单词速记数据库分析设计与实现...
- python标准库math用法精要
- openSearch支持mysql版本_OpenSearch 使用二三事-阿里云开发者社区
- 线程的四种实现方式,一些方法及线程的同步
- python 构造http请求对象-Request对象
- java下载m3u8视频,解密并合并ts(一)
- 0708-/etc/login.defs
- 如何阻止手机虚拟键盘弹起
- swift实现python中的spicy.signal.find_peaks
- Unity出IOS包报错记 -1
- Android手机适配,手机尺寸、px、dpi、dp、sp详解
- HowTo如何制作一个文字冒险游戏-里篇(1)
- css过渡和css动画的区别是什么?
- 爬虫—有道翻译案例(史上最详细分析教程)
- 我是怎么提升写作能力的
- linux查看是什么系统
热门文章
- kafka 安装步骤
- CentOS6.5 linux 逻辑卷管理 调整分区大小
- [SDK]新浪微博请求授权显示错误页面的解决方法
- 学习MVC3(二)——创建自己的第一个网页:实现用户登陆(1)
- 项目实战中的防御性编程
- Luogu4366[CodePlus#4] 最短路
- nvidia显示设置不可用_白送大福利?实战FreeSync显示器开启NVIDIA G-Sync Compatible
- pl/mysql安装_PL/SQL环境安装设置
- 项目管理实践_8Manage:保险行业的项目管理实践
- pdo怎么建mysql表_PDO操作数据库的基本步骤