【发布时间】:2010-11-30 19:03:06
【问题描述】:
我有一个程序可以打开几个套接字来监听和发送。我发现了一个非常奇怪的情况,目前仅在 Mac OS X 上,gethostbyname 完全冻结了程序。
首先,我不使用线程。其次,只有当我同时运行 两个 的测试程序副本时才会出现问题。
第一个实例创建 4 个发送和 4 个接收套接字,然后它们开始相互发送流量。在我用于消息传递的网络库中,gethostbyname() 在接收端口打开后立即被调用。我发现当我启动第二个测试程序实例时,在打开 3 个接收器后,最后一个就卡在那里了。
我已将问题缩小到对gethostbyname 的调用,它似乎永远不会返回。 (请记住,到目前为止,对gethostbyname 的每次调用都可以正常工作。)此外,当它到达这一点时,测试程序的 CPU 使用率突然跳到 100%,就好像有一个无限循环一样gethostbyname。另外我不能 Ctrl-C 进程,我必须从另一个终端杀死它。
显然这种行为是不可接受的,即使它只发生在启动 8 个发送方/接收方对的极端情况下。 (一次处理 4 个,另一个处理 4 个。)有没有人见过这种情况,我该如何避免?
顺便说一句,唯一测试过的其他平台是 Linux (Ubuntu 10.04),它运行得很好。
【问题讨论】:
-
这个问题是出现在所有 Mac 上,还是只出现在一台上?如果是后者,那 Mac 可能存在某种网络配置问题。
-
我只在一台mac上测试过。谢谢你的建议,我会在另一台上试试。
-
我们可以看看你的代码吗?前几天,我遇到了一个似乎被 read() 无限期阻塞但实际上是其他地方的无限循环的错误。如果 CPU 跳到 100%,听起来你也有一个无限的非阻塞循环。
-
可能是您在该平台上的名称服务器服务被窃听。如果它在另一个操作系统上工作,表明可能的原因。
标签: macos sockets unix gethostbyname