1

サーバーとクライアントの間にあるある種のゲートウェイを作成しようとしています。いわゆるゲートウェイは、クライアントから送信された一部のパケットをフィルタリングし、それらの 99% を転送することになっています。

ここに私の質問があります:

  1. クライアントはゲートウェイへの新しいソケットを開きます。ゲートウェイからサーバーへのソケットを開き、後で使用するためにリストに保存します。ただし、ある状況では、すべての接続が同じ IP から来ているため、パケットをサーバーに転送するソケットを選択する際の選択肢が限られています。開いているソケットを区別するにはどうすればよいですか?

  2. 以前の状況から、毎秒約 500 のクライアントがパケットを送信すると予想しています。パフォーマンスに関しては、マルチスレッド モデルを使用するべきですか、それともシングル スレッド アプリケーションを使用するべきですか?

  3. まだパフォーマンスの問題: C# と Python のどちらかを選択する必要があります。どちらがより良いパフォーマンスを提供する必要がありますか?

4

1 に答える 1

1

ソケット アドレスは、単なるホストではなく、ホストとポートです。また、同じホストからの異なる接続には、常に異なるポートがあります。(ここでは、UDP ではなく TCP を想定しています。)

または、さらに単純に、ピア アドレスの代わりにファイル記述子 (または、Python ではソケット オブジェクト自体) を比較することもできます。

一方、パフォーマンスに関しては、ほとんどのプラットフォームで 500 がスレッドでできることの限界に近づいていますが、まだ限界を超えていないため、そのようにすることができます。しかし、シングルスレッドのリアクターまたは小さなスレッドプールを備えたプロクターを使用したほうがよいと思います。特に、Twisted や gevents などの既存のフレームワークを使用して難しい部分を処理できる場合はなおさらです。

言語に関して言えば、パケットを転送したりフィルタリングしたりするだけなら、ソケットの多重化のパフォーマンスがすべてなので、Python を使用しても問題はありません。どちらかの言語から好きなフレームワークを選び、その言語を使用してください。

最後のサイド コメント: TCP パケットが上位レベルのプロトコルのメッセージと一致しないことはわかっていますよね? また、Linux または BSD ボックスをルーターとして設定すると、フィルター以外は何も作成する必要がなくなるため、おそらくこの全体がはるかに簡単で効率的になります。

于 2013-10-19T20:34:34.663 に答える