4

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

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

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

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

4

2 回答 2

5

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

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

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

于 2009-09-08T02:04:54.957 回答
0

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

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

你的问题没有意义。

于 2016-04-28T11:37:49.873 回答