個人的な HTML + Javascript チャットに使用する websocketpp ライブラリを使用して、単純なブロードキャスト サーバーをセットアップしました。1つだけ例外を除いて、今まではすべてが完璧でした。このチャットは、同時に 2 人だけを対象としています。3 分の 1 が入ろうとすると、ドアを閉めなければなりません。したがって、ロジックは次のとおりです。
1 -> サーバーがリッスンしています。
2 -> アリスが接続します。
3 -> ボブが接続します。
4 -> サーバーがリッスンを停止します。Alice + Bob にブロードキャストします。
5 -> Carlos は接続を試みますが、ポートが閉じられます。
6 -> ボブが切断します。
7 -> カルロスが接続します。
8 -> サーバーがリッスンを停止します。Alice + Carlos にブロードキャストします。
最初はこれは簡単なことだと思っていましたが、多くのエラーと読書の後、私は単に立ち往生しています。ハンドシェーク プロセス後にサーバーのリッスンを停止することはできますが、その後、message_handler
サーバー側での動作が停止し、クライアントが完全に接続されているにもかかわらず、クライアントからメッセージを取得できません。私は について知ってset_validate_handler
おり、同時に 2 つの接続のみを許可するように既に設定していますが、これによりサーバーはリッスンしたままになります。私が必要としているのは、サーバーがポートでのリッスンを停止する方法です。
私はリスニングを閉じて、この方法ですでに確立された接続を維持しようとしています:
void on_open( connection_hdl hdl )
{
// Insert
m_connections.insert( hdl );
// Stop listening
m_server.stop_listening();
}
ただし、次の出力が得られます。
[2015-07-12 17:06:47] [connect] WebSocket Connection [::1]:58589 v13 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36" / 101
[2015-07-12 17:06:47] [fail] WebSocket Connection Unknown - "" - 0 websocketpp:26 Operation canceled[2015-07-12 17:06:47] [info] Error getting remote endpoint: system:10009 (The file handle supplied is not valid)
[2015-07-12 17:06:47] [info] asio async_shutdown error: system:10009 (The file handle supplied is not valid)
remote_endpoint: The file handle supplied is not valid
クライアントは接続さえできません。それ以外の場合、m_server.stop_listening();
接続の確立後に を使用すると、クライアントは完全に接続されたままになりますが、サーバーはメッセージの受信を停止するか、少なくとも でメッセージを取得できませんvoid on_message( connection_hdl hdl, server::message_ptr msg )
。