2

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

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

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

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

  • What conditions cause the connect to fail when the select works (the write bit gets set)?
  • 有没有比旋转和重试更好的方法来等待连接成功?纺纱浪费循环。相反,我希望它阻止诸如选择/轮询之类的事情,但我仍然需要超时。

谢谢,

——史蒂夫

4

1 回答 1

0

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

我想这是因为在您能够再次连接之前,任何需要的资源都变得免费了。用旋转循环替换select无济于事。

于 2012-12-03T19:39:40.760 回答