2016-11-15 103 views
0

我有一個回覆ZSocket的請求 - 回覆模式。我可以重新綁定一個ZeroMQ套接字到另一個端口而不破壞套接字嗎?

在後面的過程中,我想切換綁定,因此回覆套接字現在響應不同端口上的請求。如果用戶不想在默認端口5555上收聽,則用戶輸入他們想要收聽的端口。

我可以通過再次調用ZSocket.Bind()來做到這一點,還是必須銷燬首先插座對象。

如果我必須先摧毀它,那麼我怎麼能確定ZSocket已經準備好被反彈到別的東西呢?我知道關閉套接字在C中處理方式不同,因爲它沒有垃圾收集。由於ZeroMQ的C#語言綁定可以使用垃圾收集,就像關閉套接字並在另一個端口上創建一個新套接字一樣簡單?我是否需要費心設置一個低靈兒值或類似的東西?

我在文檔中找不到任何關於此的信息。 這裏有一個相關的問題ZeroMQ: Address in use error when re-binding socket

這裏是代碼我有

private ZContext context = new ZContext(); 
private ZSocket replier = new ZSocket(context, ZSocketType.REP); 
replier.Bind("tcp://*:5555); //bind to default port 
//yada yada... 
//user enters new port to listen on 5556 
replier.Bind("tcp://*:5556); 

什麼是做到這一點的正確方法?請解釋答案背後的邏輯。

回答

0

我不確定C#綁定,但您可以使用普通的C API重新綁定zmq套接字,並立即開始在新端口上接收消息。逗留期與你的情況無關。

+0

好的,謝謝。我讀過,你必須設置低點並關閉插槽,然後才能在C中釋放,以便安全關閉。不知道這是否適用於重新綁定到另一個端口。我將嘗試一個簡單的重新綁定來查看它是否可以工作 – ComradeJoecool

+0

只需在另一個端口上再次調用Bind()將允許我開始在該新端口上接收消息,但舊端口不能被其他端口綁定。 – ComradeJoecool

+0

這是因爲一個zmq套接字可以綁定到多個網絡套接字,所以第二個綁定調用會添加一個額外的tcp連接,而不是替換現有的連接。 – David

相關問題