2017-08-21 1 views
4

Je suis en train de recevoir un message multi-parties en utilisant un sous-modèle/pub dans ZMQ 4.2.3 et cppzmq Je suis en mesure d'envoyer et de recevoir des messages en partie seule mais quand j'essaie de lire dans la deuxième image sa taille est toujours 0. Ce qui m'a complètement déconcerté est une version C# en utilisant NetMQ lit la deuxième image sans problème, me faisant croire qu'il est envoyé correctement. Je sais qu'il me manque quelque chose, mais aujourd'hui c'est mon deuxième jour d'essayer de comprendre ce qui ne va pas.ZeroMQ Multipart message deuxième partie 0 taille

Voici mon code pub

#include <iostream> 
#include "zmq_addon.hpp" 
void main() 
{ 
    zmq::context_t ctx = zmq::context_t(); 
    zmq::socket_t pub = zmq::socket_t(ctx, zmq::socket_type::pub); 
    try 
    { 
     //binding using localhost gives an error about invalid device? 
     pub.bind("tcp://*:8845"); 
    } 
    catch (...) 
    { 
     std::cout << zmq_strerror(zmq_errno()); 
     std::cin.get(); 
     return; 
    } 
    byte topic = 8; 
    std::string id = "ragefire.bob"; 
    while (true) 
    { 
     std::cout << "Spam\n"; 
     pub.send(id.c_str(), id.length(), ZMQ_SNDMORE); 
     pub.send("foo", 3); 
    } 
} 

Et mon C++ sous le code

#include <iostream> 
#include "zmq_addon.hpp" 
int main() 
{ 
    zmq::context_t ctx = zmq::context_t(); 
    zmq::socket_t sub = zmq::socket_t(ctx, zmq::socket_type::sub); 
    sub.connect("tcp://localhost:8845"); 
    std::string id = "ragefire.bob"; 
    sub.setsockopt(ZMQ_SUBSCRIBE, id.c_str(), id.length()); 
    while (true) 
    { 
     zmq::message_t msg; 
     if(sub.recv(&msg,ZMQ_NOBLOCK)) 
     { 
      auto rpl = std::string(static_cast<char*>(msg.data()), msg.size()); 
      std::cout << "Recv returned true! " << rpl << "\n"; 
      int more; 
      auto more_size = sizeof(more); 
      sub.getsockopt(ZMQ_RCVMORE, &more, &more_size); 
      while (more) 
      { 
       zmq::message_t moreMsg; 
       sub.recv(&msg); 
       std::string moreRpl = std::string(static_cast<char*>(moreMsg.data()), moreMsg.size()); 
       std::cout << "There's more! " << moreRpl << "Size is " << moreMsg.size() << "\n"; 
       sub.getsockopt(ZMQ_RCVMORE, &more, &more_size); 
      } 
     } 
     else 
      std::cout << "Recv returned false! " << zmq_strerror(zmq_errno()) << "\n"; 
    } 
} 

Avec une sortie de

Recv returned true! ragefire.bob 
There's more! Size is 0 

Pour être complet, mon NetMQ sous qui peut lire les deux les cadres

static void Main() 
{ 
    SubscriberSocket sub = new SubscriberSocket("tcp://localhost:8845"); 
    sub.SubscribeToAnyTopic(); 
    while (true) 
    { 
     NetMQMessage msg = sub.ReceiveMultipartMessage(); 
     Console.WriteLine($"Received! {Encoding.ASCII.GetString(msg.First.Buffer)}"); 
     Console.WriteLine($"Received! {Encoding.ASCII.GetString(msg[1].Buffer)}"); 
    } 
} 

Répondre

2

Votre appel initial à sub.recv() reçoit le message dans &msg, ce qui est bien.

Votre appel ultérieur à sub.recv() reçoit également dans &msg, mais vous signalez alors environ moreMsg. Si vous voulez vraiment garder un deuxième message_t autour, faire

sub.recv(&moreMsg); 
+0

Wow, je ne peux pas croire que j'ai raté, ça me rend fou, je vous remercie! –