Я внедряю веб-сервер для отправки изображений клиенту. Когда клиентский браузер отправляет запросы на изображения для html-страницы, сервер намеревается отправить запрошенное изображение обратно, или это следовало бы сделать. Это мой код отправки ответа HTTP. fd - дескриптор исходного файла, cfd - дескриптор клиентского сокета, все в порядке, без заметных ошибок.
::send(cfd, firstLine.c_str(), firstLine.length(),0); // HTTP/1.1 200 OK
response.addHeaderDate(); // Date: xxxxxxxxx
int fd = response.ffd; // file descriptor
// measure file size
int file_size;
file_size = lseek(fd, 0, SEEK_END);
response.addHeaderLength(file_size); // Content-Length: xxx
lseek(fd, 0, SEEK_SET);
// headers
for (auto &item : response.headers) {
const std::string &key = item.first, &val = item.second;
::send(cfd, key.c_str(), key.length(), 0);
::send(cfd, ": ", 2, 0);
::send(cfd, val.c_str(), val.length(), 0);
::send(cfd, "\r\n", 2, 0);
}
::send(cfd, "\r\n", 2, 0); // blank line after headers
char buf[4096];
while (true) {
int len = read(fd, buf, 4096); // read from target file
if (len <= 0) {
break;
}
write(cfd, buf, len); // write to socket
}
close(fd); // close file
Я разрешаю также записывать изображение в локальный файл, и изображение png отображается очень хорошо вИсследователь гномов. Я включил свой маленький сервер и протестировал его с Chrome. Это показывает следующее: экран браузера Chrome показывает значок с разбитым изображением в том месте, где я поместил свой тег img. HTML-файл выглядит так:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
testtest....
<img src="/assets/1.png">
</body>
</html>
Я обратился к инструменту разработки хрома. Проверено поле Content-Length в заголовках, в котором указано 16996, точное количество байтов изображения. Обратился к еще более мощному инструменту wireshark. В нем говорится, что данные файла имеют размер 16996 байт, а «Экспертная информация» гласит:
[Expert Info (Note/Malformed): HTTP body subdissector failed, trying heuristic subdissector]
[HTTP body subdissector failed, trying heuristic subdissector]
[Severity level: Note]
[Group: Malformed]
Это также находится в пакете http для файла html. Я полагаю, что это указывает на корень проблемы, поскольку сообщение не отображается в других пакетах http, хотя я не совсем понимаю его. Я догадался, что я не отправил \ 0, когда пакет полностью передан. Я попробовал это и до сих пор не работает. Я новичок в области серверов и сетевого программирования. Спасибо за чтение и, пожалуйста, помогите. Это действительно боль в заднице.