套接字I/O函数write/read writev/readv send/recv sendto/recvfrom sendmsg/recvmsg

函数原型
read/write系原型

 

send/recv系原型

 

详细说明
write/read

write用于向任意文件描述符中写入(读取)数据,用作socket发送数据时,只能向已经建立连接的文件描述符中写入(读取)数据;参数以及返回值如下:

 

writev/readv

writev向任意文件描述符中写入多个缓冲区的数据,readv用于从任意描述符中向多个缓冲区读取数据,用作socket发送数据时,只能向已经建立连接的文件描述符中写入(读取)数据;参数以及返回值如下:

 

writev/readv补充说明

writev/readv与write/read功能基本一致,区别在于writev/readv可以写入或者读出指向多个缓冲区;其向量参数iov由多个下面的结构组成,每个结构指向一个缓冲区;

 

send/recv

send用于向socket中写入(读取)数据,只能用于已经建立连接的socket上,udp也可以调用connect建立连接;

 

 

send/recv补充说明

send/recv与write/read的作用基本相同,只是多了一个flag参数,当flag参数设置为0时,它们的功能一致;当sendto/recvfrom函数地址指针为NULL且地址长度为0时,其作用于send/recv一致,实际上内核实现send/recv也是对sendto/recvfrom做了忽略地址信息的简单封装;

sendto/recvfrom

sendto用于向socket中写入(读取)数据,如果用在已经建立连接的socket上,需要忽略其地址和地址长度参数,即地址指针设置为NULL,地址长度设置为0;如udp,如果不调用connec建立连接,则需要指定地址参数,如果调用connect建立了连接,则省略地址参数;

 

sendto/recvfrom补充说明

当sendto/recvfrom函数地址指针为NULL且地址长度为0时,其作用于send/recv一致,实际上内核实现send/recv也是对sendto/recvfrom做了忽略地址信息的简单封装;

 

sendmsg/readmsg

sendmsg用于向socket文件描述符中写入多个缓冲区的数据,recvmsg用于向多个缓冲区读取socket文件描述符中的数据,发送(接收)前需要构造msghdr消息头;参数以及返回值如下:

 

sendmsg/recvmsg补充说明

sendmsg/recvmsg需要构造的消息头部如下,其中msg_iov指向多个iovec,没给iovec对应着一个缓冲区,msg_iovlen标识缓冲区的数量;

 

函数对比

图片来自<unix网络编程>

发表评论

电子邮件地址不会被公开。 必填项已用*标注