3

私のCアプリケーションには、このZeroMQメッセージ送信コードがあります

void *socket= zmq_socket (context, ZMQ_DEALER);
// ...
zmq_msg_t zmsg;
zmq_msg_init_size (&zmsg, msg_size);
memcpy(zmq_msg_data (&zmsg), content, msg_size);
zmq_msg_send (&zmsg, socket, 0);
zmq_msg_close(&zmsg); 
sleep (1);

これは実際には機能しますが、メッセージをフラッシュするために sleep(1) を呼び出さなければならないという事実は好きではありません。そのままにしておくと、サーバーにメッセージが届きません。スリープを呼び出さずにソケット上のメッセージを「フラッシュ」する他の可能性はありますか? ZeroMQ v3.2.2 を使用しています。

どうもありがとうございました!

編集: この動作は、デバッグ モードでのみ発生するようです。

4

2 に答える 2

1

ソケット オプションを 0 に設定しZMQ_LINGER、メッセージを閉じた後にソケットを閉じてみてください。

zmq_setsockopt(socket, ZMQ_LINGER, 0, sizeof(int));
...
zmq_close(socket);
于 2013-02-05T12:47:41.487 に答える
1

必ずソケットを閉じてコンテキストを終了してください。 zmq_term()送信されていないメッセージがなくなるまで戻りません。ソケットに LINGER を設定して、メッセージを破棄するまでの待機時間の上限を指定できます。デフォルトの動作は、永久に待機することです。

void *socket= zmq_socket (context, ZMQ_DEALER);
// ...
zmq_msg_t zmsg;
zmq_msg_init_size (&zmsg, msg_size);
memcpy(zmq_msg_data (&zmsg), content, msg_size);
zmq_msg_send (&zmsg, socket, 0);
zmq_msg_close(&zmsg);
zmq_close(socket);
zmq_term(context); // this will block until the message is actually sent
于 2013-02-06T06:20:01.717 に答える