哈哈,今晚备课的时候发现了这一点。
学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同上,不多说、