这两个函数是最通用的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函数)相关推荐

  1. 网络编程学习笔记(recv和send函数)

    与read和write函数相似,只是多了一个附加的参数,其函数原型为: #include <sys/socket.h> ssize_t recv(int sockfd, void *buf ...

  2. 网络编程学习笔记(getservbyname和getservbyport函数)

    通过服务器的名字而不是服务器端口号来认知它,而且如果从主机到端口号的映射包含在一个文件中(一般是/etc/services),则如果端口号改变,我们所需做的所有改动就是改动文件/etc/service ...

  3. 网络编程学习笔记(readv和writev函数)

    这两个函数与read和write相似,但readv和writev可以让我们在一个函数调用中读取多个缓冲区,这些操作被称为分散读和集中写.其函数原型为: #include <sys/uio.h&g ...

  4. 网络编程学习笔记(UDP的connect函数)

    对于已连接的UDP套接口,发生了三个变化: 1.再也不能给输出操作指定目的IP地址和端口,也就是说,不能再调用 sendto,而使用send或者write.写到已连接UDP套接口上的任何东西都自动发送 ...

  5. 网络编程学习笔记(recvfrom和sendto函数)

    其原型为: #include <sys/socket.h>ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags ...

  6. 网络编程学习笔记(getsockopt和setsockopt函数)

    其原型为: #include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void *optval, ...

  7. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

  8. [Linux网络编程学习笔记]索引

    一.Linux基本知识 [学习笔记]Linux平台的文件I/O操作 [学习笔记]Linux平台的文件,目录及操作 [Linux学习笔记]标准输入输出 [Linux学习笔记]进程概念及控制 [Linux ...

  9. 编程开发:Linux网络编程学习笔记

    非常全面.通俗易懂.值得借鉴的Linux网络编程学习笔记.关键字:linux linux编程 网络编程 linux网络编程 下载地址:点我下载 特别说明:本资源收集于网络,版权归原作者及版权商所有,仅 ...

最新文章

  1. 都在建议,不要直接使用 @Async 注解,为什么?
  2. C++获取文件名、不带后缀的名字、后缀名
  3. 使用SSL和Spring Security保护Tomcat应用程序的安全
  4. 用excel制作双层饼图_双层饼图,让你的工作更出彩
  5. php 5.5.38 ldap安装,centos5.5系统下面,lnmp环境下面php加载ldap扩展
  6. easyui中onchange事件_React中类似Vue的“模板语法”
  7. transform再次理解
  8. java判断两个时间区间是否有重合
  9. 系统时钟(汇编语言程序设计)
  10. SQLite升级数据库:
  11. java day42【综合练习】
  12. 百度离线地图——瓦片地图下载
  13. 如何批量保存网页照片
  14. 博士申请 | 美国佛罗里达州立大学王广老师招收人工智能全奖博士生
  15. repo sync error.GitError: manifests rev-list : fatal: revision walk setup failed
  16. 超市服务器操作系统,超市收银系统 服务器 配置
  17. YOLOv7 训练前手动计算锚定框
  18. 1.4_26 Axure RP 9 for mac 高保真原型图 - 案例25【中继器 - 后台管理系统3】优化- 3D按钮、键盘操作
  19. 真正靠谱的手机清理APP与方法,轻松帮你干掉几个G垃圾!
  20. Google Authenticator windows client 谷歌身份验证器 windows 电脑端

热门文章

  1. maven no Maven Dependencies view
  2. Webcast.NET Remoting学习笔记(5)使用配置文件
  3. 以python入门教程新世界-50⾏python爬⾍代码, 带你正确打开知乎新世界!
  4. 一个python程序员需要掌握的知识-Python基础知识,初学者的你掌握了吗?
  5. python手机软件-Python爬虫:抓取手机APP的数据
  6. python简单代码hello-树莓派完成简单的编程(四)
  7. 学python需要什么文化基础-数据分析需要掌握那些基础知识?
  8. python有哪些作用-你都用Python来做什么,它对你来说有什么作用?
  9. 学python的好处-学习python有什么好处?python强大之处在哪?
  10. 自学python需要多长时间-自学Python需要多长时间?