我正在编写一种分布式搜索算法,其中代理需要在TCP套接字上侦听传入连接。在某些时候,代理应绑定一个空闲的TCP端口。端口号并不重要,但代理应将其侦听端口号发送给其他代理。
我想这是正确的做法:
socket.bind("tcp://*:0");
套接字成功绑定但是,如何获取套接字绑定的端口号?我在zmq_getsockopt
手册页中看不到任何返回端口号的选项代码。
答案 0 :(得分:15)
使用Zeromq,您可以使用字符串进行绑定或连接。它以protecol开始,tcp://
在你的情况下,这是好的。然后你有'*'
代表所有可用的设备。然后你以你的情况下的端口数:0
结束。
socket.bind("tcp://*:2424)
尝试在端口2424绑定。如果你运行man zmq_tcp,他们建议端口号高于1024.基本上你应该提前知道你的portnumber,而不是绑定后。在较新的版本3.2中,也可以指定端口:0或:*然后os将决定端口的位置。这可以使用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 希望这有帮助