2017-02-10 5 views
4

私のアプリケーションでは、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のバグですか?

答えて

1

あなたの

zmq_send()

呼び出しでZMQ_DONTWAITを使用するfeasableことやエラーコードを評価しますか?

につながる

// 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をするために使用することができます一時的に利用できないリソースクローズイベントを検出してさらに送る?これはあなたのアーキテクチャに依存します。

関連する問題