网络编程学习笔记(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 address
   socklen_t msg_namelen; //sizeof protocol address
   struct iovec *msg_iov;  //scatter /gather array
   size_t msg_iovlen; //elements in msg_iov
   void *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为该值无效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值