2009-09-08 39 views
2

这属于Linux内核2.6 TCP套接字。Linux TCP/IP针对套接字流的非阻塞发送...... TCP recv缓冲区会发生什么情况?

我发送大量的数据,说300 MB,与非阻塞发送给谁一次接收8 MB的另一端。

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

我的问题是:将有仍然在TCP recv的缓冲数据,即使在“发件人”有一个EWOULDBLOCK和“接收器”停止接收?同一个套接字用于错误处理,那么“接收方”必须在尝试重用现有套接字之前清除TCP recv缓冲区?

回答

3

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

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

接收机将通过读出它不再感兴趣,并丢弃它的数据,这将意味着你将需要某种形式的交易分隔符的数据流来处理这种可能性。

+0

但它只会填满TCP recv缓冲区,只有部分8 MB会被发送。那么你怎么知道丢弃多少? – user224579 2009-09-08 02:22:07

+0

至少就你解释你在做什么而言,你是不会知道的。套接字只是数据流。它们的唯一含义是你在应用程序级别协议,记录等方面对它们施加的影响。如果这是一个需要考虑的条件,那么你需要定义一些能够让你解决的条件。 – Duck 2009-09-08 02:49:50

+0

我明白了,这是应用程序的责任。谢谢! – user224579 2009-09-08 02:59:31

0

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

有一个在TCP数据接收缓冲区因为发件人得到EWOULDBLOCK。这是它可能发生的唯一条件。

你的问题没有意义。

相关问题