2016-02-27 33 views
1

我想實現一個應用/線程,用於偵聽另一個應用/線程已在偵聽的ipaddr:port。我知道我需要更新這兩個應用程序,以便在bind()之前設置setsockopt(...)中的SO_REUSEADDR,以避免當第二個應用嘗試使用bind()時出現「地址已被使用」錯誤。如何在zmq :: setsockopt()中設置SO_REUSEADDR選項(如果可能)或任何解決方法?

問題是這些應用程序(libs)在自己使用ZeroMQ的現有系統中。我無法直接使用linux socket lib。我只能使用ZeroMQ套接字。

顯然zmq::setsockopt()不瞭解SO_REUSEADDR作爲選項,因爲它沒有在zmq.h標題中定義。至少沒有ZMQ_SO_REUSEADDR

或者可能是我沒有使用正確的選項。

有人可以幫我解決這個問題。 ZMQ插座是否支持SO_REUSEADDR或根本不支持,在這種情況下該如何解決這個問題?

回答

1

這裏有幾件事情正在進行。

  1. SO_REUSEADDR不會幫你。 [see here]

SO_REUSEADDR將不允許您在兩個應用程序之間共享相同的套接字簽名。因此,如果您在第一個應用程序中綁定了特定的address:port,並且仍然在該應用程序中使用該地址和端口,那麼您將無法在第二個應用程序中綁定該地址和端口。 SO_REUSEADDR允許你抓取一個address:port簽名應用程序一旦應用程序已經放棄它,但它仍然揮之不去,等待緩衝區清除。

  1. SO_REUSEPORT您正在尋找[請參閱上面的鏈接]。

SO_REUSEPORT旨在允許多個應用程序共享相同的地址簽名。這似乎是你正在尋找的。

  • SO_REUSEPORT不ZMQ [see here]支持
  • 在ZMQ的同一主機上的多個應用程序中,您無法綁定到相同的address:port。截至去年6月份,這一數字並未得到支持。

    ...如果你想只是處理情況的另一個服務是紡紗下來,一個新的服務希望在相同的address:port簽名綁定的情況下,你必須ZMQ_LINGER最初的連接設置爲0,它不會持有套接字來清除緩衝區。

    相關問題