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

这涉及到Linux内核2.6 TCP套接字

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

一个8MB的接收后,“接收器”停止接收,因为它要执行其他任务,如error handling。 发送者会得到一个EWOULDBLOCK,但是由于它是asynchronous通信,发送者会尝试填充另一端的TCP recv缓冲区。

我的问题是:即使“发件人”得到了EWOULDBLOCK,并且“接收者”停止接收,TCP recv缓冲区中是否还有数据? 相同的套接字用于error handling,那么“接收器”必须在尝试重用现有套接字之前清除TCP recv缓冲区?

是。 当你得到EWOULDBLOCK ,你已经发送的一些数据还没有被接收应用程序读取,这是很有可能的(事实上可能)。 这个缓冲的数据将可用于下一次在套接字上read

这意味着,如果你的接收者发送一个“Ooops,不要再发送”的消息给发送者,发送者就不能对该消息采取行动并“解除”数据。 一旦它传递给write() / send() ,它就会停止,并且不能被调用。

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

我的问题是:即使“发件人”得到了EWOULDBLOCK,并且“接收者”停止接收,TCP recv缓冲区中是否还有数据?

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

你的问题没有意义。