7

我正在编写一个分布式搜索算法,其中代理需要在 TCP 套接字上侦听传入连接。在某些时候,代理应该绑定一个空闲的 TCP 端口。端口号并不重要,但代理应该将他/她的侦听端口号发送给其他代理。

我想这是正确的做法:

socket.bind("tcp://*:0");

套接字绑定成功,但是如何获取套接字绑定的端口号?zmq_getsockopt我在返回端口号的手册页中看不到任何选项代码。

4

1 回答 1

18

使用 Zeromq,您可以使用字符串来绑定或连接。它从 protecol 开始,tcp://在你的情况下,这没关系。然后你有一个'*'代表所有可用设备的代表。然后:0在您的情况下以端口号结束。

socket.bind("tcp://*:2424)

会尝试绑定端口 2424。如果你运行 man zmq_tcp 他们建议端口号高于 1024。基本上你应该提前知道你的端口号,而不是在绑定之后。在较新的版本 3.2 中,还可以指定端口 :0 或 :* 然后操作系统将决定端口的位置。这可以使用 socket.getsockopt() 检索,如下例所示:

zmq::context_t context(1);
zmq::socket_t sock(context, ZMQ_REP);
char port[1024]; //make this sufficiently large. 
                 //otherwise an error will be thrown because of invalid argument. 
size_t size = sizeof(port);
try{
    sock.bind("tcp://*:*");
}
catch (zmq::error_t&e ){
    cerr << "couldn't bind to socket: " << e.what();
    return e.num();
}
sock.getsockopt( ZMQ_LAST_ENDPOINT, &port, &size );
cout << "socket is bound at port " << port << endl;

例如,这将给出以下输出:

socket is bound at port tcp://0.0.0:53269

所以你仍然需要从字符串“tcp://0.0.0.0:53269”中解析 53269 希望这会有所帮助

于 2013-05-22T19:31:57.703 回答