Сокет ReceiveAsync слияние пакетов - PullRequest
3 голосов
/ 22 июля 2011

Я намерен получать пакеты данных через сокет, но так как они отправляются от отправителя с высокой частотой, некоторые из них упаковываются в один массив byte. SocketAsyncEventArgs.Buffer затем содержит несколько пакетов, даже если они были отправлены отдельно (проверено с помощью wireshark).

Я уже пытался поставить в очередь входящие пакеты и асинхронно отработать их, но все равно получаю тот же результат.

В чем может быть причина такого поведения?

Ответы [ 2 ]

7 голосов
/ 22 июля 2011

Так работает TCP. TCP-соединение представляет собой двунаправленный поток байтов , и вы должны рассматривать его как таковой. Однократная отправка с одного конца может привести к многократному чтению на принимающей стороне, и наоборот, множественные посылки могут закончиться в одном чтении, и границы сообщений приложения не сохраняются транспортом.

Вы должны буферизовать ввод, пока не узнаете, что у вас есть полное сообщение приложения. Общие подходы:

  • сообщений фиксированной длины,
  • длина перед сообщением,
  • разграничение потока с помощью специального разделителя «конец сообщения».
0 голосов
/ 22 июля 2011

Возможно, я ошибаюсь, но разве это не алгоритм Наггла?Ваши сокеты должны иметь флаг, который отключает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...