我目前有一个select()语句,用于跟踪两个UDP socker。我在一个通用数据套接字上每秒发送10-20条消息,这就像我预期的那样解释。
然而,一旦我点击了大约1024条消息,我就会收到通知:
talker:socket:打开的文件过多 talker:无法绑定套接字
这对我来说是合理的,因为ulimit -n为这个用户显示最多1024个打开的文件。但是,为什么所有这些打开文件?使用UDP,没有连接,所以我不相信每次都需要关闭一个套接字(尽管我可能是错的)。
有什么想法吗?提前致谢。
答案 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
选项) 。这是在此时平衡文件描述符计数的最简单方法。