我正在编写一个分布式搜索算法,其中代理需要在 TCP 套接字上侦听传入连接。在某些时候,代理应该绑定一个空闲的 TCP 端口。端口号并不重要,但代理应该将他/她的侦听端口号发送给其他代理。
我想这是正确的做法:
socket.bind("tcp://*:0");
套接字绑定成功,但是如何获取套接字绑定的端口号?zmq_getsockopt
我在返回端口号的手册页中看不到任何选项代码。
使用 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 希望这会有所帮助