3

UDP サーバー/クライアント アプリケーションに取り組んでいます。

サーバーで一度に 40 のクライアントを処理できるようにしたいと考えています。サーバー側で 40 のスレッドを作成し、各スレッドが 1 つのクライアントを処理することを考えました。クライアントは IP アドレスに基づいて区別され、一意の IP アドレスごとに 1 つのスレッドがあります。

クライアントがサーバーにデータを送信するたびに、メイン スレッドがクライアントの IP アドレスを抽出し、この特定のクライアントを処理するスレッドを決定します。この機能を実現するためのより良い方法はありますか?

4

3 に答える 3

2

このプロジェクトを見てみましょう。 http://www.codeproject.com/Articles/16935/A-Chat-Application-Using-Asynchronous-UDP-socketsから始めると非常に役立つと思います。

IPAddress.Any を使用して、サーバーが任意のインターフェイスで送信されるクライアント リクエストを受け入れる必要があることを指定します。特定のインターフェイスを使用するには、IPAddress.Any の代わりに IPAddress.Parse (“192.168.1.1”) を使用できます。次に、Bind 関数は serverSocket をこの IP アドレスにバインドします。epSender は、データの送信元のクライアントを識別します。

BeginReceiveFrom で、クライアントから送信されるデータの受信を開始します。BeginReceiveFrom の最後のパラメーターとして epSender を渡すことに注意してください。AsyncCallback OnReceive は、IAsyncResult の AsyncState プロパティを介してこのオブジェクトを取得し、クライアント要求 (ログイン、ログアウト、およびユーザーへのメッセージ送信) を処理します。OnReceive の実装を理解するには、添付のコードを参照してください。

于 2013-03-28T12:48:53.223 に答える
0

より良い方法は、クライアントごとにスレッドを作成する代わりに、 Proactorパターン( Boost.Asio ライブラリを参照) を使用することです。このようなアプローチを使用すると、アプリケーションのスケーラビリティとパフォーマンスが大幅に向上します (特に、ネイティブの非同期 i/o を備えたプラットフォームでは)。

さらに、この手法を使用すると、スレッド化は同時実行性から切り離されます。つまり、必ずしも複雑なマルチスレッド化をいじる必要はありません。

于 2013-04-30T12:32:32.950 に答える