2014-02-19 49 views
0

像往常一样,这些天我对我的网络冒险有一个问题。TCP监听器套接字在accept()上死亡(错误24:太多文件)

我正在建立一个UDP到TCP中继服务器,并取得了一些成功,但下面的情况是我的软膏中的洋葱。

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

事实上这一切工作正常,直到测试以下:

  • 有2级TCP输出的NIC,1个UDP输入NIC - >且因此进程运行。
  • 从相同的UDP地址范围取得120个来自每个(共240个)的输入。

客户端应用程序打120,并试图拉的下一个网卡一样的快速之一后,不如意的事情从某种意义上说连接到MCAST地址(此代码证明工作,只是罚款)成功,但没有收到数据。令客户非常沮丧,但情况变得更糟。

经过一段时间,第二个进程中的accept()调用产生了错误代码24(文件太多),并且无论我是否关闭了两个服务器进程的所有未完成连接,它都将继续执行此无限制广告。但是,如果我坚持使用120个输入(我只有120个内部可用的组播),并将80个放在1个服务器卡和TCP NIC上,另一个放40个,这样就没有问题了。无论我最近与网络的东西有什么不同,我仍然是新手,所以任何人都可以为我提供一些有用的信息吗?

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

+0

您是否检查过[文件描述符限制](http://stackoverflow.com/a/880573/2802841)不是问题? – user2802841

回答

0

您在某处泄漏连接。确保在读取数据流结尾或从中获取错误时,它们会在所有可能的代码路径中关闭。

+0

谢谢 - 去研究! – nielsj