read、write与recv、send的区别

来源:互联网 发布:数据冗余分类 编辑:程序博客网 时间:2024/06/13 06:24

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

首先是函数原型:

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)

0 0