gpt4 book ai didi

c++ - 使用 0MQ 通过 TCP 连接到第一个空闲端口

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:20 28 4
gpt4 key购买 nike

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

我想这是正确的做法:

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

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

最佳答案

在 Zeromq 中,您可以使用字符串来绑定(bind)或连接。它以协议(protocol)开头,tcp:// 在您的情况下,这没问题。然后你有一个代表所有可用设备的 '*'。然后在您的案例中以端口号 :0 结尾。

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

会尝试在端口 2424 上绑定(bind)。如果你运行 man zmq_tcp 他们建议端口号高于 1024。基本上你应该提前知道你的端口号,而不是在绑定(bind)之后。在较新的 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希望这有帮助

关于c++ - 使用 0MQ 通过 TCP 连接到第一个空闲端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16699890/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com