天天看点

read、write与recv、send的区别

前边两个上边博客已经做了详细解释了,现在说说后两个库函数。

首先是函数原型:

size_t recv(int sockfd,void *buf,int len,int flags);
size_t send(int sockfd,void *buf,int len,int flags);
           

recv和send函数提供了和read和write差不多的功能.但是他们提供 了第四个参数来控制读写操作.

前面的三个参数和read,write相同,第四个参数能够是0或是以下的组合:

| MSG_DONTROUTE | 不查找路由表 |

| MSG_OOB | 接受或发送带外数据 |

| MSG_PEEK | 查看数据,并不从系统缓冲区移走数据|

| MSG_WAITALL | 等待任何数据 |

MSG_DONTROUTE:是send函数使用的标志.这个标志告诉IP协议.目的主机在本地网络上面,没有必要查找路由表.这个标志一般用网络诊断和路由程式里面.

MSG_OOB:表示能够接收和发送带外的数据.关于带外数据我们以后会解释的.

MSG_PEEK:是recv函数的使用标志,表示只是从系统缓冲区中读取内容,而不清楚系统缓冲区的内容.这样下次读的时候,仍然是相同的内容.一般在有多个进程读写数据时能够使用这个标志.

MSG_WAITALL:recv函数的使用标志,表示等到任何的信息到达时才返回.使用这个标志的时候recv回一直阻塞,直到指定的条件满足,或是发生了错误.1)当读到了指定的字节时,函数正常返回.返回值等于len 2)当读到了文档的结尾时,函数正常返回.返回值小于len 3)当操作发生错误时,返回-1,且配置错误为相应的错误号(errno)