8

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

現在、クライアントに再試行ループがあり、ソケットに正常に接続されるまで毎秒 connect() を呼び出します。

特定の名前付きソケット ("/var/mysock" など) が作成されてサーバー プロセスにバインドされるまで単純にブロックする呼び出し可能な関数はありますか?

4

2 に答える 2

4

完全な答えではありませんが...

Linux を使用している場合、inotifyインターフェイスを使用すると、操作の最初のいくつかの有用なステップをトラップできます。

  • unlink残りの以前のソケットを 'ing すると、その上で がトリガーIN_DELETE_SELFされます。
  • bind'ing はIN_CREATE、親ディレクトリでトリガーされます。

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

于 2009-09-03T16:12:59.907 に答える
1

これは非常に古い質問であることは知っていますが、これは、同じ問題を抱えて Google 経由でここに到着した初心者に役立つかもしれません。

移植性が懸念事項であり、基本原則として常にそうあるべきである場合、あなたのやり方は完全に正しいです。明白な解決策が正しい場合もあります。connect()頻繁にを試行することのオーバーヘッドが気になる場合は、try ループで代わりstat()にソケットに対して を実行し、それが機能する場合S_ISSOCK()は、stat.h. すべてが真実であることを一度だけ試してみてくださいconnect()

高度な非同期通知について心配する必要があるのは、クライアント アプリケーションがサーバーの起動を待機している間に他の作業を実行できる場合、または実行する必要がある場合だけです。これは一般的ではありませんが、そうしたい場合も想定できます。この場合、別のスレッドで接続を試みるだけです。ここには、適切だと思われる場合に説明できるニュアンスがありますが、単純な「サーバーが起動するのを待つ」タイプのループにはやり過ぎだと思います。

于 2016-07-10T14:06:41.813 に答える