Избегайте использования Thread.Sleep () при чтении сокетов - PullRequest
0 голосов
/ 26 марта 2010

Я пишу программу чтения новостей usenet и вызываю сообщение XOVER id-, чтобы получить все статьи в группе.

Если я использую этот код, я получаю только первые 5 КБ ответа:

        while((read = _networkStream.Read(buffer, 0, 5000)) > 0)
        {
            ret += Encoding.ASCII.GetString(buffer, 0, read);
            if(read < 5000)
                break;

        }

Но если я добавлю Thread.Sleep(100); в цикл, я получу весь список.

Могу ли я сделать это по-другому?

Ответы [ 2 ]

3 голосов
/ 26 марта 2010

Проверка для read < 5000 выйдет из цикла сразу после того, как вы не получите полный буфер. Совсем не гарантируется, что вы получите полный объем данных буфера, поэтому у вас вообще не должно быть этой части. Просто сохраните проверку, чтобы read был > 0 в состоянии while, и все работает правильно, поскольку возвращаемое значение, являющееся положительным, является определенным показателем для успешного чтения.

И причина, по которой он работает, когда вы включаете sleep, заключается в том, что при спящем режиме вы позволяете основному входящему буферу данных заполняться настолько, чтобы в следующем раунде было достаточно данных для полного буфера.

И поскольку в NNTP-соединениях используются несколько команд, вам необходимо будет распознать завершение данных на уровне приложения; функции сокетов вам не помогут, так как они не поймут, как NNTP разграничивает сообщения. Спецификация команды XOVER гласит: «Как только вывод завершен, точка отправляется в строке сама по себе». Поэтому вам нужно будет проанализировать ответ внутри цикла (разделив его на строки, поскольку NNTP ориентирован на строки), и когда вы столкнетесь с точкой в ​​строке, выйдите из цикла.

0 голосов
/ 26 марта 2010

зачем прерывать, когда читается <5000? Вы определенно должны сломаться только тогда, когда прочитали <= 0. извините, не заметил Read (буфер, 0, 5000))> 0.

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