Perl IO :: Socket :: UNIX Connect with Timeout提供EAGAIN / EWOULDBLOCK

时间:2012-12-03 17:38:40

标签: perl sockets nonblocking unix-socket

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。

在我的代码中,使用重试循环很容易解决这个问题。但是我不明白为什么,当套接字变得可写时,套接字不能重新连接。我认为选择后卫总是足以进行非阻塞连接。显然不是;所以我的问题是:

  • 当选择工作(写位设置)时,什么条件导致连接失败?
  • 有没有比旋转和重试更好的方法,等待连接成功?纺纱是浪费周期。相反,我希望它阻止像select / poll这样的东西,但我仍然需要暂停。

感谢名单,

- 史蒂夫

1 个答案:

答案 0 :(得分:0)

  

但我不明白为什么,当套接字变得可写时,套接字不能重新连接。

我想这是因为在您再次连接之前,所有需要的资源都被免费抢走了。用旋转循环替换select对此没有帮助。