同时在一个套接字上进行 recv() 和 send() 是不是安全?

Posted

技术标签:

【中文标题】同时在一个套接字上进行 recv() 和 send() 是不是安全?【英文标题】:is it safe to recv() and send() on one socket concurrently?同时在一个套接字上进行 recv() 和 send() 是否安全? 【发布时间】:2011-03-19 12:10:10 【问题描述】:

我记得在某处读到一个套接字可以被视为两个独立的半双工通道。是不是说同一个socket的recv()send()其实是不相关的?

如果是这样,是根据定义还是 特定于实现? 如果不是,两者如何相互干扰?

谢谢。

【问题讨论】:

取决于协议。 TCP 是全双工的,所以是的。 谢谢,你有反例吗?或任何其他参考链接/代码,以便我可以阅读? 【参考方案1】:

我很好奇您认为它们会如何 相互干扰。您是否认为您可能会收到您发送的内容?

【讨论】:

不,我的意思是一个人如何影响另一个人的行为的正确性或效率,如果他们这样做的话。例如,如果它们共享同一个缓冲区,很可能一个必须等​​到另一个空闲,对吧? 您可以发出阻塞或非阻塞发送和接收。使用阻塞,你传入的数据缓冲区就是数据缓冲区。没有混乱的机会。使用非阻塞,您的数据缓冲区被复制。 API 文档中没有关于交错使用的限制,因此它们必须使用不同的缓冲区;因为如果它们不是,它们就不可能是非阻塞的(它们必须互相阻塞)。【参考方案2】:

如果是 SOCK_STREAM,可以同时使用 send/recv。

例如: 假设你有两个线程,一个负责发送数据 第二个负责接收您可以执行的数据

主要例程: 获取套接字 fd。 创建一个 POSIX 线程以将缓冲区发送到此 fd。 创建一个 POSIX 线程来接收来自这个 fd 的数据。 连接到服务器。

线程 1 例程: 构造消息缓冲区; 将缓冲区发送到这个 fd。

线程 2 例程: 从这个 fd 接收数据。 处理日期。

【讨论】:

以上是关于同时在一个套接字上进行 recv() 和 send() 是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

ZMQ:socket_send/recv 阻塞

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

面临 recv() 和 send() winsock api 的问题。 Recv() 在接收最后一个数据包时挂起

ZMQ 套接字不是线程安全的,但我可以在不同的线程中使用 zmq_send() 和 zmq_recv() 吗?

Linux 套接字:如何让 send() 等待 recv()

在 UDP 套接字上使用 sendto()/recvfrom() 而不是 connect()/send()/recv() 的目的是啥?