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

时间:2009-09-08 01:43:28

标签: linux tcp sockets nonblocking

这适用于Linux内核2.6 TCP套接字。

我发送大量数据,比如说300 MB,发送一个非阻塞发送给另一个接收8 MB的客户端。

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

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

2 个答案:

答案 0 :(得分:4)

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

这意味着如果您的接收方然后向发件人发送“Ooops,不再发送”消息,则发件人无法对该消息采取行动并“取消发送”该数据。一旦传递到write() / send(),它即将开始,无法撤回。

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

答案 1 :(得分:0)

  

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

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

你的问题没有意义。