gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:55:59 25 4
gpt4 key购买 nike

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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com