gpt4 book ai didi

zeromq - 如何在 zmq::setsockopt() 中设置 SO_REUSEADDR 选项——如果可能,或者任何解决方法?

转载 作者:行者123 更新时间:2023-12-05 03:11:56 62 4
gpt4 key购买 nike

我正在尝试实现一个应用程序/线程来监听另一个应用程序/线程已经在监听的 ipaddr:port。我知道我需要更新这两个应用程序以在 bind() 之前在 setsockopt(...) 中设置 SO_REUSEADDR 以避免“Address Already in use"当第二个应用程序尝试 bind() 时出现错误。

问题是这些应用程序(库)在一个现有的系统中,它自己使用 ZeroMQ。我不能直接使用 linux 套接字库。我必须只使用 ZeroMQ 套接字。

显然 zmq::setsockopt() 不理解 SO_REUSEADDR 作为选项,因为它没有在 zmq.h header 中定义。至少没有ZMQ_SO_REUSEADDR

或者可能是我没有使用正确的选项。

谁能帮我解决这个问题。 ZMQ 套接字是否支持 SO_REUSEADDR 或根本不支持,在这种情况下如何解决这个问题?

最佳答案

这里发生了几件事。

  1. SO_REUSEADDR 不会帮助您。 [see here] .

SO_REUSEADDR 不允许您在两个应用程序之间共享相同的套接字签名。因此,如果您在第一个应用程序中绑定(bind)到特定的 address:port 并且仍在该应用程序中使用该地址和端口,那么您将无法绑定(bind)到它在你的第二个应用程序中。 SO_REUSEADDR 允许您在 应用程序放弃后为 应用程序获取address:port 签名但它仍然挥之不去,等待缓冲区清除。

  1. SO_REUSEPORT 是您要查找的内容 [参见上面的相同链接]。

SO_REUSEPORT 旨在允许多个应用程序共享相同的地址签名。这似乎是您要找的。

  1. SO_REUSEPORT 在 ZMQ 中受支持 [see here] .

您不能在 ZMQ 的同一主机上的多个应用程序中绑定(bind)到相同的 address:port。截至去年 6 月,它不受支持。

...如果您希望只是处理另一个服务停止运行并且新服务希望绑定(bind)到相同的address:port 签名的情况,您'必须在原始连接上将 ZMQ_LINGER 设置为 0,这样它就不会占用套接字来清除缓冲区。

关于zeromq - 如何在 zmq::setsockopt() 中设置 SO_REUSEADDR 选项——如果可能,或者任何解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35667159/

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