2017-09-08 1 views
1

Ich versuche, einfache ZMQ-Anwendung (ROUTER/DEALER) auszuführen.ZMQ Hallo Welt funktioniert nicht

Ich sende einfach eine Anfrage von DEALER an ROUTER, senden Sie es zurück. Aber DEALER kann es nicht empfangen.

Ich laufe es in einem Prozess (ROUTER hat einen eigenen Thread).

#include <zmq.hpp> 
#include <string> 
#include <iostream> 
#include <thread> 

void router() 
{ 
    zmq::context_t context(1); 
    zmq::socket_t socket(context, ZMQ_ROUTER); 
    socket.bind("tcp://*:5561"); 

    while(1) 
    { 
     // Wait for next request from client 
     zmq::message_t reply; 
     socket.recv (&reply); 

     std::cout << "Router: Received request" << std::endl; 

     // Send reply back to client 
     std::string string= "example"; 
     zmq::message_t message(string.size()); 
     memcpy (message.data(), string.data(), string.size()); 

     std::cout << "Router: Sending" << std::endl; 
     socket.send (message); 
    } 
} 

int main() 
{ 
    std::thread t{&router}; 

    // Prepare our context and socket 
    zmq::context_t context (2); 
    zmq::socket_t socket (context, ZMQ_DEALER); 

    std::cout << "Dealer: Connecting to hello world server…" << std::endl; 
    socket.connect ("tcp://127.0.0.1:5561"); 

    for (int i = 0; i != 10; i++) 
    { 
     zmq::message_t request (5); 
     memcpy (request.data(), "Hello", 5); 
     std::cout << "Dealer: Sending Hello " << i << "…" << std::endl; 
     socket.send (request); 

     zmq::message_t reply; 
     socket.recv (&reply); 
     std::cout << "Dealer: Received " << i << std::endl; 
    } 
    return 0; 
} 

Ich habe eine Ausgabe:

Dealer: Connecting to hello world server… 
Dealer: Sending Hello 0… 
Router: Received request 
Router: Sending 
Router: Received request 
Router: Sending 
+0

Ist der Ausgang Sie die * tatsächlichen zeigen * oder * erwartet * ausgegeben? Wir brauchen wirklich beide (richtig beschriftet natürlich). Und haben Sie versucht, einen Debugger zu verwenden, um durch den Code zu gehen, um zu sehen, dass es das tut, was Sie erwarten? –

+0

@Someprogrammerdude Es ist tatsächliche Ausgabe. Ich erwarte, dass Händler sendet msg, Router empfangen msg und sendet etwas an den Händler. Händler erhalten Nachricht und senden an Router usw. Ich weiß, dass es Rennen geben kann und Ausgabe kann in falscher Reihenfolge sein, aber das Wichtigste ist, dass es kein Protokoll gibt: 'Dealer: Received' .... Dealer kann nicht empfangen msg ... Weißt du, warum? – peter55555

+0

Und es gibt zwei Protokolle: 'Router: Empfangene Anfrage ', aber Händler sendet nur eine jetzt ... – peter55555

Antwort

1

Von ZMQ's documentation auf Sockel:

Wenn Nachrichten eine ZMQ_ROUTER Buchse erhalten, werden eine Nachricht Teil der Identität des Ursprungs Peer enthält prepend zu die Nachricht vor der Übergabe an die Anwendung. Die empfangenen Nachrichten sind fair-in der Warteschlange von allen verbundenen Peers. Beim Senden von Nachrichten muss ein ZMQ_ROUTER-Socket den ersten Teil der Nachricht entfernen und verwenden, um die Identität des Peers zu ermitteln, an den die Nachricht weitergeleitet werden soll .

So ändern Sie Ihren Code so etwas wie dieses:

#include <zmq.hpp> 
#include <string> 
#include <iostream> 
#include <thread> 
#include <unistd.h> 
void router() 
{ 
    zmq::context_t context(1); 
    zmq::socket_t socket(context, ZMQ_ROUTER); 
    socket.bind("tcp://*:5561"); 

    while(1) // Fix that infinite loop or your thread won't join 
    { 
     // Wait for next request from client 
     zmq::message_t id; 
     socket.recv (&id); 

     zmq::message_t reply; 
     socket.recv (&reply); 
     std::cout << std::string(static_cast<char*>(reply.data()),reply.size()) << std::endl; 
     std::cout << "Router: Received request" << std::endl; 

     // Send reply back to client 
     zmq::message_t copy_id; 
     copy_id.copy(&id); 
     std::string string= "example"; 
     zmq::message_t message(string.size()); 
     memcpy (message.data(), string.data(), string.size()); 
     std::cout << "Router: Sending" << std::endl; 
     socket.send(id, ZMQ_SNDMORE); 
     socket.send(message); 
    } 
    sleep(1); 
    socket.setsockopt(ZMQ_LINGER, 0); 
    socket.close(); 
    context.close(); 
} 

int main() 
{ 
    std::thread t{&router}; 

    // Prepare our context and socket 
    zmq::context_t context (2); 
    zmq::socket_t socket (context, ZMQ_DEALER); 

    std::cout << "Dealer: Connecting to hello world server…" << std::endl; 
    socket.connect ("tcp://127.0.0.1:5561"); 

    for (int i = 0; i != 10; i++) 
    { 
     zmq::message_t request (5); 
     memcpy (request.data(), "Hello", 5); 
     std::cout << "Dealer: Sending Hello " << i << "…" << std::endl; 
     socket.send(request); 

     zmq::message_t reply; 
     socket.recv(&reply); 
     std::cout << "Dealer: Received " << i << std::endl; 
    } 
    socket.setsockopt(ZMQ_LINGER, 0); 
    socket.close(); 
    context.close(); 
    t.join(); 
    return 0; 
} 
+0

Vielen Dank. Jetzt ist alles klar. – peter55555