Я использую клиентский сокет для выполнения HTTP-вызова для получения изображения. Несмотря на то, что вызов recv
получает 36791 байт, буфер имеет только 4 байта в теле ответа (для целей тестирования BUFF_SIZE
было установлено значение 50000). Я пытался сделать последующие вызовы recv, но из последующих вызовов возвращается 0 байтов. Буду признателен за любую помощь, чтобы понять, почему буфер не содержит полного ответа от сокета recv
, как ожидалось.
Вы получаете данные изображения в формате jpeg, а не строку. char *
ожидается, что строки будут заканчиваться нулем, а двоичные данные, вероятно, будут содержать нулевые байты, которые будут рассматриваться как конец строки. Итак, вам нужно найти/реализовать функцию парсинга, которая бы char *
данные и длину данных в качестве отдельного параметра.
И вы действительно никогда не должны ожидать получения всех данных с однократным чтением при чтении сокетов TCP.
спасибо @dewaffled, это имеет смысл, постараюсь это исправить. Я понимаю, что одиночное чтение не является правильной реализацией, просто интересовался буфером и хотел сначала это исправить.
В дополнение к комментарию Штеффена см. «Почему я не должен загружать изображения кода/данных/ошибок, когда задаю вопрос?»
Отвечает ли это на ваш вопрос? Должен ли результат recv() быть равен длине буфера?
Проблема возникла из-за строк с завершающим нулем, как указал @dewaffled, которые использовались std::string(buffer, total)
в качестве решения для создания строки, позволяющей вставлять нулевые символы, вдохновленные этим постом
Пожалуйста, не включайте текст в качестве изображения, а вместо этого используйте правильно отформатированный текст. Кроме того, пожалуйста, опубликуйте достаточно кода и других подробностей, чтобы мы могли действительно понять и в идеале воспроизвести а) что вы делаете (код) б) что вы ожидаете, в) что происходит вместо этого. См. также Как создать минимальный воспроизводимый пример.