Получать несколько HTML-содержимого при вызове функции recv ()? - PullRequest
0 голосов
/ 24 октября 2018

Я пишу http-клиент для получения html с веб-сайта.

это код: Я просто добавляю фрагмент кода, который содержит логику, связанную с сокетом, и, следовательно, инициализацию строк(char []) и функции отсутствуют

scanf("%s",&URL);
int c_socket = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr_in urladdress;
urladdress.sin_family = AF_INET;
urladdress.sin_port = htons(PORT);
urladdress.sin_addr.s_addr = inet_addr(URL);

connect(c_socket, (struct sockaddr*) &urladdress, sizeof(urladdress));

char REQUEST[] = "GET / HTTP/1.1\r\n\r\n";
char response[512];
int size_recv,total_recv = 0;
std::string content = " ";
send(c_socket, REQUEST, sizeof(REQUEST), 0);

while((size_recv = recv(c_socket, response, sizeof(response), 0)) > 0 && content[content.length()]!='\n')
{
    content += response;
    memset(response ,0 , sizeof(response));
}
close(c_socket);
printf("%s",content.c_str());

при получении html я получаю несколько html-содержимого, после того как html-код завершен, я снова получаю некоторую часть того же html снова, и это в основном незавершено, кажется, что сервер отправляет более одного файла.

Примерно так:

<!-- header -->
<html> something </html>
<!-- header -->
<html> someth

Я думаю, что это связано с последовательными вызовами функции recv() для получения всех данныхКак вы можете видеть, я поставил условие в цикле while, чтобы автоматически прекращать получать данные, когда они достигают конца, но не останавливаются.

Я не знаю, ожидается ли это или нет, и я должен поставить какую-то другую логику, чтобы прекратить больше вызовов на recv() и если да, то какая логикаНужно ли что-то писать для форматирования данных, чтобы оно содержало только одно html-тело, например, удаление всего после того, как найден тег </html>.

Все сообщения, которые я нашел до сих пор, объясняют, что это ожидаетсячто все данные не принимаются сразу, поэтому я вынужден вызывать recv() несколько раз. Но они, похоже, ничего не говорят о получении более одного html-тела и написании некоторой логики для остановки.

1 Ответ

0 голосов
/ 24 октября 2018

TCP - это потоковый протокол, который означает, что одно чтение может соответствовать нескольким сообщениям или частичному сообщению.

Вам необходимо прочитать заголовок Content-Length, чтобы узнать, сколько байтов вы должнычитать.Если вам случится получить больше байтов, чем вы просили, вам нужно буферизовать эти байты и сохранить их для следующего прочитанного сообщения.

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