GET-запрос для получения содержимого страницы

Я пытаюсь выполнить C-эквивалент питона: requests.get('http://test.com')

Сначала я использую getaddrinfo() для разрешения имени хоста (у него 4 ips) в ip, затем server.sin_addr.s_addr = inet_addr(ip);, и он успешно подключается (не выдает ошибку). Но когда я пытаюсь отобразить страницу, отправив запрос "GET / HTTP/1.1\r\n\r\n, он в основном возвращает содержимое ошибки 404 (страница не найдена). Вот функция:


void foo ()
{
    struct addrinfo     hints;
    struct addrinfo     *result = NULL;

    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family     = AF_UNSPEC;
    hints.ai_socktype   = SOCK_STREAM;
    hints.ai_protocol   = IPPROTO_TCP;

    char host[256], port [256];
    strcpy(host, "www.test.com");
    strcpy(port, "80");
    getaddrinfo(host, port, &hints, &result);

    struct sockaddr_in  *sockaddr_ipv4 = (struct sockaddr_in *)result->ai_addr;
    char ip [256];
    strcpy(ip, inet_ntoa(sockaddr_ipv4->sin_addr));

    struct sockaddr_in server;
    SOCKET s = socket(AF_INET , SOCK_STREAM , 0 );
    char *message , server_reply[2000];
    int recv_size;

    server.sin_addr.s_addr = inet_addr(ip);
    server.sin_family = AF_INET;
    server.sin_port = htons( 80 );

    if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        puts("connect error");
        return 1;
    }
    message = "GET / HTTP/1.1\r\n\r\n";
    if( send(s , message , strlen(message) , 0) < 0)
    {
        puts("Send failed");
        return 1;
    }
    if((recv_size = recv(s , server_reply , 2000 , 0)) == SOCKET_ERROR)
    {
        puts("recv failed");
    }
    server_reply[recv_size] = '\0';
    puts(server_reply);*/
    system("PAUSE");
}

Результат

HTTP/1.1 404 Not Found Дата: пятница, 15 сентября 2017 г., 03:19:41 по Гринвичу Content-Type: text/html; charset=UTF-8 Сервер: ghs Content-Length: 1561 X-XSS-Protection: 1; mode=block Параметры X-Frame: SAMEORIGIN

Error 404 (Not Found)!!1
{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{backgrou nd:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height :180px;padding:30px 0 15px} > body{background:url(//www.google.com/images/error s/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflo w:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (m ax-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0 }}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo _color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-reso lution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/ 2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:ur l(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:ur l(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:5 4px;width:150px}

404. Thata?Ts an error.

The requested URL / was not found on this server. Thata? Ts all we know.


Что я делаю не так? Как я должен подойти к этому?


person Edenia    schedule 15.09.2017    source источник
comment
Пожалуйста, отправьте код, в вашем сообщении недостаточно информации, чтобы понять, что не так?, а также почему вы пытаетесь это сделать? Разве вы не можете использовать такую ​​библиотеку, как libcurl?   -  person Iharob Al Asimi    schedule 15.09.2017
comment
Ты прав, я должен был. Обновлено. Также мой проект сильно основан на Windows и WinSock. И если я не могу сделать это с этими... Я могу попробовать другие API.   -  person Edenia    schedule 15.09.2017
comment
Это действительно не имеет ничего общего с python... Тег вводит в заблуждение.   -  person Addison    schedule 15.09.2017
comment
Кроме того, пожалуйста, опубликуйте ТОЧНЫЙ вывод. Вы не ответили, почему бы не использовать что-то вроде libcurl. Хотя я не думаю, что libcurl легко использовать в Windows, наверняка есть альтернативы. HTTP-клиент — это сложное чудовище, поэтому, если вам нужны некоторые функции, подобные тем, о поддержке которых вы заявляете, когда говорите "HTTP/1.1", вам следует использовать библиотеку.   -  person Iharob Al Asimi    schedule 15.09.2017
comment
Проверьте эту библиотеку, которую я написал, специально для возможности писать клиенты веб-сокетов. Если вам нужна помощь, пожалуйста, свяжитесь со мной, и я постараюсь помочь.   -  person Iharob Al Asimi    schedule 15.09.2017
comment
@Addison, когда вопрос касается версии Python C, не имеет ли смысла пометить обе?   -  person Edenia    schedule 15.09.2017
comment
Не спамьте тегами. Просто потому, что вы знаете, что Pathon не оправдывает тег Python!   -  person too honest for this site    schedule 15.09.2017
comment
@IharobAlAsimi Только как сделать то, чего я пытаюсь с его помощью добиться.   -  person Edenia    schedule 15.09.2017
comment
@Olaf Я вообще не знаю python. Но, насколько я заметил, у него очень простой и понятный способ делать то, что я хочу, что кажется намного более сложным в C и winsock.   -  person Edenia    schedule 15.09.2017
comment
@Edenia: Хороший стейк на гриле с красной кровавой серединкой — это восхитительная еда. Добавьте печеный картофель, и это прекрасно. Хм… мы публикуем несвязанные предложения, не так ли?   -  person too honest for this site    schedule 15.09.2017
comment
Ваш сокет подключается, и сервер отвечает, он отвечает об ошибке 404, может быть, он не хочет обслуживать запрос для /, вы получаете страницу из браузера для test.com   -  person Pras    schedule 15.09.2017
comment
@Прас Да, знаю. Также test.com. Это веб-сайт, предназначенный для встраивания его вывода в исходные коды, хотя он показывает примеры Python, Ruby и других не относящихся к делу языков.   -  person Edenia    schedule 15.09.2017
comment
Пожалуйста, добавляйте код, ошибки и данные в виде текста (с использованием форматирования кода), а не изображений. Изображения: A) не позволяйте нам копировать и вставлять код/ошибки/данные для тестирования; Б) не разрешать поиск по коду/ошибке/содержимому данных; и многие другие причины. В общем, код/ошибки/данные в текстовом формате ›››› код/ошибки/данные в виде изображения ›› ничего. Изображения следует использовать в дополнение к тексту в формате кода, только если изображение добавляет что-то важное, что не передается только текстовым кодом/ошибкой/данными.   -  person Makyen♦    schedule 17.09.2017


Ответы (1)


В HTTP/1.1 вам нужно указать заголовок Host. В HTTP/1.0 вы этого не сделаете. Следовательно, вы должны либо изменить это на:

 GET / HTTP/1.0\r\n\r\n

or

 GET / HTTP/1.1\r\n
 Host: the.hostname.com\r\n\r\n

Это изменение было сделано, поскольку виртуальные имена хостов стали настолько распространенными.

person David Hoelzer    schedule 15.09.2017