Ich möchte mit ZeroMQ (Java Bindings, jzmq) Clients mit einem Server verbinden, aber ich brauche die TCP-Informationen schlecht, zum Beispiel die TCP / IP-Adresse einer Client-Anfrage! Das Problem ist, dass ich, um einen Dienst im Netzwerk ankündigen zu können, die TCP-Adresse einer Anfrage abrufen muss, um Clients zu diesem Dienst umleiten zu können. Der Broker ist in diesem Fall eine zentrale "Service Registry". Wenn ich jedoch ZeroMQ-Dienste auf beiden Seiten habe, sehe ich keine Option zum Abrufen dieser Informationen.
Was ich jetzt mache, ist eine Dummy-Verbindung über einen Standard-Socket zum Broker herzustellen. Nachdem die Verbindung hergestellt ist, schnappe ich mir die IP-Adresse für diese Verbindung und schließe die Verbindung wieder. Die IP-Adresse, die abgerufen wurde, wird nun für das Binden mit einem ZeroMQ-Socket an einem zufälligen Port verwendet.
Ich denke, dass diese Lösung die hässlichste Lösung aller Zeiten ist, also: Was ist eine bessere Lösung für dieses Problem?
Grüße.
0MQ bietet aus mehreren Gründen keine Adresse für Peers. Es ist auch nicht so nützlich, da Sie wirklich wollen, dass der Endpunkt Verbindungen empfängt, nicht die Adresse, an der die Verbindung hergestellt wurde.
Was ich normalerweise mache, und es ist elegant genug, binde einen Dienst an einen ephemeren Port, erhalte einen vollständigen Verbindungsendpunkt ("tcp: // ipadresse: port") und sende diesen String in irgendeiner Weise, entweder an Broadcast Kollegen, zu einer zentralen Registrierung usw. zusammen mit meinem Service-Namen. Dann können Peers, die sich zurück verbinden wollen, den Namen des Dienstes nehmen, nach oben suchen, um meinen Endpunkt zu finden, und sich mit mir verbinden.
Ich arbeite mit Version 4.2.1 der API mit der CZMQ-Bindung und habe eine Lösung für meinen Fall gefunden (ZMQ_STREAM). Es funktioniert, indem Sie vor dem Verbinden eine ID festlegen.
Die relevante Socket-Option ist "ZMQ_CONNECT_RID".
ZMQ api über zmq_setsockopt ()
CZMQ api über zsock_set_connect_rid ()
Einige Codes mit redigierten redigierten IPs.
%Vor%Dann bekomme ich diese 2 Nachrichten, wenn eine Verbindung besteht. Der erste Frame ist die ID und der zweite Frame ist beim Verbinden / Trennen für ZMQ_STREAM-Sockets leer.
[Nachricht1]
%Vor%[Nachricht2]
%Vor%Eine weitere Option ist die Verwendung des zmq_socket_monitor () oder czmq zmonitor . Es war eine meiner ersten Lösungen, aber ich war auf der Suche nach etwas leichter. Ich konnte den Endpunkt auf diese Weise erhalten, ohne die ID direkt auf dem Socket zu setzen.
Der Zmonitor-Zactor ermöglicht das Abonnieren von Socket-Ereignissen und sendet dann eine Nachricht mit 3 Frames:
%Vor%Tags und Links sockets zeromq service-discovery jzmq