2013-06-18 14 views
5

Próbuję ponownie napisać jeden z naszych starych serwerów przy użyciu ZeroMQ, bo teraz mam następującą konfigurację serwera, (który działa dla żądań Zmq):Czy ZeroMQ może być używany do akceptowania tradycyjnych żądań gniazd?

using (var context = ZmqContext.Create()) 
    using (var server = context.CreateSocket(SocketType.REP)) { 
     server.Bind("tcp://x.x.x.x:5705"); 

     while (true) { ... } 

Taka konfiguracja działa w porządku, gdybym korzystania z biblioteki klienta Zmq połączyć context.CreateSocket(SocketType.REQ)

Ale niestety mamy wiele starszych kod, który musi połączyć się z tym serwerem i gniazda są tworzone przy użyciu gniazda bibliotekami .NET:

Socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
    Socket.Connect(ipAddress, port); 

tam jest sposób na pisanie serwer ZeroMQ, aby zaakceptować te tradycyjne połączenia gniazd .net?

Odpowiedz

11

Można to osiągnąć stosując ZMQ_STREAM sockets.

Należy pamiętać, że od wersji zerowej 4.x, opcja routera RAW has been deprecated dla nowego typu gniazda ZMQ_STREAM, która działa tak samo, jak ROUTER + RAW.

Wygląda na to, że ewoluuje.

Niedawno wypróbowałem gniazda ZMQ_STREAM w wersji 4.0.1.

Możesz go otworzyć, używać zmq_rcv, dopóki nie otrzymasz całej wiadomości (musisz to sprawdzić samodzielnie) lub zmq_msg_rcv, aby umożliwić obsługę ZeroMQ. otrzymasz identyfikator część wiadomość, podobnie jak identyfikator można znaleźć w ROUTER gniazd , bezpośrednio po którym następuje jeden TYLKOciała części. Nie ma między nimi pustego ogranicznika, tak jakby używał on gniazda REQ rozmawiającego z gniazdem . Jeśli więc je wytyczysz, pamiętaj o dodaniu go samemu.

Uwaga: jeśli na drugim końcu występuje opóźnienie lub jeśli Twój komunikat przekracza liczbę buforów ZeroMQ ZMQ_STREAM (moje mają długość 8192 bajtów), wiadomość może zostać zinterpretowana jako zeroMQ jako seria wiadomości.

W takim przypadku będziesz otrzymywać jak najwięcej różnych komunikatów ZeroMQ tym zarówno identyfikatora części i części ciała, a to jest zadanie, aby je zsumować, wiedząc, że jeśli kilka klienci mówią do gniazda STREAM mogą się pomylić. Osobiście używam tabeli mieszania używającej binarnego identyfikatora jako klucza i usuwam wpis z tabeli, gdy wiem, że wiadomość jest kompletna i wysłana do następnego węzła.

Wysyłanie przez ZMQ_STREAM z zmq_msg_send lub zmq_send działa bez zarzutu.

3

Prawdopodobnie musisz użyć typu gniazda RAW zmq (zamiast REP), aby łączyć się z danymi klienta i odczytywać je bez frameworowania specyficznego dla zmq.

HTTP Server w C (z blogu Pietera)
http://hintjens.com/blog:42

RAW Socket informacji typu
https://github.com/hintjens/libzmq/commit/777c38ae32a5d1799b3275d38ff8d587c885dd55

+0

Hej, @Raffian, dziękuję, ale nie wiem, jak to zaimplementować. Nie ma typu SocketType RAW, czy masz przykład, który możesz podać? –

+1

Tak, oto jeden napisany przez Pietera, http://hintjens.com/blog:42, to w zasadzie serwer HTTP używający zmq surowych gniazd, jest w C, ale powinieneś być w stanie przenieść go do .net, o ile. net obsługuje gniazdo 'RAW', wiem, że czysta biblioteka Java zmq (jeromq) nie ... mam nadzieję, że to pomoże. – raffian

+0

Dziękuję @ Raffian, nie mogę połączyć bezpośrednio z biblioteką ZMQ, używam clrzmq, implementacji .Net, więc to może nie być możliwe –

Powiązane problemy