2017-02-10 18 views
4

В одном из моих приложений я использую соединения DEALER/ROUTER inproc. Я установил опцию linger в гнезде DEALER равным 0, так что все сообщения, отправленные в гнездо DEALER, должны быть сброшены после закрытия разъема ROUTER. Хотя это хорошо работает для TCP-соединений, он блокирует forproc. Вот минимальный рабочий пример:Как я могу завершить shutdown zeromq DEALER/ROUTER inproc connections

#include <zmq.h> 

#include <windows.h> 

int main() 
{ 
    void *context = zmq_ctx_new(); 

    void *router = zmq_socket(context, ZMQ_ROUTER); 
    zmq_bind(router, "inproc://socket"); 

    void *dealer = zmq_socket(context, ZMQ_DEALER); 
    zmq_connect(dealer, "inproc://socket"); 

    int linger = 0; 
    zmq_setsockopt(dealer, ZMQ_LINGER, &linger, sizeof(linger)); 

    zmq_close(router); 

    // sleep for 1 ms 
    Sleep(1); 

    // this call blocks 
    zmq_send(dealer, "message", 7, 0); 

    zmq_close(dealer); 
    zmq_ctx_destroy(context); 

    return 0; 
} 

Перед сокет ДИЛЕРА может быть закрыт, блоки вызова zmq_send(). В этом минимальном примере мне пришлось добавить вызов Sleep (1). Когда этот вызов опускается, zmq_send() не блокируется. При блокировании стек вызовов следующим образом:

[External Code] 
libzmq.dll!zmq::signaler_t::wait(int timeout_) Line 253 C++ 
libzmq.dll!zmq::mailbox_t::recv(zmq::command_t * cmd_, int timeout_) Line 80 C++ 
libzmq.dll!zmq::socket_base_t::process_commands(int timeout_, bool throttle_) Line 1023 C++ 
libzmq.dll!zmq::socket_base_t::send(zmq::msg_t * msg_, int flags_) Line 869 C++ 
libzmq.dll!s_sendmsg(zmq::socket_base_t * s_, zmq_msg_t * msg_, int flags_) Line 346 C++ 
libzmq.dll!zmq_send(void * s_, const void * buf_, unsigned __int64 len_, int flags_) Line 371 C++ 

Я использую Windows 10 x64, libzmq 4.2.1 (протестировали его с 4.1.6, а), и Visual Studio 2015. Как можно аккуратно закрыть вниз соединение DEALER/ROUTER? Это ошибка в libzmq?

ответ

1

было бы неприемлемым широкое применение ZMQ_DONTWAIT в вашем

zmq_send()

вызов и оценить ERRORCODE?

Изменение кода

// this call blocks no more 
zmq_send(dealer, "message", 7, ZMQ_DONTWAIT); 
int ec = zmq_errno(); 
printf("code: %d\nstring: %s\n", ec, zmq_strerror(ec)); 

приведет

код: 11

строка: Ресурс временно недоступен

В качестве альтернативы, может ли socket monitor использоваться для обнаружить событие закрытия и предотвратить дальнейшая отправка? Это зависит от вашей архитектуры.

 Смежные вопросы

  • Нет связанных вопросов^_^