2017-01-27 5 views
2

Я пытаюсь соединиться между клиентом 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++ сервера, и я до сих пор получить то же пустое сообщение.

ответ

1

Необходимо отправить буфер, а не указатель.

publisher->send(responseMsg, 0); 

сделал трюк, когда я проверил ваш код.

Надеется, что это помогает, Ханну

+0

Г! Хорошо подмечено. Кажется, есть некоторая логика разницы между двумя: https://github.com/zeromq/cppzmq/issues/69 –

+0

Вот почему я лично предпочитаю Python.Подобные ошибки происходят все время с вариантами C, и их трудно обнаружить, если местоположение памяти не изменяется, что приведет к ошибке сегментации, и легко провести часовые отладки в неправильных местах. Рад помочь. Обычно им просто нужна другая пара глаз. – Hannu