PerlIO::Socket::带超时的UNIX连接提供EAGAIN/EWOULDBLOCK



Ubuntu Linux,2.6.32-45内核,64b,Perl 5.10.1

我将许多新的IO::Socket::UNIX流套接字连接到服务器,它们大多工作正常。但有时在速度更快的处理器上的重线程环境中,它们会返回"资源暂时不可用"(EAGAIN/EWOULDBLOCK)。我在Connect上使用了超时,所以这会导致套接字在连接过程中进入非阻塞模式。但我的超时期并没有发生——它不会等待任何明显的时间,它会很快返回。

我在IO::Socket中看到,它尝试连接,如果EINPROGRESS或EAGAIN/EWOULDBLOCK失败,它会选择等待写入位的设置。到目前为止,这似乎很正常。在我的情况下,选择很快成功,这意味着写入位已设置,然后代码尝试重新连接。(我想这是试图通过错误滑动来获得任何错误?)无论如何,EAGAIN/EWOULDBLOCK的重新连接再次失败。

在我的代码中,这很容易通过重试循环来修复。但我不明白为什么当套接字变为可写时,套接字是不可重新连接的。我认为选择保护总是足够的非阻塞连接。显然不是;所以我的问题是:

  • 当选择工作(写入位被设置)时,什么条件会导致连接失败
  • 还有比旋转并重试更好的方法来等待连接成功吗?纺纱是在浪费周期。相反,我希望它能阻止像选择/投票这样的事情,但我仍然需要暂停

Thanx,

--Steve

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

我想这是因为在你能够再次连接之前,任何需要的资源都被占用了。用旋转循环替换select并没有帮助。

最新更新