6

コンテキスト:Linux(Ubuntu)、C、ZeroMQ

ipc://SUB ZeroMQソケット(物理的にはUnixドメインソケット)でリッスンするサーバーがあります。

ソケットに接続し、そのメッセージを公開して切断する必要があるクライアントがあります。

問題:サーバーが強制終了された場合(または不自然に停止した場合)、ソケットファイルはそのまま残ります。クライアントがこの古いソケットに接続しようとすると、でブロックされzmq_term()ます。

サーバーが存在しない場合にクライアントがブロックされないようにする必要がありますが、サーバーが稼働しているがビジー状態の場合は配信を保証します。

外部の魔法(PIDファイルのチェックなど)によってサーバーの存続期間を追跡できないと仮定します。

ヒントはありますか?

4

4 に答える 4

4

移植性のない解決策は、/proc/net/unixそこでソケット名を読み取って検索することです。

于 2011-05-04T05:10:51.800 に答える
1

あなたのコードを示さずに、これはすべて当て推量です...それは...

PUB / SUBペアがある場合、PUBはメッセージが確実に届くようにハングアップします。おそらく、適切なタイプのzmqペアを使用していません。代わりにREP/REQペアがあるように聞こえます。

このように、クライアント(REQ側)から接続するとzmq_poll、ソケットが書き込み可能かどうかを判断するためにを実行できます。はいの場合は書き込みを続行し、そうでない場合はクライアントをシャットダウンしてエラー状態を処理します(システムのエラーの場合)。

于 2011-04-28T23:13:56.163 に答える
0

別の解決策があります。ipc://ソケットは使用しないでください。代わりに、tcp://127.0.0.101:10001のようなものを使用してください。ほとんどのUNIXでは、OSがローカル接続であると認識し、完全なIPスタック処理をショートカットするため、IPCとほぼ同じ速度になります。

于 2011-07-01T02:10:19.160 に答える
0

おそらく、独自のネイティブソケットを使用して、最初にソケットへの接続を試みることができます。接続が成功した場合、パブリッシャーが正常に動作する可能性が非常に高くなります。

于 2011-04-26T23:44:36.787 に答える