У меня плохое понимание того, как правильно работать с 0MZ. Когда я пытаюсь отправить сообщение, инициализированное размером более 29, что-то пойдет не так. Мой код очень прост:ZeroMQ - отправка более 30 байтов с гнездом REQ
zmq::context_t context (1);
zmq::socket_t req(context,ZMQ_REQ);
req.connect("tcp://localhost:6969");
int msgSize = 100;
zmq::message_t test(msgSize);
snprintf((char*)test.data(),msgSize,"short message");
cout << static_cast<char*>(test.data())<< endl; // this is always fine - 'short message'
до сих пор так хорошо, но после отправки этого сообщения, если msgSize
> 29, я не могу получить тот же результат снова
req.send(test);
cout << static_cast<char*>(test.data())<< endl; // now it's gibberish, like '&?+#'
что еще более загадочные, если мой сервер получает сообщение также выглядит как «? & + #» там, но если он посылает его обратно просто с PUB гнездом, я могу читать его снова в моем клиенте:
zmq::message_t reply;
req.recv(&reply);
cout << static_cast<char*>(test.data())<< endl; - 'my message' again!
I понятие также tand, что для коротких сообщений существует ограничение на 29 байтов, но как я могу обойти его, не имея дело с многостраничными сообщениями? Я буквально нуждаюсь в 40 символах ....
В соответствии с документацией 0MQ для [zmq_send()] (http://api.zeromq.org/2-1:zmq-send), успешным вызовом этой функции ('zmq :: socket_t :: send' wraps он) уничтожает сообщение. Таким образом, вы не должны обращаться к члену данных ** после того, как ** сообщение было поставлено в очередь. То, что он работает для небольших сообщений, вероятно, является артефактом реализации. –
Но почему мое сообщение испортилось и на сервере? –
Обратите внимание, что в последних трех строках кода полученное сообщение называется 'reply', но вы все равно печатаете содержимое данных' test'. –