网络编程学习笔记(recvmsg和sendmsg函数)
这两个函数是最通用的I/O函数。实际上,可以用recvmsg代替read、readv、recv和redvfrom。同样,各种输出函数都可以用sendmsg取代
#include<sys/socket.h>
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
ssize_t sendmsg(int sockfd, struct msghdr *msg, int flags);
成功返回读入或写出的字节数,出错时返回-1
这两个函数把大部分参数包装到一个msghdr结构中:
struct msghdr
{void *msg_name; //protocol addresssocklen_t msg_namelen; //sizeof protocol addressstruct iovec *msg_iov; //scatter /gather arraysize_t msg_iovlen; //elements in msg_iovvoid *msg_control; socklen_t msg_controllen;int msg_flags; //flags returned by recvmsg()
};
re
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_controlllen对recvmsg是一个值-结果参数
使用recvmsg和sendmsg时我们必须区别两个标志变量:传值的flags参数和msghdr结构中的msg_flags成员,它是以引用方式传递的
(1)msg_flags只用于recvmsg。调用recvmsg时,flags参数拷贝到msg_flags成员,而且内核用这个值进行接收处理,接着它的值会根据recvmsg的结果而更新
(2)sendmsg会忽略msg_flags成员,因为它在进行输出处理进使用flags参数。这意味着如果我们在调用 sendmsg时要设置MSG_DONTWAIT标志,应将flags设成该值,设置msg_flags为该值无效。
网络编程学习笔记(recvmsg和sendmsg函数)相关推荐
- 网络编程学习笔记(recv和send函数)
与read和write函数相似,只是多了一个附加的参数,其函数原型为: #include <sys/socket.h> ssize_t recv(int sockfd, void *buf ...
- 网络编程学习笔记(getservbyname和getservbyport函数)
通过服务器的名字而不是服务器端口号来认知它,而且如果从主机到端口号的映射包含在一个文件中(一般是/etc/services),则如果端口号改变,我们所需做的所有改动就是改动文件/etc/service ...
- 网络编程学习笔记(readv和writev函数)
这两个函数与read和write相似,但readv和writev可以让我们在一个函数调用中读取多个缓冲区,这些操作被称为分散读和集中写.其函数原型为: #include <sys/uio.h&g ...
- 网络编程学习笔记(UDP的connect函数)
对于已连接的UDP套接口,发生了三个变化: 1.再也不能给输出操作指定目的IP地址和端口,也就是说,不能再调用 sendto,而使用send或者write.写到已连接UDP套接口上的任何东西都自动发送 ...
- 网络编程学习笔记(recvfrom和sendto函数)
其原型为: #include <sys/socket.h>ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags ...
- 网络编程学习笔记(getsockopt和setsockopt函数)
其原型为: #include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void *optval, ...
- java 网络编程学习笔记
java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...
- [Linux网络编程学习笔记]索引
一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...
- 编程开发:Linux网络编程学习笔记
非常全面.通俗易懂.值得借鉴的Linux网络编程学习笔记.关键字:linux linux编程 网络编程 linux网络编程 下载地址:点我下载 特别说明:本资源收集于网络,版权归原作者及版权商所有,仅 ...
最新文章
- 都在建议,不要直接使用 @Async 注解,为什么?
- C++获取文件名、不带后缀的名字、后缀名
- 使用SSL和Spring Security保护Tomcat应用程序的安全
- 用excel制作双层饼图_双层饼图,让你的工作更出彩
- php 5.5.38 ldap安装,centos5.5系统下面,lnmp环境下面php加载ldap扩展
- easyui中onchange事件_React中类似Vue的“模板语法”
- transform再次理解
- java判断两个时间区间是否有重合
- 系统时钟(汇编语言程序设计)
- SQLite升级数据库:
- java day42【综合练习】
- 百度离线地图——瓦片地图下载
- 如何批量保存网页照片
- 博士申请 | 美国佛罗里达州立大学王广老师招收人工智能全奖博士生
- repo sync error.GitError: manifests rev-list : fatal: revision walk setup failed
- 超市服务器操作系统,超市收银系统 服务器 配置
- YOLOv7 训练前手动计算锚定框
- 1.4_26 Axure RP 9 for mac 高保真原型图 - 案例25【中继器 - 后台管理系统3】优化- 3D按钮、键盘操作
- 真正靠谱的手机清理APP与方法,轻松帮你干掉几个G垃圾!
- Google Authenticator windows client 谷歌身份验证器 windows 电脑端
热门文章
- maven no Maven Dependencies view
- Webcast.NET Remoting学习笔记(5)使用配置文件
- 以python入门教程新世界-50⾏python爬⾍代码, 带你正确打开知乎新世界!
- 一个python程序员需要掌握的知识-Python基础知识,初学者的你掌握了吗?
- python手机软件-Python爬虫:抓取手机APP的数据
- python简单代码hello-树莓派完成简单的编程(四)
- 学python需要什么文化基础-数据分析需要掌握那些基础知识?
- python有哪些作用-你都用Python来做什么,它对你来说有什么作用?
- 学python的好处-学习python有什么好处?python强大之处在哪?
- 自学python需要多长时间-自学Python需要多长时间?