【问题标题】:Linux TCP/IP Non-blocking send for socket stream..what happens to the TCP recv buffer?用于套接字流的 Linux TCP/IP 非阻塞发送.. TCP recv 缓冲区会发生什么?
【发布时间】:2010-11-26 08:50:15
【问题描述】:

这与 Linux 内核 2.6 TCP 套接字有关。

我正在发送大量数据,例如 300 MB,并以非阻塞方式发送给另一个一次接收 8 MB 的客户端。

在一次 8 MB 接收后,“接收者”停止接收,因为它想要执行其他任务,例如错误处理。发送方会得到一个 EWOULDBLOCK,但由于它是异步通信,发送方会尝试填满另一端的 TCP recv 缓冲区。

我的问题是:即使“发送方”收到 EWOULDBLOCK 并且“接收方”停止接收,TCP recv 缓冲区中还会有数据吗?相同的套接字用于错误处理,那么“接收者”是否必须在尝试重用现有套接字之前清除 TCP recv 缓冲区?

【问题讨论】:

    标签: linux tcp sockets nonblocking


    【解决方案1】:

    我的问题是:即使“发送方”收到 EWOULDBLOCK 并且“接收方”停止接收,TCP recv 缓冲区中还会有数据吗?

    TCP 接收缓冲区中有数据因为发送方获得了 EWOULDBLOCK。这是它可能发生的唯一条件。

    你的问题没有意义。

    【讨论】:

      【解决方案2】:

      是的。当您收到EWOULDBLOCK 时,很有可能(实际上很可能),您已经发送的一些数据还没有被接收应用程序读取。这个缓冲的数据将提供给套接字上的下一个read

      这意味着,如果您的接收者随后向发送者发送“糟糕,不要再发送”消息,发送者将无法对该消息采取行动并“取消发送”数据。一旦它被传递给write()/send(),它就在路上,无法召回。

      您的接收者必须通过读出它不再感兴趣的数据并丢弃它来处理这种可能性,这意味着您需要在数据流中使用某种事务分隔符。

      【讨论】:

      • 但它只会填满 TCP recv 缓冲区,并且只会发送 8 MB 的一部分。那么你怎么知道要丢弃多少呢?
      • 你不会知道,至少就你解释你在做什么而言。套接字只是数据流。它们的唯一含义是您在应用程序级协议、记录等方面强加给它们的内容。如果这是您需要考虑的条件,那么您需要定义一些可以让您解决问题的东西。
      • 我明白了,这是应用程序的责任。谢谢!
      猜你喜欢
      • 2011-03-03
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2011-05-31
      • 2011-09-27
      • 2014-08-19
      • 2012-07-14
      相关资源
      最近更新 更多