选择()+ UDP导致打开的文件太多

时间:2010-06-28 20:52:17

标签: c++ sockets select network-programming

我目前有一个select()语句,用于跟踪两个UDP socker。我在一个通用数据套接字上每秒发送10-20条消息,这就像我预期的那样解释。

然而,一旦我点击了大约1024条消息,我就会收到通知:

  

talker:socket:打开的文件过多   talker:无法绑定套接字

这对我来说是合理的,因为ulimit -n为这个用户显示最多1024个打开的文件。但是,为什么所有这些打开文件?使用UDP,没有连接,所以我不相信每次都需要关闭一个套接字(尽管我可能是错的)。

有什么想法吗?提前致谢。

2 个答案:

答案 0 :(得分:1)

我认为在这种情况下“太多打开的文件”实际上意味着你已达到文件描述符限制;网络套接字计入此限制。你确定没有别的东西 - 比如在routehelper - 那是在创造更多的套接字吗?

你在运行什么平台?如果Linux lsof或在/proc/<pid>/fd中徘徊 - 在它运行时,在它达到极限之前 - 可能会说明所有fds的去向。

提示:不要依赖socket_udp_inboundALL数字大于socket_udp_inboundRC - 最好明确比较它们的值一次。

答案 1 :(得分:1)

如果您在Linux上,请在客户端上strace(1)检查socket(2)open(2) vs close(2)系统调用(尝试-e trace=socket,open,close选项) 。这是在此时平衡文件描述符计数的最简单方法。