Sto cercando di configurare un sistema di comunicazione di base tra client e server usando ZMQ. Sto usando protobuf per il formato del messaggio. Il mio problema è quando invio il messaggio dal client la dimensione del messaggio è 34 ma la dimensione del messaggio ricevuta sul server è 0.
Di seguito è riportato il mio codice;
Client.cpp
tutorial::Person person; person.set_id(1234); person.set_name("john"); person.set_email("[email protected]"); person.set_phonenumber("12345678"); zmq::context_t context (1); // Prepare our context and socket zmq::socket_t socket (context, ZMQ_PAIR); std::cout << "Connecting to server…" << std::endl; int linger = 0;// ms socket.setsockopt(ZMQ_LINGER, &linger, sizeof(linger)); socket.connect ("tcp://127.0.0.1:20000"); std::string msg_str; person.SerializeToString(&msg_str); std::cout << "Size of message string is "<< msg_str.size()<<std::endl; zmq::message_t request (msg_str.size()); memcpy ((void *) request.data (), msg_str.c_str(), msg_str.size()); std::cout << "Sending Person data ..." << std::endl; socket.send (request); socket.close(); google::protobuf::ShutdownProtobufLibrary(); return 0;
Server.cpp:
zmq::context_t context(1); // Prepare our context and socket zmq::socket_t socket(context, ZMQ_PAIR); int linger = 0; // ms socket.setsockopt(ZMQ_LINGER, &linger, sizeof(linger)); socket.bind("tcp://127.0.0.1:20000"); while (true) { zmq::message_t request; int recieved = socket.recv(&request); std::string msg(static_cast(request.data()),request.size()); std::cout<<"Size of message recieved is "<< msg.size()<<std::endl; tutorial::Person person; person.ParseFromString(msg); std::string text_str1; google::protobuf::TextFormat::PrintToString(person, &text_str1); } socket.close();
L’output del client è:
Size of message string is 34
L’output del server è:
Size of message received is 0
Ho provato a provare a passare a ParseToArray anche se non ha aiutato. Ogni tipo di aiuto è apprezzato.
L’ho risolto con un altro modo. In realtà prima ho installato libzmq lib, ma in seguito quando sono passato a libzmq3-dev ha funzionato per me.