2012-06-14 3 views
1

Мне было интересно, когда будет вызван обратный вызов, который предоставляется с вызовом BeginRecieve..NET Socket.BeginReceive: Когда срабатывает обратный вызов

  • При получении такого количества данных, сколько может храниться буфер? И если да - что, если данные меньше, чем буфер)
  • Это когда он получил один пакет TCP/IP?
  • Это что-то еще?

Я нашел similair вопрос, который я буду повторять, как я не могу поставить его гораздо яснее:

Теперь вся документация говорит, что обратный вызов, как указано в BeginReceive, называется, как только «данные получены». Но это довольно расплывчато: когда именно этот момент, если вы не знаете, как именно этот другой процесс предоставляет данные?

Один критерий является то, что BeginReceive() считается завершенной (и, таким образом, callbask называется), когда буфер в состоянии объекта заполняется Шифрование до указанного BufferSize. Но что, если процесс «доставки» подает данные в неизвестных количествах и нерегулярно? Для экземпляра , если он сначала поставляет 100 байт последовательно, а затем - это временной интервал в 1 миллисекунду, а еще 200 байтов: BeginReceive в комплекте с 100 байтами входящих данных? Или 300?

http://www.pcreview.co.uk/forums/exactly-beginreceive-socket-considered-completed-t2899270.html

+0

Я думаю, что это будет зависеть от типа [типа сокета] (http://msdn.microsoft.com/en-us/library/system.net.sockets.sockettype). Сетку датаграммы, скорее всего, вызовет обратный вызов, когда датаграмма будет получена. Сокеты потока могут иметь тайм-ауты, внутренние буферы и т. Д. –

+0

Вы когда-нибудь находили правду об этом. Я нахожусь в поисках ответа, и ответ на этой странице не кажется окончательным. Http: // StackOverflow.com/questions/18418613/socket-buffers-the-data-it-получает –

ответ

0

Мой опыт в том, что он предназначен для любых доступных данных без задержки. Это означает, что чтение может быть довольно маленьким, например, 1400 байтов, потому что это размер MTU.

Считывание может быть кратным тому, что, если пакеты выходят из строя, все они становятся видимыми для приложения, когда приходит логически первый. В этом случае вы получаете возможность считывать из всех смежных пакетов в очереди.

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

Sidenote: Обратный вызов BeginReceive вызван точно в тот же момент, когда Receive вернется. Таким образом, вы не можете уменьшить латентность. (Задержка будет фактически увеличиваться на крошечную сумму, потому что операции async могут иметь более высокие накладные расходы, чем блокирующие).

+0

Для моего сценария кажется, что обратный вызов ** не ** вызывается немедленно - посмотрите: http://stackoverflow.com/ Вопросы/18418613/socket-buffers-the-data-it-получает –

+0

@NielsBrinch Я не вижу доказательств того, что это из-за асинхронности. Синхронный путь кода может иметь такую ​​же проблему. – usr

+0

Я согласен, что это не **, потому что ** async. Но спрашивающий задается вопросом: «Когда срабатывает обратный вызов», и похоже, что «... он вызван для любых доступных данных без задержки» –

0

Если предположить, что сокет является TCP сокет. Затем обратный вызов запускается, когда доступны какие-либо данные, но он доставляет в обратном вызове максимум столько, сколько размер буфера. В любом случае вам нужен протокол кадрирования (это означает, что вам нужно вызвать несколько раз BeginReceive (..) и обнаружить и собрать отправленные вами кадры).

Смежные вопросы