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

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

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

谢谢。

【问题讨论】:

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

标签: sockets send concurrency recv


【解决方案1】:

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

【讨论】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2011-03-15
    • 2021-10-16
    相关资源
    最近更新 更多