使用0MQ连接到TCP的第一个空闲端口

sor*_*h-r 6 c++ sockets zeromq

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

我想这是正确的做法:

socket.bind("tcp://*:0");
Run Code Online (Sandbox Code Playgroud)

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

het*_*fan 16

使用Zeromq,您可以使用字符串进行绑定或连接.它从protecol开始,tcp://在你的情况下,这是好的.然后你有一个'*'适用于所有可用设备的支架.然后:0以你的情况结束端口数字.

socket.bind("tcp://*:2424)
Run Code Online (Sandbox Code Playgroud)

尝试在端口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;
Run Code Online (Sandbox Code Playgroud)

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

socket is bound at port tcp://0.0.0:53269
Run Code Online (Sandbox Code Playgroud)

所以你仍然需要从字符串"tcp://0.0.0.0:53269"解析53269希望这有助于