C ++ отправка изображения, но, похоже, не удалось - PullRequest
0 голосов
/ 29 октября 2019

Я внедряю веб-сервер для отправки изображений клиенту. Когда клиентский браузер отправляет запросы на изображения для 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, когда пакет полностью передан. Я попробовал это и до сих пор не работает. Я новичок в области серверов и сетевого программирования. Спасибо за чтение и, пожалуйста, помогите. Это действительно боль в заднице.

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