在将一个 ZeroMQ 套接字绑定(bind)到一个端点并关闭该套接字之后,将另一个套接字绑定(bind)到同一个端点需要多次尝试。之前对 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 解决方案构建的。

这会在执行“调试”构建(上面的代码和 libzmq.dll 的代码)和使用“发布”构建的 1 时在此处打印 0。奇怪的是,当使用混合构建配置(Debug with Release lib)运行上面的代码时,fail 计数高达 6。

最佳答案

Pieter Hintjens 给了我 on the mailing list 的提示:

zmq_close 的调用启动套接字关闭。这是在一个由 ZeroMQ 启动的特殊“收割者”线程中完成的,以异步和非阻塞地调用 zmq_close。请参阅有关 ZeroMQ 架构的白皮书中的 "The reaper thread"

上面的代码不会等待线程执行实际工作,因此端点不会立即可用。

关于c++ - ZeroMQ:重新绑定(bind)套接字时地址使用错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22656225/

10-14 14:50
查看更多