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

2021-09-18 11:43:49 浏览数 (3)

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

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

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

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


代码语言:javascript复制
int send(int s, const void *msg, size_t len, int flags); 

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

代码语言:javascript复制
int recv(int s, void *buf, size_t len, int flags);

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

代码语言:javascript复制
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同上,不多说、


0 人点赞