Linux TCP/IP 非阻塞发送套接字流..TCP 接收缓冲区会发生什么?

use*_*579 4 sockets linux tcp nonblocking

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

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

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

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

caf*_*caf 5

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

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

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