perl - Perl IO::Socket::UNIX与超时连接给出EAGAIN/EWOULDBLOCK

标签 perl sockets nonblocking unix-socket

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

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

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

在我的代码中,使用重试循环很容易解决此问题。但是我不明白为什么当套接字变得可写时,套接字无法重新连接。我认为选择防护始终足以实现无阻塞连接。显然不是;所以我的问题是:

  • 是什么条件导致选择工作(写入位被置位)时连接失败?
  • 是否有比旋转和重试更好的方法来等待连接成功?纺纱浪费了周期。相反,我希望它阻止诸如选择/轮询之类的操作,但是我仍然需要超时。

  • 谢谢

    -史蒂夫

    最佳答案

    But I don't understand why, when the socket becomes writeable, that the socket is not re-connectable.



    我想这是因为任何需要的资源免费之后,在您能够再次连接之前,它们都被抢走了。用自旋循环替换select并没有帮助。

    关于perl - Perl IO::Socket::UNIX与超时连接给出EAGAIN/EWOULDBLOCK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13688716/

    相关文章:

    c# - 如何监听多个IP地址?

    java - 为什么异步 AWS Java SDK 使用线程池?

    perl - 如何在 perl 中的每个类方法之后踢一个特定的回调子程序?

    perl - 使用 Perl 的 3D 立方体中的点或球体

    windows - 使用 Perl 脚本模拟按下键盘 F 键

    c# - 我可以为使用套接字而不是 “Windows store app library”的Windows应用商店编写一个库吗?

    c - 如何确保服务器区分从同一台计算机上的两个不同外壳运行的两个不同的 TCP 客户端?

    node.js - 如何在 Node.js 中无限读取行

    erlang - cometd 的最佳方法? (非阻塞 IO 与 Erlang)

    python - 在 debian 上打包使用 perl 和 python 的应用程序