2016-05-03 11 views
1

私は基本的な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アドレスを伝えることができると思っていましたが、クライアントに接続するまでは不可能なようです。結局のところ、私はクライアントを通して自分の道を切り開くように見えます。

+0

接続を受け入れて終了することでこれを行うことができますが、待っている接続は時間切れになるとタイムアウトします。 – nhouser9

+0

@ nhouser9クライアントはタイムアウト後に接続試行を再試行するようにプログラムされていますので、私の場合は問題ありません。私は明確にするために質問を編集します。 – xIcarus

+0

次に、パフォーマンス以外の問題はまったくありません。サーバーが長い計算を実行すると、クライアントがかなりの時間待っている可能性があります。ただし、それ以外の場合は、接続を受け入れて閉じ、新しい接続を受け入れることを止めることはありません。 – nhouser9

答えて

0

すべての接続を受け入れるわけではありません。1つだけです。 AcceptSocketを実行し、クライアントを処理してから別のクライアントを切断して受け入れることができます。ループはwhile(listener.Pending())です。

+0

はい、しかし、それは私がどのクライアントと対話するかを制御できません。私は接続を受け入れて、私が望むクライアントでなければそれを閉じることができますが、それは同じマシンの重大な問題を何度も何度も繰り返してくる可能性があります。あなたが理解できるように、これらのクライアントは私のマシンであり、私と彼らとデータを交換するのを待っています。私は彼らに一度に一つの指示を送るつもりです。マシンは私のIPを知っていますが、私はそのIPアドレスを知らず、ルーターがサーバー(ポートフォワーディングまたはDMZ)として動作することを保証できません。そのため私はサーバーである必要があり、クライアントである必要があります。 – xIcarus

+0

「接続しているときにクライアントにサービスを提供できないのはなぜですか? – Adrian

+0

私はちょうど接続しているクライアントは必要ないという事実。私は私の質問を十分にはっきりさせなかったら、すごく残念です。look - 通常のアプローチは、(私の例では)10人のクライアントすべてを受け入れ、一度にそれらの1人に書き込むことです。メッセンジャーのように、クライアントとサーバーの間にのみ存在します。私はそれが10の同時接続を維持するのを避け、それらの1つ、つまり必要なクライアント(マシン)を受け入れることができるかどうかを尋ねています。 – xIcarus

関連する問題