2010-07-22 33 views
7

我记得在某处看过一个套接字可以被认为是两个独立的半双工信道。这是否意味着相同套接字的recv()send()实际上是不相关的?同时在一个套接字上recv()和send()是否安全?

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

谢谢。

+1

取决于协议。 TCP是全双工的,所以是的。 – 2010-07-22 11:54:39

+0

谢谢,你有没有反例呢?或任何其他参考链接/代码,以便我可以阅读? – 2010-07-22 12:01:41

回答

1

我很好奇你怎么看他们互相干扰。你是否认为你可能会收到你发送的内容?

+1

不,我指的是如何影响另一方行为的正确性或效率。例如,如果他们共享相同的缓冲区,那么很可能必须等到另一个处于空闲状态,对吧? – 2010-07-22 11:40:03

+1

您可以发出阻塞或非阻塞发送和接收。阻塞时,您传入的数据缓冲区是数据缓冲区。没有混淆的机会。在非阻塞的情况下,您的数据缓冲区被复制。关于交叉使用的API文档没有限制,所以它们必须使用不同的缓冲区;因为如果他们不是,他们不可能是非阻塞的(他们将不得不阻止对方)。 – 2010-07-29 08:59:36

1

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

例: 假设你有两个线程,一个负责发送数据 和第二个是负责接收您可以按照

主程序做数据: 得到套接字fd。 创建一个POSIX线程发送缓冲区到这个fd。 创建一个POSIX线程来接收从这个fd到达的数据。 连接到服务器。

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

线程2例程: 从此fd收回数据。 处理日期。

相关问题