Я пишу 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-тела и написании некоторой логики для остановки.