缓冲区溢出会发生什么?

时间:2012-09-04 18:35:49

标签: c++ linux sockets tcp buffer

我在某处读到每个TCP连接都有自己的125kB输出和输入缓冲区。如果这个缓冲区已满,我还会继续在linux上发送数据会怎样?

根据http://www.kernel.org/doc/man-pages/online/pages/man2/send.2.html,数据包只是默默地丢弃,而没有通知我。我该怎么做才能阻止这种情况发生?有没有办法找出我的数据是否已经正确发送,以便我可以在以后的某个时间点继续?

2 个答案:

答案 0 :(得分:7)

简短的回答是这样的。由于远程端点接收和使用数据,TCP套接字上的“发送”调用将一直阻塞,直到TCP滑动窗口(或内部队列缓冲区)打开。与尝试将字节写入文件的速度与磁盘可以保存的速度相比没有什么不同。

如果您的套接字配置为非阻塞模式,send将返回EWOULDBLOCK或EAGAIN,直到可以发送数据。标准pollselectepoll来电将按预期工作,以便您知道何时再次“发送”。

答案 1 :(得分:0)

我不知道“数据包被丢弃”。我认为更有可能的是,程序对write()的调用将阻止或返回失败。