将 ZeroMQ 套接字绑定到端点并关闭套接字后,将另一个套接字绑定到同一端点需要多次尝试。之前的调用zmq_bind
直到成功失败并出现错误“地址正在使用”(EADDRINUSE
).
下面的代码演示了这个问题:
#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;
}
我在 Windows XP SP3 上使用 ZeroMQ 4.0.3,编译器是 VS 2008。libzmq.dll 是使用提供的 Visual Studio 解决方案构建的。
这打印1
在进行“调试”构建时(上面的代码和 libzmq.dll 的代码)并且0
使用“发布”构建。奇怪的是,当使用混合构建配置运行上面的代码时(使用发布库进行调试),fail
数到 6。
Pieter Hintjens 给了我提示在邮件列表上 http://article.gmane.org/gmane.network.zeromq.devel/23345:
致电给zmq_close
启动套接字关闭。这是在由 ZeroMQ 启动的特殊“收割者”线程中完成的,以调用zmq_close
异步和非阻塞。看“收割者之线” http://zeromq.org/whitepapers:architecture#toc6有关 ZeroMQ 架构的白皮书。
上面的代码不会等待线程执行实际工作,因此端点不会立即变得可用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)