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

4
这涉及到Linux内核2.6 TCP sockets。我使用非阻塞发送向另一个客户端发送大量数据,例如300 MB,该客户端每次接收8 MB。在接收了8 MB后,“接收者”停止接收,因为它需要执行其他任务,如错误处理。发送方会得到EWOULDBLOCK,但由于这是异步通信,发送方会尝试填充另一端的TCP接收缓冲区。
我的问题是:即使“发送者”收到EWOULDBLOCK并且“接收者”停止接收,TCP接收缓冲区中是否仍然有数据?同一套接字用于错误处理,因此“接收者”是否必须在尝试重用现有套接字之前清除TCP接收缓冲区?
2个回答

5

是的。当您收到 EWOULDBLOCK 错误时,已经发送的一些数据可能尚未被接收方应用程序读取。这些缓冲数据将在套接字上的下一个 read 中可用。

这意味着如果您的接收方向发送方发送“糟糕,不要再发送了”消息,则发送方无法对该消息进行处理并“取消发送”数据。一旦数据传递给 write()/send(),它就在路上了,无法撤回。

您的接收方将不得不通过读出其不再感兴趣的数据并丢弃它来处理这种情况,这意味着您的数据流中需要一些事务分隔符。


但它只会填满 TCP 接收缓冲区,并且只有 8 MB 的一部分将被发送。那么你怎么知道要丢弃多少数据? - user224579
你不会知道,至少根据你所解释的内容来看。套接字只是数据流。它们所具有的唯一意义是在应用程序级协议、记录等方面由您加以强加。如果这是您需要考虑的情况,则需要定义一些东西来让您解决它。 - Duck
我明白了,那是应用程序的责任。谢谢! - user224579

0
我的问题是:即使“发送方”收到EWOULDBLOCK并且“接收方”停止接收,TCP接收缓冲区中是否仍然存在数据?
TCP接收缓冲区中有数据,因为发送方收到了EWOULDBLOCK。这是唯一可能发生的情况。
你的问题没有意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接