將ZeroMQ套接字綁定到端點並關閉套接字後,將另一個套接字綁定到同一端點需要多次嘗試。先前調用zmq_bind
,直到成功的一個失敗並出現錯誤「Address in use」(EADDRINUSE
)。ZeroMQ:重新綁定套接字時使用的地址錯誤
下面的代碼演示了此問題:
#include <cassert>
#include <iostream>
#include "zmq.h"
int main() {
void *ctx = zmq_ctx_new();
assert(ctx);
void *skt;
skt = zmq_socket(ctx, ZMQ_REP);
assert(skt);
assert(zmq_bind(skt, "tcp://*:5555") == 0);
assert(zmq_close(skt) == 0);
skt = zmq_socket(ctx, ZMQ_REP);
assert(skt);
int fail = 0;
while (zmq_bind(skt, "tcp://*:5555")) { ++fail; }
std::cout << fail << std::endl;
}
我使用ZeroMQ 4.0.3在Windows XP SP3,編譯器是2008年VS libzmq.dll已建成所提供的Visual Studio解決方案。
這裏打印1
當做一個「調試」版本(上面的代碼和libzmq.dll)和0
使用「版本」版本。奇怪的是,使用混合構建配置(Debug with Release lib)運行上述代碼時,fail
的計數最多爲6.
查看提供的TCP狀態圖,可以在達到SYN_RCVD或ESTABLISHED後輸入'TIME_WAIT'。請注意,重新綁定在程序內工作(幾微秒後)。運行程序*緊密連貫*起作用。 – mkluwe