非同期ソケットプログラミングで十分に遊んだ後、サーバーがチャンク化されたペイロード(つまり、同じバッファーにある複数の完全なペイロード)を受信していることに気付きました。だから私は次のことを思いついた:
if (bytes_to_read > 0)
{
while (bytes_to_read > 0)
// Get payload size as int.
// Get payload in byte format.
// Do something with payload.
// Decrease the amount of bytes to read.
}
// Wait for more data.
}
そして、パケットの断片化に気づきました(つまり、完全なペイロードが一緒にチャンク化されていると思っていたのは必ずしもそうではありませんでした)。これにより、前のコードが次のように変更されました。
if (bytes_to_read > 0)
{
while (bytes_to_read > 0)
{
// Get payload size as int.
// Check if the payload size is less than or equal to the amount of bytes left to read.
if (payload_size <= bytes_to_read)
{
// Get payload in byte format.
// Do something with payload.
// Decrease the amount of bytes to read.
}
else
{
// We received a fragmented payload.
break;
}
}
if (bytes_to_read == 0)
{
// Wait for more data.
}
else if (bytes_to_read > 0)
{
// Wait for more data where we left off. ***
}
else
{
// Something awful happened.
}
}
***これについてどうすればいいのかさえわからないので、そのためのコードを見たいと思います。未完成のペイロードをバッファの先頭にコピーし、そこからピックアップする必要があると思いました。
私が含めた擬似コードは、私が使用しているBegin * End *メソッドに基づいています(ここにある*Asyncセットのメソッドを使用する必要があることを認識しています-> http://msdn.microsoft.com/en-us /library/system.net.sockets.socketasynceventargs.aspx <-しかし、私の全体的な質問はまだ当てはまると思います)。
私は2つの質問に対する答えを探しています-すなわち:
- このアプローチは正しいですか、それとも何かが足りませんか?
- C#でパケットの断片化を処理する実際の例はどのように見えますか?
編集:私はrawソケットを使用しています。
よろしくお願いします。
編集:JohnSaundersとGregHewgillは、データをストリームとして扱うという点を指摘しましたが、それは、断片化されることがある最後のチャンク化されたペイロードを処理する方法の具体的な例を提供しません。
編集:私はここでジョン・スキートの答えを読みました。これは基本的に私が見た他の答えと同じ線に沿っていますが、私がしなければならないことはすでに得ていますが、それを行う方法はわかっていないので、あまり役に立ちません。
編集:断片化の意味を詳しく説明するには、次の受信バッファーを検討してください。
- 224TEST3foo3bar
- 224TEST3foo3bar224TEST3foo3bar
- 224TEST3foo3bar224TEST3foo
- 3bar224TEST3foo3bar
編集:私はこれとこれが私をここに導くことを見つけました。Vadym Stetsiakはほぼすべてをクリアしました(彼は私が探していた答えの1つでした)。