通用数据读写

通用数据读写函数

1
2
3
4
5
#include <sys/socket.h>

ssize_t recvmsg(int sockfd, struct msghdr * msg, int flags);

ssize_t sendmsg(int sockfd, struct msghdr * msg, int flags);

函数参数介绍

sockfd参数

sockfd参数指定被操作的目标socket。

msg参数

msg参数是msghdr结构体类型的指针,该结构体定义如下:

1
2
3
4
5
6
7
8
9
10
struct msghdr
{
void * msg_name; //socket地址
socklen_t msg_namelen; //socket地址长度
struct iovec * msg_iov; //分散内存块
int msg_iovlen; //分散内存块的长度
void * msg_control; //指向辅助数据的起始位置
socklen_t msg_controllen; //辅助数据的大小
int msg_flags; //复制函数中的flags参数,并在调用过程中更新
}

msg_name成员指向一个socket地址结构变量。它指定通信对方的socket地址。对于面向连接的TCP协议,该字段无意义,必须设置为NULL。msg_namelen成员指定了msg_name的长度。

msg_iov成员是iovec结构体类型的指针,iovec结构体定义如下:

1
2
3
4
5
struct iovec
{
void * iov_base; //内存起始地址
size_t iov_len; //这块内存的长度
}

由上结构可知,iovec结构体封装了一块内存的起始位置和长度。msg_iovlen指定这样的iovec结构对象有多少个。对于recvmsg而言,数据将被读取并存放在msg_iovlen块分散的内存中;称为分散读。而且对于sendmsg而言,msg_iovlen块分散内存中的数据将被一并发送,这被称为集中写。

msg_control和msg_controllen成员用于辅助数据的传送。msg_flags成员无需设定,它会复制recvmsg/sendmsg的flags参数的内容以影响数据读写的过程。

flags参数

flags参数和recv/send函数的flags参数的相同。具体参考:TCP数据读写

返回值

成功时候返回读写字节数,出错时候返回-1.