3

ソケットプログラミングについて疑問があります。TCP パケット スニファーを開発しています。Socket.BeginAccept、Socket.BeginReceive を使用してすべてのパケットをキャプチャしていますが、パケットが受信されたときに何かを処理する必要があります。これは高速な操作ですが、数ミリ秒かかるため、もう一度 BeginReceive を呼び出します。

私の質問は、処理中にいくつかのパケットが送信され、BeginReceive を呼び出していない場合はどうなるかということです。パケットは失われていますか、それとも内部でバッファリングされていますか? 制限はありますか?

4

3 に答える 3

2

Linuxの世界では、カーネルがそれらをバッファリングします。Windowsの世界でも同じことができると思います。しかし、最終的にdeltremeが言ったように、バッファはオーバーフローし(間違いなく制限があります)、データがサイレントにドロップされる可能性があります。

パケットあたり数ミリ秒という重いことをしている場合は、スレッドプールを使用してネットワークスレッドを解放することを検討することをお勧めします。つまり、ネットワークスレッドが行う必要があるのは、パケットを取得してキューにスローし、別のスレッドで処理して、ネットワークでのリスニングに戻ることだけです。別のスレッドがこれらのパケットをキューから取得して処理することができます。これは、一度に複数のパケットを処理できるため、オーバーヘッドを節約できる可能性があることです。ここで、キューはバッファとして機能し、キューの大きさを制御したり、独自のドロップポリシーを定義したりできます。

于 2010-04-09T15:20:19.863 に答える
1

TCP は信頼性の高いストリームを提供するため、データが失われることはありません (基盤となるネットワークに障害が発生していないと仮定します)。

両端のOSには、バイトを読み取っていないときにバイトを処理するバッファがあります。これらのバッファには有限のサイズがあり、いっぱいになった場合、TCP にはフロー制御があります。基本的に、送信側はバッファがいっぱいであることを発見し、より多くのスペースが利用可能になるまで送信を停止します。

于 2010-10-30T00:54:17.480 に答える
1

それらはバッファリングされていますが、どのレベルまたは制限が何であるかはわかりません。

http://tangentsoft.net/wskfaq/は、winsock 関連の問題に役立つ優れたリソースです。

于 2010-04-08T07:58:54.763 に答える