0

たとえば、TCP 経由で多数のクライアントが接続されたサーバーがあり、すべてのクライアントにソケットがあり、すべてのクライアントに送受信スレッドがあります。同じソケットに対して送信機能を呼び出さないため、同時に送信機能を呼び出すことは安全で可能ですか。

安全で問題がなければ、他のクライアントの送信機能をブロックせずに、データをクライアントに同時にストリーミングできますか?

回答ありがとうございます。

4

2 に答える 2

0

「Winsock」のタグからWindowsだと仮定します。

この設計 (接続されたクライアントごとに送受信スレッドを持つ) は、全体として、スケーリングしません。うまくいけば、あなたはそれを認識しており、クライアントの数が非常に限られていることを知っています (それでも、私はこのようには書きません)。

クライアントごとにスレッド ペアを用意する必要はありません。

ノンブロッキング IO と読み取り/書き込み準備完了通知 (select() または完了ルーチンや完了ポートなどのオーバーラップ IO のいずれかを使用) を使用して、単一のスレッドで多数のクライアントにサービスを提供できます。完了ポートを使用する場合、スレッドのプールを設定してソケット IO を処理し、独自のワーカー スレッドまたはスレッド/スレッドプールの作業をキューに入れることができます。

はい、異なるスレッドから一度に多くのソケットに送受信できます。ただし、send/recv へのブロッキング呼び出しをまったく行うべきではないため、これらの余分なスレッドは必要ありません。非ブロッキング呼び出しを行うと、すぐに書き込むことができる量が書き込まれ、関数が返されます。次に、送信された量をメモし、ソケットが次に書き込み可能になったときに通知を求めます。

これは簡単なことではないので、別のアプローチを検討することをお勧めします。.Net を使用している場合は、TcpListener または HttpListener (どちらも完了ポートを使用します) を使用してこれを構築することでうまくいくかもしれませんが、これらを使用して Nagle のアルゴリズムを簡単に無効にすることはできないことに注意してください。 Google の検索ページのオートコンプリートの一部) を使用すると、必要なパフォーマンスが得られない可能性があります。

于 2013-02-11T19:54:26.283 に答える
0

はい、可能でスレッドセーフです。それをテストしたり、そうでなければ IS、IIS、SQL Server などがうまく動作しないことを自分で調べたりすることができたはずです。

于 2013-02-05T21:52:57.707 に答える