このMSDN マガジン 2005 年 8 月の記事で、Daryn Kiely が TCP サーバーを構築する 3 つの方法を説明しています。
3 番目のモデルである非同期モデルは、私のニーズに最も適したモデルですが、その内部動作の詳細を理解するのに苦労しています。
質問 1 - 接続を受け入れるスレッドの数について
この例では、 を呼び出してサーバーを起動するとStart()
、コードは接続を受け入れる 10 個の ThreadPools を作成します。
public void Start()
{
SetupServerSocket();
for (int i = 0; i < 10; i++)
_serverSocket.BeginAccept(AsyncCallback(AcceptCallback), _serverSocket);
}
_serverSocket.BeginAccept
1 つだけを使用できない理由と、10 という数字を使用する理由がわかりませんでした。
質問 2 – 約 0 バイトの受信
ではReceiveCallback()
、0 バイトを受信すると、接続を閉じます。なんで?0 バイトを受信した場合、常にクライアントが接続を閉じたと見なされますか? ここで行ったテストでは、クライアントが接続を閉じると、SocketException でキャッチされる例外が発生します。ここで何か不足していますか?
質問 3 – BeginReceive を再度行う必要性について
何かがソケットで受信された後、BeginReceive に戻されます。なぜ受信を再開する必要があるのですか? これは自動的にすべきではありませんか?
質問 4 – バッファ サイズについて
255 バイトのバッファが使用されます。メッセージの長さがバッファ サイズよりも大きい場合、複数の受信で断片化されることを理解しています。メッセージが断片化されないことを保証するのに十分な大きさのバッファ サイズを設定する必要がありますか、それともメッセージの断片化を処理するコードを提供する必要がありますか (複数の受信を 1 つのバッファに結合するため)。