69-recv 和 send 函数

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 常用的标志位

说明:本文转自blog.csdn.net,用于学习交流分享,仅代表原文作者观点。如有疑问,请联系我们删除~