Ale*_*eld 9 sockets service-discovery zeromq jzmq
我想使用ZeroMQ(java绑定,jzmq)将客户端连接到服务器,但我需要严重的TCP信息,例如客户端请求的TCP/IP地址!问题是,为了能够在网络中宣布服务,我需要获取请求的TCP地址,以便能够将客户端重定向到该服务.在这种情况下,经纪人是一个中央"服务注册机构".但是,双方都有ZeroMQ服务,我没有看到检索该信息的选项.
我现在所做的是使用标准套接字建立到代理的虚拟连接,在建立连接后,我获取用于此连接的IP地址并再次关闭连接.已检索到的IP地址现在用于在随机端口上使用ZeroMQ套接字绑定它.
我认为这个解决方案是有史以来最丑陋的解决方案,因此:对这个问题有什么更好的解决方案?
问候.
出于多种原因,0MQ不提供对等体的地址.它也没那么有用,因为你真正想要的是接收连接的端点,而不是连接的地址.
我通常做的,它足够优雅,是将服务绑定到一个短暂的端口,获得一个完整的连接端点("tcp:// ipaddress:port")并以某种方式发送该字符串,或者向同行广播,到中央注册表等以及我的服务名称.然后,想要连接回来的对等方可以获取服务名称,查找以查找我的端点,然后连接回我.
在 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 顺便说一句,您应该能够轻松找到相关调用。