zmq-cpp: recv () wartet auf Daten, obwohl ZMQ_DONTWAIT gesetzt ist

9

Ich versuche eine nicht-blockierende Empfangsmethode mit ZeroMQ zu implementieren, indem ich das ZMQ_DONTWAIT -Flag benutzt, aber recv() verhält sich so, als würde es ohne das Flag aufgerufen:

%Vor%

sock_ ist ein zmq::socket_t instanziiert als REQ socket.

In diesem Fall ist have_data immer wahr und duration ist was auch immer der REP Server braucht, um zu antworten (0 bis einige hundert Millisekunden).

Beachten Sie, dass ich über die cpp-Bindung von ZeroMQ rede, die in zmq.hpp definiert ist, wobei recv() anders deklariert ist als in zmq.h :

%Vor%

Hier gibt recv() true zurück wenn Daten empfangen wurden und false wenn errno ist EAGAIN

Gibt es irgendwelche Voraussetzungen für ZMQ_DONTWAIT macht recv() sofort zurück?

(Ich verwende zmq Version 4.1.2)

    
frans 29.09.2015, 12:09
quelle

2 Antworten

1

Ja. ( ZeroMQ Vorbedingungen sollten berücksichtigt werden.)

Eine kleine Anmerkung: ZeroMQ erlaubt es, ein setsockopt() einzurichten. mit ZMQ_RCVTIMEO == 0 oder einem leistungsmäßig angemessenen Wert.

Das Hauptproblem ist jedoch im Verhaltensmuster REQ / REP verborgen.

Wenn eine Anwendung auf REQ " springt " rechts in einen Zustand [*] und warte dort auf alles, was vielleicht schon im [REQ]-<Rx> -buffer angekommen ist (was in diesem Anwendungsfall prinzipiell nicht möglich ist) oder dass es zu einem späteren Zeitpunkt kommen wird, aber es gibt ein Problem, da der REP Kontrahent nichts zu beantworten hat und nicht .send() nichts ohne eine vorherige .recv() a REQ Anfrage machen muss und wird.

%Vor%     
user3666197 23.10.2015 01:36
quelle
0

Sie können die ZeroMQ API mit dem Namen czmq aufrufen. Es kommt mit ZeroMQ-Bibliothek. Es hat die Funktion zstr_recv_nowait () Details: zstr Man Seite

Beispiel:

%Vor%     
Denis Zaikin 29.09.2015 12:47
quelle

Tags und Links