Получать данные 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), затем проанализируйте заголовки, а затем прочитайте остальную часть тела ответа, как диктуется заголовками, и прекратите чтение только тогда, когда вы достигнете конца ответа, как диктуется заголовками, или когда сервер закрывает соединение, что встречается первым. - Реми Лебо

Другие вопросы по тегам