Ubuntu Linux,2.6.32-45内核,64b,Perl 5.10.1
我将许多新的IO :: Socket :: UNIX流套接字连接到服务器,大多数情况下它们工作正常。但有时在更快的处理器上的高度线程环境中,它们会返回“资源暂时不可用”(EAGAIN / EWOULDBLOCK)。我在Connect上使用超时,因此这会导致套接字在连接期间进入非阻塞模式。但是我的超时时间没有发生 - 它没有等待任何明显的时间,它会很快返回。
我在IO :: Socket中看到它尝试连接,如果它在EINPROGRESS或EAGAIN / EWOULDBLOCK失败,它会执行select以等待设置写入位。到目前为止这似乎很正常。在我的情况下,选择快速成功,意味着写位被设置,然后代码尝试重新连接。 (我想这是尝试通过错误滑点来获取任何错误?)无论如何,重新连接再次失败并使用EAGAIN / EWOULDBLOCK。
在我的代码中,使用重试循环很容易解决这个问题。但是我不明白为什么,当套接字变得可写时,套接字不能重新连接。我认为选择后卫总是足以进行非阻塞连接。显然不是;所以我的问题是:
感谢名单,
- 史蒂夫
答案 0 :(得分:0)
但我不明白为什么,当套接字变得可写时,套接字不能重新连接。
我想这是因为在您再次连接之前,所有需要的资源都被免费抢走了。用旋转循环替换select
对此没有帮助。