2009-09-03 16 views
3

Unixドメインソケットを介してサーバープロセスに接続するクライアントアプリケーションを作成しています。サーバープロセスが実行されていない場合は、サーバーが起動してソケット上の接続を待機するまでクライアントを待機させます。Unixドメインソケットがバインドされるのを待つ

現在、私はそれが成功したソケットに接続するまで()秒ごとに接続する呼び出すクライアントでの再試行ループを持っています。

単に特定の名前のソケット(例えば「は/ var/mysock」)までブロックされます私が呼び出すことができる任意の関数がありますが作成され、サーバー・プロセスにバインドされていますか?

答えて

2

ない完全な答えは、しかし...

あなたは、Linuxにしている場合は、inotifyインタフェースは、操作の最初の数に有用手順Aあなたがトラップできるようになる:

  • unlink「INGの残りの元のソケットはIN_DELETE_SELFを起動します。
  • bind 'を実行すると、親ディレクトリにIN_CREATEがトリガーされます。

残念ながら、サーバーはlisten 'までconnect'できません。これは次の論理的なステップですが、すぐにそのようにする保証はありません。それはinotifyがそれへのインタフェースを提供しているかのようには見えません。

+0

有用な提案をありがとう - 間違いなくスタートです。私はSolarisだけでなくLinuxもサポートする必要がありますが、SolarisにはFAMという同様の機能があるようです。 – James

1

私は、これは非常に古い質問です知っているが、これは同じ問題でGoogleを経由してここに到着した新規参入者を助けるかもしれません。

は移植性が懸念される場合、それは常にあるべき基本理念として、あなたはそれをやっている方法は、完全に正しいです。時には明白な解決策も正しいものです。あなたのtryループで、そう頻繁にconnect()を試みるのオーバーヘッドが心配な場合は代わりにソケットにstat()を行うと、それが動作するかどうか、それは本当にstat.hから来S_ISSOCK()マクロを使用してソケットであることを確認します。一度だけ真実ならば、connect()を試してみてください。

サーバが起動するのが待機している間、クライアントアプリケーションがまたは他の仕事をしてしなければならないことができればあなたは空想の非同期通知を心配する必要があります唯一の時間です。これは典型的なことではありませんが、あなたがそれをしたい場合があります。この場合、私は単に別のスレッドで接続を試みます。ここには微妙な違いがありますが、それが適切だと思うのであれば入り込むことができますが、シンプルな「サーバが生きてくるのを待つ」タイプのループにとっては残念だと思います。

関連する問題