在ZeroMQ中获取TCP地址信息

Ale*_*eld 9 sockets service-discovery zeromq jzmq

我想使用ZeroMQ(java绑定,jzmq)将客户端连接到服务器,但我需要严重的TCP信息,例如客户端请求的TCP/IP地址!问题是,为了能够在网络中宣布服务,我需要获取请求的TCP地址,以便能够将客户端重定向到该服务.在这种情况下,经纪人是一个中央"服务注册机构".但是,双方都有ZeroMQ服务,我没有看到检索该信息的选项.

我现在所做的是使用标准套接字建立到代理的虚拟连接,在建立连接后,我获取用于此连接的IP地址并再次关闭连接.已检索到的IP地址现在用于在随机端口上使用ZeroMQ套接字绑定它.

我认为这个解决方案是有史以来最丑陋的解决方案,因此:对这个问题有什么更好的解决方案?

问候.

Pie*_*ens 5

出于多种原因,0MQ不提供对等体的地址.它也没那么有用,因为你真正想要的是接收连接的端点,而不是连接的地址.

我通常做的,它足够优雅,是将服务绑定到一个短暂的端口,获得一个完整的连接端点("tcp:// ipaddress:port")并以某种方式发送该字符串,或者向同行广播,到中央注册表等以及我的服务名称.然后,想要连接回来的对等方可以获取服务名称,查找以查找我的端点,然后连接回我.

  • 你能解释一下'将服务绑定到临时端口,更详细地获得一个完整的连接端点("tcp:// ipaddress:port")吗?我需要的确如此.你会怎么做?顺便说一句我爱0MQ,谢谢!=) (3认同)

ZHA*_*kai 5

在 ZMQ 4.x 中,您可以获得字符串属性“Peer-Address”或“Identity”属性。http://api.zeromq.org/4-2:zmq-msg-gets

在 connect() 之前,在另一个对等方中设置了身份。http://api.zeromq.org/4-2:zmq-setsockopt#toc20

例如,

const char *identityString = "identity";
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REQ);
socket.setsockopt(ZMQ_IDENTITY, identityString, strlen(identityString));
socket.connect("tcp://127.0.0.1:5555");
Run Code Online (Sandbox Code Playgroud)

然后另一边:

while(1)
{
    zmq::message_t request;
    if (socket.recv(&request, ZMQ_NOBLOCK))
    {
        const char* identity = request.gets("Identity");
        const char* peerAddress = request.gets("Peer-Address");
        printf("Received from %s %s\n", peerAddress, identity);
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 CppZmq 顺便说一句,您应该能够轻松找到相关调用。