TCP侦听器套接字在accept()上死掉(错误24:文件太多)

时间:2014-02-19 16:25:38

标签: c sockets tcp udp

像往常一样,我对我的网络冒险有疑问。

我正在构建一个UDP到TCP中继服务器,取得了一些成功,但下面的方案是我的美味洋葱。

首先让我解释一下如何运作: - 服务器生成,检查东西和分叉成为守护进程。 - 在指定的NIC和端口上创建侦听器套接字。 - 此套接字接受传入连接,然后发送HTTP REST请求以指定他们希望从手头的Linux服务器中继哪个多播地址。 - 然后处理,等等:)这一切都有效。

事实上它一切正常,直到我测试了以下内容:

  • 有2个TCP输出NIC,1个UDP输入NIC - >因此 2 进程正在运行。
  • 从相同范围的UDP地址中获取每个输入120个(总共240个)。

在客户端应用程序命中120并尝试在下一个NIC上拉出相同的快速连接之后,在某种意义上连接到mcast地址(此代码被证明可以正常工作并且很好)的事情出错了,但没有数据是接收。令客户感到沮丧,但情况变得更糟。

稍后,第二个进程中的accept()调用会产生错误代码24(文件太多),并且无论是否关闭两个服务器进程的所有未完成连接,它都将无限制地执行此广告。

但是,如果我坚持使用120个输入(我这里内部只有120个多播)并且将80个放在1个服务器卡和TCP网卡上,40个放在另一个上,那就没问题了。

不管我最近有多少关于网络的争吵,我仍然是新手,所以任何人都可以获得一些有用的信息吗?

非常感谢,如果需要更多细节/信息/代码,我很乐意供应。

1 个答案:

答案 0 :(得分:0)

你正在某处泄露连接。当您读取流结束或从中获取错误时,请确保它们在所有可能的代码路径中关闭。