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