2017-09-08 9 views
1

J'essaie d'exécuter l'application ZMQ simple (ROUTER/DEALER).ZMQ Bonjour le monde ne fonctionne pas

Je viens d'envoyer une demande de DEALER à ROUTER, renvoyez-le. Mais DEALER ne peut pas le recevoir. Je l'exécute dans un processus (ROUTER a son propre fil).

#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; 
} 

J'ai une sortie:

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

La sortie vous montrer la réelle * * ou * prévu * sortie? Nous avons vraiment besoin des deux (correctement étiquetés bien sûr). Et avez-vous essayé d'utiliser un débogueur pour parcourir le code pour voir qu'il fait ce que vous attendez de lui? –

+0

@Someprogrammerdude C'est la sortie réelle. Je m'attends à ce que le concessionnaire envoie msg, Router reçoit msg et envoie quelque chose au concessionnaire. Le concessionnaire reçoit msg et envoie au routeur etc. Je sais qu'il peut y avoir course et la production peut être dans le mauvais ordre mais le plus important est qu'il n'y a aucun log: 'Dealer: Received' .... Le revendeur ne peut pas recevoir msg ... Est-ce que tu sais pourquoi? – peter55555

+0

Et il y a deux logs: 'Router: Received request' mais Dealer n'en envoie qu'un seul maintenant ... – peter55555

Répondre

1

De ZMQ's documentation sur socket:

Lors de la réception des messages d'une prise ZMQ_ROUTER est précédez un message partie contenant l'identité du pair provenant de le message avant de le transmettre à l'application. Les messages reçus sont en attente équitable parmi tous les homologues connectés. Lors de l'envoi de messages socket ZMQ_ROUTER doit supprimer la première partie du message et utiliser pour déterminer l'identité de l'homologue le message doit être acheminé à.

modifier donc votre code à quelque chose comme ceci:

#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

Merci beaucoup. Tout est clair à présent. – peter55555