2009-12-27 2 views
0

У меня есть класс, который наследуется от 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 секунд.

Как получить байты из сокета, когда они входят?

+0

Что еще находится между вашим сетевым адаптером и вашим приложением? Отключите брандмауэр, антивирус, CRL, прокси, посмотрите, что произойдет. –

+0

nobugz, в этом была проблема. Это было мое антивирусное приложение. Он должен буферизировать определенное количество байтов для их сканирования до того, как он отправит его в буфер сокета. Это имеет смысл, потому что я использую хорошо известный порт, который он сканирует. Не могу поверить, что я об этом не думал. Вы должны опубликовать это как ответ, чтобы я мог отметить его как хорошее. – Gilbes

ответ

0

Я тоже сталкивался с этим несколько раз, и это, похоже, связано с проверкой настроек Internet Explorer (настройки прокси-сервера/настройки LAN и т. Д. И т. Д.), Что вызвало задержку в 2-3 секунды.

Классы внутри пространства имен System.Net (то есть WebClient, HttpWebRequest), похоже, делают это автоматически по первому запросу.

Вы можете попробовать отключить или изменить настройки прокси-сервера IE/настройки LAN, в частности, опцию автоматического определения параметров, это может помочь.

Если это не поможет, взгляните на эту статью: Mysterious delay on first use of HttpWebRequest.GetRequestStream. Это не совсем TcpClient, но я думаю, что это та же проблема.

Надеюсь, это поможет.

+0

Это была хорошая идея. Но я отключил обнаружение прокси, в IE и app.config, и это не повлияло на задержку. – Gilbes

1

У меня была аналогичная проблема при написании открытого кода C# network library. Попробуйте установить:

tcpClient.NoDelay = true; 
tcpClient.Client.NoDelay = true; 

Это отключает nagle algorithm, действующий по умолчанию. Это вызывает всевозможные случайные задержки, преднамеренно, при отправке и получении очень небольшого количества данных.

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