私は基本的なC#ソケットサーバーを持っているとしましょう。c#ソケットは着信接続をチェックし、一度に1つの接続しか受け付けません
TcpListener listener = new TcpListener(8888);
listener.Start();
Socket clientSocket = listener.AcceptSocket();
これは、クライアントからの最初の接続を受け入れます。
ただし、着信接続が10件あるとします。私はすべての10の接続を受け入れたくないので、保留中のすべての接続のリストを持っていて、1つの接続を受け入れ、データを交換することを選択します。私はそれらをIPアドレスで識別できると仮定できます。交換が終わったら、ソケットを閉じて別の接続を選択してデータを交換します。
私は一度に1つのクライアントにサービスを提供するので、アクティブな接続を2つ以上持つ必要はありません。
このような偉業は可能ですか?あるいは、私はそれらのすべてを受け入れ、彼らの道を通る必要がありますか?
EDIT:クライアントのタイムアウトは問題ありません。クライアントは、タイムアウトの場合に定期的に接続を再試行するようにプログラムされています。
EDIT2:
私は、検索のかなり後に同様の質問を見つけるために管理しています。あなたが彼らの接続を受け入れるまで、あなたはクライアントを区別することができないようです。
How to reject a connection attempt in c#?
私は、少なくとも接続の試行が始まったIPアドレスを伝えることができると思っていましたが、クライアントに接続するまでは不可能なようです。結局のところ、私はクライアントを通して自分の道を切り開くように見えます。
接続を受け入れて終了することでこれを行うことができますが、待っている接続は時間切れになるとタイムアウトします。 – nhouser9
@ nhouser9クライアントはタイムアウト後に接続試行を再試行するようにプログラムされていますので、私の場合は問題ありません。私は明確にするために質問を編集します。 – xIcarus
次に、パフォーマンス以外の問題はまったくありません。サーバーが長い計算を実行すると、クライアントがかなりの時間待っている可能性があります。ただし、それ以外の場合は、接続を受け入れて閉じ、新しい接続を受け入れることを止めることはありません。 – nhouser9