Kann ZeroMQ verwendet werden, um zu akzeptieren, traditionelle socket-Anfragen?
Ich versuche neu zu schreiben, einer unserer alten Server mit ZeroMQ, für heute habe ich folgende Server-setup (das für die Zmq Anfragen):
using (var context = ZmqContext.Create())
using (var server = context.CreateSocket(SocketType.REP)) {
server.Bind("tcp://x.x.x.x:5705");
while (true) { ... }
Diese Art der Installation funktioniert einwandfrei wenn ich die Zmq-client-Bibliothek zu verbinden context.CreateSocket(SocketType.REQ)
Aber leider haben wir eine Menge von legacy-code, um die Verbindung zu diesem server und die sockets erstellt mit .net-socket-libs:
Socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
Socket.Connect(ipAddress, port);
Gibt es eine Möglichkeit zum schreiben einer ZeroMQ Server akzeptieren diese traditionellen .net-socket-verbindungen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erreichen dies mit ZMQ_STREAM sockets.
Bitte beachten Sie, dass seit zeroMQ 4.x-RAW-option "router" ist veraltet für eine neue ZMQ_STREAM socket-Typ, das funktioniert auf die gleiche Weise als ROUTER + RAW.
Scheint es, ist es gebunden ist, zu entwickeln, obwohl.
Ich habe vor kurzem versucht, ZMQ_STREAM-buchsen in der version 4.0.1.
Können Sie öffnen, verwenden Sie
zmq_rcv
bis Sie die gesamte Nachricht angezeigt (Sie haben zu prüfen, es ist ganz sich selbst), oderzmq_msg_rcv
zu lassen, ZeroMQ umzugehen. Sie erhalten eine identifier message-Teil, genau wie die identifier finden Sie hierROUTER
sockets, direkt gefolgt von einem NUR Körper Teil. Es ist kein leeres Trennzeichen zwischen Ihnen wie es wäre mit einerREQ
Steckdose im Gespräch mit einemROUTER
- Buchse. Also, wenn Sie weiterleiten, werden Sie sicher, dass Sie es sich selbst.Aber Vorsicht: wenn es die Wartezeit auf das andere Ende, oder wenn eine Nachricht länger als ZeroMQ
ZMQ_STREAM
Puffer (bei mir sind 8192 bytes lang), Ihre Nachricht interpretiert werden kann, die von zeroMQ als eine Reihe von Nachrichten.In diesem Fall, Sie erhalten so viele verschiedene ZeroMQ Nachrichten, einschließlich beide der Bezeichner-Teil und der Teil des Körpers, und es ist Ihre Aufgabe, Sie zu aggregieren, Sie, zu wissen, dass, wenn mehrere clients sprechen mit dem
STREAM
socket, könnten Sie verwechselt werden. Ich persönlich benutze eine hash-Tabelle, die über die binäre Kennung als Schlüssel, und löschen Sie den Eintrag aus der Tabelle, wenn ich weiß, dass die Nachricht vollständig ist und an den nächsten Knoten.Dem Absenden durch eine
ZMQ_STREAM
mitzmq_msg_send
oderzmq_send
funktioniert gut so wie es ist.Werden Sie wahrscheinlich haben, um zu verwenden, zmq RAW-socket-Typ (statt REP) für die Verbindung mit und Lesen Daten des Kunden ohne zmq-spezifischen Gestaltung.
HTTP-Server in C (von Pieter blog)
http://hintjens.com/blog:42
RAW-Socket-Typ info
https://github.com/hintjens/libzmq/commit/777c38ae32a5d1799b3275d38ff8d587c885dd55
RAW
- Buchse, ich weiß, die Reine Java-zmq-Bibliothek (jeromq) nicht...hoffe es hilft.