HTTP-клиент C ++ зависает при вызове read () после запроса GET - PullRequest
4 голосов
/ 24 октября 2019
std::string HTTPrequest = "GET /index.html HTTP/1.1\r\nHost: www.yahoo.com\r\nConnection: close\r\n\r\n";

write(socket, HTTPrequest.c_str(), sizeof(HTTPrequest));

char pageReceived[4096];

int bytesReceived = read(socket, pageReceived, 4096);

У меня есть клиентская программа HTTP, которую я запускаю со своего терминала. У меня также есть программа для веб-сервера. Используя веб-сервер в качестве теста, я могу убедиться, что создание и вложение сокета работает правильно.

Я создаю запрос, как показано выше, затем записываю в сокет. Используя операторы print, я вижу, что код выходит за пределы вызова write. Тем не менее, он зависает при вызове чтения.

Я не могу понять, что происходит - мое форматирование выглядит правильно по запросу.

Есть идеи? Кажется, что все работает отлично, когда я подключаюсь к своему веб-серверу, но и www.yahoo.com, и www.google.com вызывают зависание. Я на Linux.

1 Ответ

3 голосов
/ 24 октября 2019

В C и C ++ sizeof дает количество байтов, необходимое для хранения типа, независимо от его содержимого. Таким образом, вы не отправляете полный запрос, только sizeof(std::string) байтов. Вы хотите HTTPRequest.size() (что дает вам количество байтов, которое значение хранится в HTTPRequest дублях), а не sizeof(HTTPrequest) (которое дает вам количество байтов, которое требуется для std::string).

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