4

私はソケットプログラミングに関する多くのテキストとコードを読んだので、そのようにすることにしました:

TCP サーバー:

  • ソケットの多重化
  • 非同期入出力

同時に 800 ~ 1200 のクライアント接続を処理できるようにしたいと考えています。クライアント バッファを処理するにはどうすればよいですか? 私が読んだすべての例は、1 つのバッファーだけで機能しました。なぜ人々は次のようなものを使用しないのですか:

typedef struct my_socket_tag {
    socket sock;
    char* buffer;
} client_data;

これで、バッファーをレシーバー スレッドからディスパッチ リクエスト スレッドに渡すことができ、最初のクライアント固有のバッファーが処理されている間、別のソケットで受信を続けることができます。

それは一般的な慣行ですか?私は要点を逃していますか?

次回は私の質問を改善する方法をいくつか教えてください、ありがとう!

4

1 に答える 1

2

例は通常、過度に単純化されています。スケーラビリティは深刻な問題であり、より単純なアプリケーションから始める方がよいと思います。何千ものクライアント接続を処理することは可能ですが、ほとんどのアプリケーションでは、かなり注意深い開発が必要になります。ソケットプログラミングはトリッキーになるかもしれません。

サーバーアプリケーションにはさまざまな種類があります。すべてのタスクに完全に適合する単一のアプローチはありません。考慮すべき詳細はたくさんあります(ストリームまたはデータグラム指向のサービスですか?接続がある場合は永続的ですか?それは、大量の小さなデータ転送、少数の巨大な転送、または大量の巨大な転送を伴いますか?などcetera)。これが、本に一般的な例が見られない理由です。

スレッド化アプローチを選択する場合は、作成するスレッドが多すぎないように注意してください。クライアントごとに1つのスレッドは、通常(常にではありませんが)悪い選択です。場合によっては、パフォーマンスを犠牲にすることなく、(非同期IOを使用して)単一のスレッドですべてを処理することもできます。

そうは言っても、C ++を学び、asio(または同様のフレームワーク)を強化することをお勧めします。スケーラビリティに関連する多くの問題を処理するため、車輪の再発明を行う意味はありません。

オープンソースアプリケーションのアーキテクチャの本(無料で入手可能)を学ぶことができます。あなたが役に立つと思うかもしれないかなりの数の関連する例があります。

于 2012-12-27T18:18:13.760 に答える