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