7
votes

Comment puis-je recevoir des messages multiparties avec Zeromq?

Je ne peux pas obtenir de wrapper zeromq c ++ pour recevoir des messages multiparber. Le même code utilisant C version C fonctionne tout simplement bien, mais cela conduit à une exception sans explications du tout avec C ++. Le code de manutention multipart est le suivant:

int _tmain(int argc, _TCHAR* argv[])
{
    zmq::context_t context(1);
    zmq::socket_t socket(context, ZMQ_REP);
    socket.bind("tcp://*:5555");

    while(true) {
        // the following two lines lead to exception
        zmq::message_t request;
        socket.recv(&request);

        //zmq_msg_t message;
        //zmq_msg_init (&message);
        //zmq_recv (socket, &message, 0);   
    }

    return 0;
}


1 commentaires

On m'a dit de passer à la dernière version de ZMQ, à part cela que le code est considéré comme une bonne.


3 Réponses :


0
votes

J'ai décidé d'utiliser la version C du code. En général, tous les exemples semblent être dans C de toute façon.


0 commentaires

3
votes

Version probable C du code ne fonctionne pas non plus, mais vous ne vérifiez pas le code de retour de ZMQ_RECV, vous ne le remarquez pas. En outre, lors de la réception de messages MILTIPART, vous devez vérifier s'il y a plus de pièces de message à recevoir via la prise, comme celle-ci:

int64_t more = 0;
size_t more_size = sizeof(more);
socket.getsockopt(ZMQ_RCVMORE, &more, &more_size);
if (more != 0)
{
  //has more parts
}


0 commentaires

2
votes

Je suis aussi un débutant à ZMQ et j'ai aussi dû lutter beaucoup pour comprendre la messagerie multipartite en utilisant rep / req dans zeromq . Je devais passer à travers plusieurs ressources et faire des données de point afin de comprendre cela. Je pense que cette réponse aidera beaucoup de demandeurs dans un avenir proche, c'est pourquoi je partage ici le code client et le code serveur ici. J'ai testé ce code et ça fonctionne parfaitement bien. Cependant, être un débutant, il y a des chances que j'aurais manqué quelque chose de vital. Veuillez partager vos entrées précieuses.

code serveur xxx

code client xxx


1 commentaires

J'apprécie les efforts ici, mais je suis un peu confus. Normalement, je m'attendrais à ce que le client envoie plusieurs cadres de données sur le serveur, mais c'est juste mon cas d'utilisation. Cet exemple donne un sens, mais n'autorisera qu'un seul message de trame avant Exception: l'opération ne peut pas être accompli dans l'état actuel J'aurais préféré un client de recevoir un ensemble de messages multi-messages après chaque touche. le serveur à titre d'exemple