【问题标题】:Select() + UDP resulting in too many open filesSelect() + UDP 导致打开的文件过多
【发布时间】:2010-06-29 11:50:51
【问题描述】:

我目前有一个配置为跟踪两个 UDP sockers 的 select() 语句。我在一个通用数据套接字上每秒可能发送 10 到 20 条消息,这正如我预期的那样。

但是,一旦我收到大约 1024 条消息,我就会收到通知:

talker: socket: 打开的文件太多 talker: 绑定套接字失败

这对我来说是合乎逻辑的,因为 ulimit -n 显示此用户最多打开 1024 个文件。但是,为什么会有所有这些打开的文件?使用 UDP,没有建立连接,所以我认为我不需要每次都关闭一个套接字(尽管也许我错了)。

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

【问题讨论】:

  • 你在哪里创建套接字?等等,我看到您关于不需要关闭套接字的评论,因为它是 UDP。你仍然需要关闭它。但是您可以像现在一样在您的选择中重复使用它。我认为是您用来发送消息的代码导致了问题,而不是选择。
  • @SB 我已经添加了用于创建套接字的代码。您认为问题在于发送消息吗?嗯
  • @SB 我检查了我的发送代码 --- 我在转发消息后关闭了套接字。
  • 哪边出错了?客户端还是服务器?
  • 为什么会有多个socket?我同意这些家伙,这可能是套接字创建错误。

标签: c++ sockets select network-programming


【解决方案1】:

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

您在哪个平台上运行?如果 Linux、lsof 或在/proc/<pid>/fd 中到处乱逛——在它运行时,在它达到极限之前——可能说明所有 fd 的去向。

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

【讨论】:

  • 谢谢——lsof 为我指明了正确的方向。完整解释如下。
【解决方案2】:

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

【讨论】:

  • 谢谢——我不知道这个选项。这次 lsof 帮助了我,但也许下次 strace 会有所帮助(+1)。
  • 是的,这是一个很棒的工具,可以和lsoftcpdump 一起保存在你的工具箱中:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
相关资源
最近更新 更多