recv 和 send 函数专门用于套接字描述符的,相比于 read 和 write,前三个参数一模一样。recv 和 send 只多了一个参数 —— flags.
如果你还记得 recvfrom 和 sendto,你应该能回忆起它们也有一个参数 flags,那时候没有讲解这个标志位,是因为放到这篇文章一起讲了。
1. recv 和 send
- 函数原型
ssize_t recv(int sockfd, void *buf, size_t len, int flags); ssize_t send(int sockfd, const void *buf, size_t len, int flags);
- 参数 flags
前面的在个参数和 read、write 没有区别,就不多说了,这里重点看 flags 参数。
flags 是一个组合标志选项,因为它的名字是以 s
结尾。它有很多可选项,这里只说常用的几种,更多的选项请参数 man 手册。
选项 | 说明 |
---|---|
MSG_DONTROUTE | 告诉内核目的主机在直连的本地网络上(同一网段),不要使用网关将数据包路由出去 (仅支持 send 和 sendto 函数) |
MSG_DONTWAIT | 临时将套接字描述符设置成非阻塞(支持 recv 和 send) |
MSG_OOB | 对于 send,表示即将发送带外数据(out-of-band data);对于 recv 来说,表示即将读入带外数据(支持 recv 和 send) |
MSG_PEEK | 查看可读取的数据,返回后内核不会将已读取的数据从接收缓冲区中删除。(仅支持 recv 和 recvfrom 函数) |
MSG_WAITALL | 指定该标志,就相当于 readn 函数。(仅支持 recv 和 recvfrom 函数) |
这些标志位对我们来说并没有什么难度,以后我们确实要用到它的时候,再结合代码分析。
2. 总结
- 理解 recv 和 send 常用的标志位