es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

ZMQ_DEALER con ZMQ_REP

Lamento esta pregunta un tanto estúpida, pero no encontré ninguna otra respuesta. ¿Cómo puedo enviar un mensaje desde ZMQ_DEALER a ZMQ_REP?

Aquí está el código del servidor:

std::string ans;
zmq::context_t context;
zmq::socket_t socket(context, ZMQ_DEALER);
int port = bind_socket(socket);
std::cout<<port<<std::endl;
std::cout<<"enviando\n";
send_message(socket,"test");
std::cout<<"ÉXITO\n";
std::cout<<"intentando recibir mensaje del cliente...\n";
ans=receive_message(socket);
std::cout<<"ÉXITO TOTAL\n";
std::cout<<ans<<std::endl;
close(port);

y aquí está el código del cliente:

zmq::context_t context;
zmq::socket_t socket(context, ZMQ_REP);
std::string recv;
recv=receive_message(socket);
std::cout<<"éxito total\n";
send_message(socket,"éxito");
std::cout<<recv<<std::endl;

El cliente no puede recibir el mensaje del servidor. Intenté encontrar algo en el libro oficial de ZeroMQ y encontré esto:

“Cuando un socket ZMQ_DEALER está conectado a un socket ZMQ_REP, cada mensaje enviado debe constar de una parte de mensaje vacía, el delimitador, seguido de una o más partes del mensaje.”

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para enviar un mensaje desde un ZMQ_DEALER a un ZMQ_REP, es necesario asegurarse de que cada mensaje enviado consista en una parte de mensaje vacía como delimitador seguida por una o más partes de cuerpo. Esto se debe a que cuando un socket ZMQ_DEALER está conectado a un socket ZMQ_REP, la parte de mensaje vacía actúa como un identificador de solicitud que el socket ZMQ_REP puede utilizar para asociar la solicitud con la respuesta correspondiente.

    Por lo tanto, en el código del servidor, es necesario modificar la función send_message para incluir una parte de mensaje vacía como el primer marco del mensaje. La función modificada debería lucir así:

    void send_message(zmq::socket_t &socket, const std::string &message) {
    
        // Enviar parte de mensaje vacía como delimitador
        zmq::message_t delimiter(0);
        socket.send(delimiter, zmq::send_flags::sndmore);
    
        // Enviar cuerpo del mensaje
        zmq::message_t msg(message.size());
        memcpy(msg.data(), message.data(), message.size());
        socket.send(msg, zmq::send_flags::none);
    }
    

    En el código del cliente, también es necesario modificar la función send_message para incluir una parte de mensaje vacía como el primer marco del mensaje antes de enviar el mensaje de respuesta. La función modificada debería lucir así:

    void send_message(zmq::socket_t &socket, const std::string &message) {
    
        // Enviar parte de mensaje vacía como delimitador
        zmq::message_t delimiter(0);
        socket.send(delimiter, zmq::send_flags::sndmore);
    
        // Enviar cuerpo del mensaje de respuesta
        zmq::message_t msg(message.size());
        memcpy(msg.data(), message.data(), message.size());
        socket.send(msg, zmq::send_flags::none);
    }
    

    Con estas modificaciones, el cliente debería poder recibir la solicitud del servidor y enviar una respuesta de vuelta.

Comments are closed.