サーバーがクライアントとして機能できるようにする ASIO を使用してアプリケーションを作成しようとしています。例えば:
相互に通信する必要がある 3 つのサーバーがあります。ネットワーク内の他のサーバーと通信するときに、クライアントとして機能できる必要があります。3 つのサーバーはすべて、UNIX ドメイン ソケットまたは SSL を使用した TCP/IP を介して要求を処理できます。
データの流れは次のとおりです。
1) スタンドアロン クライアントが (UNIX ドメイン ソケット経由で) サーバー A に接続し、要求を送信します。
2) サーバーは要求に応答しようとしますが、応答できない場合は、サーバー B への TCP/IP 接続を開始し (サーバー A はサーバー B のクライアントとして機能します)、要求をサーバー B に転送します。また、サーバーはパケットを「汚染」して、サーバー B にメッセージを別のサーバーに転送しないように指示し、無限ループが作成されないようにします。
3) サーバー B は、要求を処理できる場合、サーバー A に応答します。
4) サーバー B が要求を処理できる場合、サーバー A は応答をスタンドアロン クライアントに返します。
5) サーバー B が要求を処理できない場合、サーバー A はサーバー C、サーバー D、サーバー E などに接続しようとします。
これは機能します...独自のスタンドアロンクライアントを持つサーバーBまで、サーバーAがサーバーBに接続しようとすると同時にサーバーAに接続しようとします。衝突が発生し、両方のサーバーが別のサーバーからの応答を無期限に待機します。期限タイマーを使用すると、無期限の待機を回避できますが、問題は解決しません。
これを行う適切な方法は何ですか?
編集: サーバーを別々のスレッドで実行される 2 つのクラス (サーバーと PeerProxy) に分割しましたが、それでもデッドロックが発生します。
これが私がしたことです。Unix リスナーと TCP リスナーを Server クラスと PeerProxy クラスに分割しました。サーバーには独自の io_service があり、PeerProxy にも独自の io_service があります。サーバーが起動すると、2 番目のスレッドで実行されている PeerProxy も起動します (サーバーの実行をブロックしません)。現在、データの流れは次のようになっています。
スタンドアロン クライアント -> サーバー A (応答できない) -> PeerProxy B -> サーバー B (応答がある) -> PeerProxy B -> サーバー A -> スタンドアロン クライアント
サーバー A が PeerProxy B に接続すると同時に、サーバー B のスタンドアロン クライアントが PeerProxy A に接続すると、デッドロックが発生します。