read VS recv?关于 send 和 recv 的第四个参数 flag

Posted 看,未来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了read VS recv?关于 send 和 recv 的第四个参数 flag相关的知识,希望对你有一定的参考价值。

哈哈,今晚备课的时候发现了这一点。

学Linux网络编程这么久,还真没注意到 read/write 和 recv/send之间有什么区别,于是就去研究了一下。

首先呢,recv/send 的第一个参数 socket s (int s)起这么个名字就已经能说明问题了吧,这俩函数也确实一般用于网络通信。

其次,就是 recv/send 相较于 read/write 这多出的第四个参数,以前都是说,默认填个0就好了,但是一直不知道为什么。


int send(int s, const void *msg, size_t len, int flags); 

flags取值有:
0: 与write()无异
MSG_DONTROUTE:告诉内核,目标主机在本地网络,不用查路由表
MSG_DONTWAIT:将单个I/O操作设置为非阻塞模式
MSG_OOB:指明发送的是带外信息

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

flags取值有:
0:常规操作,与read()相同
MSG_DONTWAIT:将单个I/O操作设置为非阻塞模式
MSG_OOB:指明发送的是带外信息
MSG_PEEK:可以查看可读的信息,在接收数据后不会将这些数据丢失
MSG_WAITALL:通知内核直到读到请求的数据字节数时,才返回。

int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen); 

flags取值有:
0:常规操作,与read()相同
MSG_OOB:指明发送的是带外信息
MSG_PEEK:可以查看可读的信息,在接收数据后不会将这些数据丢失

sendto同上,不多说、


以上是关于read VS recv?关于 send 和 recv 的第四个参数 flag的主要内容,如果未能解决你的问题,请参考以下文章

read() 和 recv() 以及 send() 和 write() 之间有啥区别?

linux中read,write和recv,send的区别

linux中read,write和recv,send的区别

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

多次调用 send() 合并为一次调用 recv()

unix C语言关于socket的recv和send的问题,代码中也有问题