2016-02-02 3 views
0

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

+1

После второго zmq_recv(), почему нет еще часть? (просто нет ошибки?). Вы проверили, каково было возвращаемое значение для zmq_send в peer? –

+0

@JayKumarR для краткости Я пропустил пути обработки, которых не бывает. Doh! Я не проверял обратную стоимость партнера, смотря. – ebyrob

+0

Похож на ошибку. Ни при каких обстоятельствах ZMQ не должен возвращать -1 без установки errno. – SergeyA

ответ

1

Типы гнезд Req-rep в zeromq следуют за машиной состояния, поэтому вы можете запросить и получить, в вашем случае вы получите дважды, который не поддерживается. Однако вы можете использовать многостраничные сообщения на стороне сервера при первом вызове отправки с ZMQ_SNDMORE в параметре flags.

Как так:

zmq_send(response, "Part1", 5, ZMQ_SNDMORE); 
zmq_send(response, "Part2", 5, 0); 
Смежные вопросы