如何在Linux上阻止阻止send()调用时消除EAGAIN错误

时间:2015-04-30 07:21:31

标签: linux sockets networking tcp

我正在尝试编写一个测试程序,它通过Linux机器上的Localhost在TCP套接字上写入数据(准确地说是CentOS 6.5)。我有一个程序写,一个程序读。读取是通过epoll触发的非阻塞recv()调用完成的。机器上有足够的内核来处理所有CPU负载,而不会出现争用或调度问题。

发送是较小数据包(约100字节)的缓冲区,最多汇总为1400字节。更改为聚合较大(64K)缓冲区没有明显区别。当我执行发送时,在10 MB的数据之后,我开始在发件人上收到EAGAIN错误。通过fcntl验证,我肯定配置为阻塞套接字。我还注意到每当我获得EAGAIN时调用ioctl(SIOCOUTQ)会产生越来越大的数字。

接收方处理数据读取的速度比发送方创建数据时要慢。添加接收器线程不是一种选择。假设我可以限制发件人,那么它更慢的事实是可以的。

现在,我对阻塞套接字的理解是send()应该在发送中阻塞,直到数据消失(这是基于过去的经验) - 意思是,tcp栈应该强制输入端自我限制

此外,send()的Linux手册页(以及网络上的其他查询)表明仅针对非阻塞套接字返回EAGAIN。

任何人都可以让我对正在发生的事情有所了解,以及如何让我的send()实际阻止,直到有足够的数据出来让我投入更多。我宁愿不必重新修改逻辑把usleep()或其他东西放在代码中。它是一个负载很轻的系统,yield()不足以让它耗尽。

0 个答案:

没有答案