После достаточного количества игр с асинхронным программированием сокетов я заметил, что сервер получал фрагментированные полезные нагрузки (то есть: более одной полной полезной нагрузки, находящейся в одном и том же буфере). Итак, я придумал следующее:
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 <- но я думаю, что мой общий вопрос все еще применяется). </p>
Я ищу ответы на 2 вопроса, а именно:
- Правильный ли это подход или я
что-то упустил?
- Что означает рабочий пример
имеем дело с фрагментацией пакетов в
C # похож?
РЕДАКТИРОВАТЬ: я использую сырые сокеты.
Заранее спасибо за вашу помощь.
РЕДАКТИРОВАТЬ: Джон Сондерс и Грег Хьюгилл подняли вопрос о том, как обрабатывать данные как поток, но это не дает мне конкретного примера того, как справляться с последними фрагментами полезной нагрузки, иногда фрагментированными.
РЕДАКТИРОВАТЬ: Я прочитал ответ Джона Скита здесь , который в основном совпадает с другими ответами, которые я видел, но это мне не очень помогает, так как я уже получаю то, что должен сделать, но не как это сделать.
РЕДАКТИРОВАТЬ: Чтобы уточнить, что я имею в виду под фрагментацией, рассмотрим следующие буферы приема:
- 224TEST3foo3bar
- 224TEST3foo3bar224TEST3foo3bar
- 224TEST3foo3bar224TEST3foo
- 3bar224TEST3foo3bar
РЕДАКТИРОВАТЬ: я нашел это и это , что привело меня сюда . Вадим Стецяк очистил почти все (его был один из ответов, которые я искал).