私のアプリケーションでは、DEALER/ROUTER inproc接続を使用しています。 DEALERソケットのlingerオプションを0に設定して、ROUTERソケットが閉じられると、DEALERソケットで送信されたすべてのメッセージが破棄されるようにしました。これはTCP接続でうまくいくが、inprocのためにブロックする。どうすればzeromq DEALER/ROUTERのinproc接続をシャットダウンできますか
#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;
}
DEALERソケットを閉じる前に、zmq_send()呼び出しがブロックされます。この最小限の例では、スリープ(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++
4.2.1(および4.1.6でそれをテストした)libzmq私は、Windowsの10のx64を使用しています、とVisual Studio 2015がどのようにきれいに遮断することができますDEALER/ROUTER接続を切断しますか?これはlibzmqのバグですか?