Я пытаюсь соединиться между клиентом Python и сервером на C++ с использованием ZeroMQ, но я изо всех сил стараюсь получить правильный ответ, возвращенный с сервера обратно клиенту.Почему req-rep ZeroMQ дает мне пустой ответ между C++ и Python?
Питон клиент выглядит следующим образом:
import zmq
import time
# Socket to talk to server
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect ("tcp://127.0.0.1:5563")
requestId = 0
while True:
request = "Message %d"%requestId
print ("Sending '%s'.. "%request)
socket.send_string(request)
response = socket.recv()
print ("Response:",response)
requestId += 1
time.sleep(1)
Сервер C++ выглядит следующим образом:
zmq::context_t* context = new zmq::context_t();
zmq::socket_t* publisher = new zmq::socket_t(*context, ZMQ_REP);
unsigned int port = 5563;
std::ostringstream bindDest;
bindDest << "tcp://*:" << port;
publisher->bind(bindDest.str());
zmq::message_t request(0);
bool notInterrupted = true;
while (notInterrupted)
{
// Wait for a new request to act upon.
publisher->recv(&request, 0);
// Turn the incoming message into a string
char* requestDataBuffer = static_cast<char*>(request.data());
std::string requestStr(requestDataBuffer, request.size());
printf("Got request: %s\n", requestStr.c_str());
// Call the delegate to get a response we can pass back.
std::string responseString = requestStr + " response";
printf("Responding with: %s\n", responseString.c_str());
// Turn the response string into a message.
zmq::message_t responseMsg(responseString.size());
char* responseDataBuffer = static_cast<char*>(responseMsg.data());
const int OffsetToCopyFrom = 0;
responseString.copy(responseDataBuffer, responseString.size(), OffsetToCopyFrom);
// Pass back our response.
publisher->send(&responseMsg, 0);
}
Когда я запускаю это, отчеты клиента:
Отправка «Сообщение 0 '..
Отчеты сервера:
Got запрос: Сообщение 0
оказывающей: Сообщение 0 ответ
Но питон получает пустое сообщение:
Ответ: б ''
Если я заменить версию C++, с реализацией в Python следующим образом он работает, как ожидалось:
import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind ("tcp://127.0.0.1:5563")
replyId = 0
while True:
request = socket.recv_string()
print("Received: "+request)
response = request+" response %d"%replyId
print ("Sending response: "+response)
socket.send_string(response)
replyId += 1
Что я делаю неправильно в версии C++?
Update - Проверена версия ...
Чтение вокруг чужих проблем, одна вещь, которую люди предполагают, что различные версии иногда вызывают проблемы. Я дважды проверял, а Python использует v4.1.6, тогда как C++ - на версии 4.0.
Я использую готовые библиотеки C++ отсюда: http://zeromq.org/distro:microsoft-windows, так что я думаю, что это может быть причиной? Я сделал аналогичную настройку для публикации с C++ на Python, и это сработало хорошо, но, возможно, что-то в области Req-Rep изменилось.
Update2 - Это не кажется, версии ...
После много взлома вокруг я наконец-то удалось получить v4.1.6 построить для версии C++ сервера, и я до сих пор получить то же пустое сообщение.
Г! Хорошо подмечено. Кажется, есть некоторая логика разницы между двумя: https://github.com/zeromq/cppzmq/issues/69 –
Вот почему я лично предпочитаю Python.Подобные ошибки происходят все время с вариантами C, и их трудно обнаружить, если местоположение памяти не изменяется, что приведет к ошибке сегментации, и легко провести часовые отладки в неправильных местах. Рад помочь. Обычно им просто нужна другая пара глаз. – Hannu