Я пытаюсь написать клиент/серверное приложение с ZeroMQ. Я написал сервер, который отправляет два сообщения через zmq_send()
один за другим в ответ на сообщение GET_DATA
от клиента.ZeroMQ не может отправить два раза, а затем дважды получать без ничего между
Клиент отправляет GET_DATA
, а затем пытается позвонить zmq_recv()
дважды, чтобы получить оба сообщения, отправленные сервером. К сожалению, второй звонок zmq_recv()
терпит неудачу в клиенте с возвратом -1
и не errno
.
В ответ на GET_DATA
сервер просто вызывает:
zmq_send (responder, "**start**", 9, 0);
zmq_send (responder, "**done**", 8, 0);
Вот код клиента:
#include "stdafx.h"
#include "zmq.h"
int _tmain(int argc, _TCHAR* argv[])
{
printf ("Connecting to server.\n");
void *context = zmq_ctx_new();
void *requester = zmq_socket (context, ZMQ_REQ);
zmq_connect (requester, "tcp://localhost:5555");
char szCommand[] = "GET_DATA";
zmq_send(requester, szCommand, sizeof(szCommand), 0);
char buffer[512];
int nLen = zmq_recv(requester, buffer, sizeof(buffer) - 1, 0);
if(nLen >= 0) printf("%*.*s\n", nLen, nLen, buffer);
nLen = zmq_recv(requester, buffer, sizeof(buffer) - 1, 0);
if(nLen < 0) printf("errno = %s\n", strerror(errno));
printf("done\n");
zmq_close (requester);
zmq_ctx_destroy (context);
fgetc(stdin);
return 0;
}
Выход клиента:
Connecting to Server.
**start**
errno = No Error
done
Может кто-то объяснит, почему второй звонок zmq_recv()
возвращает -1
у клиента?
Примечание: в предыдущей версии я получал errno 9 (что кажется плохим файлом или чем-то еще).
EDIT для потомков: Это было написано на Win32, которые должны использовать zmq_errno()
вместо доступа errno
напрямую, но я только узнал, что позже, так что эта проблема даже вызвать шум здесь.
После второго zmq_recv(), почему нет еще часть? (просто нет ошибки?). Вы проверили, каково было возвращаемое значение для zmq_send в peer? –
@JayKumarR для краткости Я пропустил пути обработки, которых не бывает. Doh! Я не проверял обратную стоимость партнера, смотря. – ebyrob
Похож на ошибку. Ни при каких обстоятельствах ZMQ не должен возвращать -1 без установки errno. – SergeyA