Используйте Content-Length, определенно каждый раз, когда я это знаю; для загрузки файлов проверка размера файла незначительна с точки зрения ресурсов. Для передачи пакетов мы не просматриваем тело сообщения для пары CRLF. Сначала он считывает указанное количество байтов, а затем считывает еще два байта, чтобы подтвердить, что они CR и LF. Если это не так, тело сообщения плохо сформировано, и либо размер был указан неправильно, либо данные были повреждены.
Для получения более подробной информации читайте RCF, который говорит
Сервер, с использованием блочной кодирования передачи в ответ НЕ ДОЛЖЕН использовать прицеп для любых полей заголовка, если по крайней мере один из следующих не верно:
a) запрос включал поле заголовка TE, которое указывает, что «прицепы» - это , приемлемые в передаточном кодировании ответа, как описано в разделе , раздел 14.39; или,
б) сервер является сервер происхождения для ответа, поля прицепа полностью состоять из необязательных метаданных, и получатель может использовать сообщений (в форме, приемлемой для сервера происхождения) без приема этого метаданные. Другими словами, исходный сервер желает принять возможность того, что поля трейлера могут быть пустыми , отброшенными по пути к клиенту.
способ определить длину тела сообщения:
Если заголовок имеет Transfer-Encoding и поблочного является окончательным кодирование, то длина тела сообщения определяется путем считывания и декодирования фрагментов данных, пока кодирование передачи не указывает на то, данные завершены.
Если заголовок имеет Transfer-Encoding, а передача каналов не является окончательным, то длина тела сообщения определяется путем считывания соединения до его закрытия сервером.
Если заголовок имеет передаточное кодирование в запросе, а передача каналов - окончательное кодирование, то длина сообщения не может быть надежно определена; сервер ДОЛЖЕН ответить с кодом состояния 400 (Bad Request), а затем закрыть соединение.
Если сообщение получено как с полем заголовка Transfer-Encoding, так и с Content-Length, Transfer-Encoding переопределяет Content-Length. Такое сообщение может указывать на попытку выполнить рассылку ответа запроса и должно быть обработано как ошибка. Отправитель ДОЛЖЕН удалить полученное поле Content-Length перед пересылкой такого сообщения вниз по течению.
Это очень странно. Какой сервер отвечает такой ошибкой? Что у вас есть в заголовке сервера? Если бы у вас был хотя бы один CRLF после 0, вы могли бы что-то сказать, здесь вы все равно могли бы получить некоторые цифры, поэтому это явно ошибка. Или, может быть, ошибка в вашем синтаксическом коде? У вас есть tcpdump или захват проводов? – regilero
Нет, у меня нет таких вещей. Это приложение сокета, которое я написал и использовал в течение многих лет. Но я столкнулся с проблемами с чередующимися данными. Кажется, что все остальное работает нормально, кроме 0 в конце (т. Е. После него нет CRLF). Я читаю байты по одному за раз, когда читаю фрагментированную длину, ища CRLF, поэтому я знаю, что это конец. Затем я конвертирую это значение из шестнадцатеричного в dec и считываю его из сокета. Это когда я прочитал последнее 0 и перечитаю еще один байт, чтобы время от времени выполняло select() в сокете, ожидая ее готовности. – bvstone
, если вы уверены в поступающих данных, тогда сервер неисправен, ссылается на http://stackoverflow.com/a/2127723/550618 – regilero