我正在尝试实现一个app / thread,它监听另一个app / thread已经在监听的ipaddr:port
。我知道我需要更新这两个应用以在SO_REUSEADDR
setsockopt(...)
之前设置bind()
,以避免"地址已在使用"第二个应用尝试bind()
时出错。
问题是这些应用程序(libs)位于现有系统中,该系统使用ZeroMQ。我不能直接使用linux socket lib。我只能使用ZeroMQ套接字。
显然zmq::setsockopt()
不理解SO_REUSEADDR
作为选项,因为它未在zmq.h
标题中定义。至少没有ZMQ_SO_REUSEADDR
或者我可能没有使用正确的选项。
有人可以帮我解决这个问题。 ZMQ套接字是否支持SO_REUSEADDR
或根本不支持,在这种情况下如何解决此问题?
答案 0 :(得分:1)
这里发生了一些事情。
SO_REUSEADDR
不会帮助你。 [see here]。 SO_REUSEADDR
将不允许您在两个应用程序之间共享相同的套接字签名。因此,如果您绑定到第一个应用程序中的特定address:port
并仍在该应用程序中使用该地址和端口,那么您将无法在第二个应用程序中绑定它。 {em>旧应用程序放弃后,SO_REUSEADDR
允许您为新应用程序获取address:port
签名,但它仍然挥之不去,等待缓冲区清除。
SO_REUSEPORT
是您正在寻找的[请参阅上面的相同链接]。 SO_REUSEPORT
旨在允许多个应用程序共享相同的地址签名。这似乎是你正在寻找的。 p>
SO_REUSEPORT
。您无法绑定到ZMQ中同一主机上的多个应用程序中的相同address:port
。截至去年6月,它不受支持。
...如果您希望只是处理其他服务正在停止运转且新服务希望绑定到同一address:port
签名的情况,那么您将拥有在原始连接上将ZMQ_LINGER设置为0,以便它不会保持套接字以清除缓冲区。