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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux中read,write和recv,send的区别相关的知识,希望对你有一定的参考价值。

Linux的recv、send函数和read、write函数都可以用于套接字编程。
区别:
1、recv、send只用于套接字通信;
2、read、write是底层系统调用,只要是文件操作就都可以用, 比如套接字操作,套接字描述符属于是文件描述符的一种,套接字本身在Linux上就叫做套接字文件。
所以read、write函数不光可以用于套接字编程,也可以用于读取其他各种文件,比如用于文件编程读写普通文件。
参考技术A 读,写
接收,发送

在 UDP 套接字上使用 write()/read()?

【中文标题】在 UDP 套接字上使用 write()/read()?【英文标题】:Using write()/read() on UDP socket? 【发布时间】:2015-01-10 15:55:16 【问题描述】:

根据手册页:

send() 和 write(2) 之间的唯一区别是标志的存在。使用零标志参数,send() 等效于 write(2)。此外,以下调用 send(sockfd, buf, len, flags);相当于 sendto(sockfd, buf, len, flags, NULL, 0);

recv() 调用通常仅在连接的套接字上使用(参见 connect(2)),它与带有 NULL src_addr 参数的 recvfrom() 相同。

另外,如果我没记错的话(在手册页中找不到),recvflags == 0 等效于 read(类似于 writesend)。


所以:

这是否意味着在 UDP 套接字上使用 read 非常好(如果我不需要 src_addr)? 有没有办法在 UDP 套接字上使用write(现在我在sendtodest_addr 参数中设置了目标地址)?

【问题讨论】:

@admdrew - 为什么不呢?这里没有具体的 C++(除了我对 socket_connection 类的不必要的评论,这绝对无关紧要) 是的,socket_connection 让我感到困惑。 @KirilKirov C 没有范围解析运算符 (::),只有 C++ 有。 @black - 是的,点了。 【参考方案1】: 如果您不需要源地址,在 UDP 套接字上使用 read() 非常好。 如果你connect() UDP 套接字到目的地,你可以使用write()

【讨论】:

"如果您将 UDP 套接字连接到目标,您可以使用 write()。"我们不连接 UDP 套接字,对吧? @AbhishekSagar 错了。您可以将 UDP 套接字连接到目标,在这种情况下,它只向该目标发送和接收。【参考方案2】:

另外,如果我没记错的话(在手册页中找不到),::recv with flags == 0 相当于 ::read (类似于 ::write 和 ::发送)

是的,如果文件描述符是套接字是正确的:send/recv 将失败,否则使用 E​​BADF。 同样,在面向连接的模型中,send 等同于 sendtorecvrecvfrom 与 NULL sockaddr *,因为协议已经提供了它们。

但是,使用 UDP,没有连接,所以这样的调用:

// assume fd to be an UDP socket
write(fd, buff, bytes) 

没有任何意义,因为没有提供目的地 (EDESTADDRREQ)。 相反,当您读取一个数据包时,您就知道它来自哪里,并且您可能希望使用该 IP 以防万一出现问题。

我的建议是:

如果您处于面向连接的模式,例如,请使用 send/recv TCP 使用sendto/recvfrom主要用于无连接通信,例如 UDP 如果您不为原始 I/O 指定任何标志,请使用write/read(上述函数可能被视为更高级别的函数)

我不建议使用一个类来处理这两种协议,而是建议使用两个专门的类;不要混合协议。

【讨论】:

我完全同意这些建议,我也是这么想的,但我很想使用一些非常非常相似(几乎相同)的东西,它已经存在并且已经过多年的测试。 +1,我会再等一下其他 cmets/answers。 您可以将 UDP 套接字连接到目标,在这种情况下您可以使用 send()write()。第三个要点与先前的陈述相矛盾。答案不正确。

以上是关于linux中read,write和recv,send的区别的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

在 UDP 套接字上使用 write()/read()?

高级套接字函数