Получать данные recv до конца потока (используя HTTP)?
Я впервые пробую C++ сокеты и столкнулся с первым препятствием. Я отправил некоторые данные в Google, используя send
функция (GET / HTTP/1.1\r\n\r\n
), и теперь я пытаюсь получить ответ. Мой текущий код:
char buffer[256];
std::string result = "";
int resultSize = 0;
bool receive = true;
while (receive) {
resultSize = recv(dataSocket, buffer, sizeof(buffer) - 1, 0);
buffer[resultSize] = '\0'; // Add NULL terminating character to complete string
result += buffer;
for (int i = 0; i < resultSize; i++) {
if (buffer[i] == '\0') {
receive = false;
}
}
}
return result;
Использование размера буфера 256 для демонстрации проблемы, которая заключается в том, что если страница содержит больше байтов, чем я получаю в моем буфере, она не получает все с первой попытки. Я пытался зацикливание, пока данные не содержат нулевой терминатор ('\0'
), который, кажется, не работает. Я также попытался проверить наличие пустых строк ('\r\n'
), который не работает так же хорошо, так как между заголовками и HTML-содержимым страницы есть пустая строка.
Что я заметил, так это то, что я мог бы использовать заголовок Content-Length для решения этой проблемы. Однако я не был бы уверен, как получить этот заголовок, так как для этого требуется как минимум один вызов recv, и если есть хороший, безопасный и эффективный способ сделать это. Я также не уверен, что делать, если ответ не содержит заголовок Content-Length, так как тогда программа застрянет в бесконечном цикле.
Поэтому, если есть метод, позволяющий мне повторять recv до тех пор, пока не будет достигнут конец HTTP-потока, я бы хотел узнать об этом.
Если бы кто-нибудь мог помочь мне с этим, я был бы благодарен!
1 ответ
Правильное поведение - прекратить чтение, когда данные ответа HTTP говорят вам прекратить чтение. Сначала прочитайте заголовки ответа (читайте до \r\n\r\n
), затем проанализируйте заголовки, а затем прочитайте остальную часть тела ответа, как диктуется заголовками, и прекратите чтение только тогда, когда вы достигнете конца ответа, как диктуется заголовками, или когда сервер закрывает соединение, что встречается первым. - Реми Лебо