У меня есть класс, который наследуется от TcpClient. В этом классе у меня есть метод обработки ответов. В этом методе, который я вызываю, я получаю NetworkStream с MyBase.GetStream и вызываю для него Read.
Это отлично работает, за исключением того, что первый вызов для чтения блоков слишком длинный. И под слишком длинным я подразумеваю, что сокет получил много данных, но не будет их читать, пока не будет достигнут какой-то произвольный предел. Я вижу, что он получил много данных с помощью анализатора пакетов WireShark.
Я установил буфер приема на небольшие суммы и очень маленькие суммы (например, всего на несколько байтов) безрезультатно. Я сделал то же самое с массивом байтов буфера, который я передаю методу чтения, и он все еще задерживается.
Или, говоря иначе. Я скачиваю 600к. Загрузка занимает 5 секунд (при скорости подключения к серверу чуть более 100 тыс./сек., что имеет смысл). Первоначальный вызов чтения занимает 2-3 секунды и сообщает мне, что доступно только 256 байт (256 - это буфер приема и размер массива, в который я читаю). Затем волшебным образом остальные несколько сотен тысяч байтов могут быть прочитаны кусками по 256 байт всего за несколько тактов процесса каждый. Используя анализатор пакетов, я знаю, что за эти начальные 2-3 секунды сокет получил гораздо больше, чем просто 256 байт. Мое соединение не было 0,25k/sec в течение 3 секунд, а затем 400k в течение 2 секунд.
Как получить байты из сокета по мере их поступления?