С++ getaddrinfo не обрабатывает большие URL-адреса

Сокеты С++. Получение информации с веб-сайта.

Я пытаюсь читать контент из Интернета с помощью сокетов. используя следующий код.

int status = getaddrinfo(l_url.c_str(), "http", &l_address, &l_addr_ll);
if (status != 0 ){
    printf("\n ***** getaddrinfo() failed: %s\n", gai_strerror(status));

    return FAILURE;
}

Код отлично работает для таких URL-адресов, как «www.yahoo.com», «www.google.com», однако он не работает для таких URL-адресов, как «www.google.com/nexus».

Любой URL-адрес, имеющий «/», не работает с этим кодом. Я что-то упустил?


person kris123456    schedule 14.10.2013    source источник


Ответы (3)


getaddrinfo предоставляет информацию о сетевых адресах, а не об URL-адресах. URL-адрес не является сетевым адресом, хотя часто содержит его. Строка вроде "www.google.com/nexus" не является ни URL-адресом, ни адресом (хотя вполне может быть частью URL-адреса), поэтому неудивительно, что getaddrinfo для нее не работает.

person Chris Dodd    schedule 14.10.2013
comment
Какой быстрый ответ Крис !! Престижность. - person kris123456; 14.10.2013
comment
Любые советы о том, как это может быть решено, Крис? Мне нужны данные с определенных сайтов. как сообщалось, я буду получать доступ к URL-адресам, таким как google.com/nexus, apple.com/imac и т. д. Какие изменения необходимо внести в мой код? - person kris123456; 14.10.2013
comment
@kris123456: самым простым решением было бы использовать библиотеку URL-адресов, например libcurl, а не getaddrinfo - person Chris Dodd; 24.03.2015

На странице руководства говорится, что первым параметром должно быть имя хоста. Имя хоста — это только первая часть до домена верхнего уровня. Все после этого не принадлежит имени хоста. Будьте осторожны, некоторые части ранее также могут не принадлежать имени хоста, особенно если вы видите @ в своем URL-адресе.

Загляните в википедию для URL, там есть подробное объяснение, какая часть URL на самом деле является имя хоста, которое вы можете поместить в свою функцию.

person nvoigt    schedule 14.10.2013
comment
Существуют различные сценарии и решения здесь. - person nvoigt; 14.10.2013

Согласно справочной странице. нужно передать информацию об URL методу getaddressinfo. Для этого пользователь должен передать имя веб-сайта. например «www.google.com». Однако при запросе данных пользователь отправляет запрос, в этот момент пользователь может опубликовать URL-адрес, например «www.google.com/nexus».

  • Адрес будет таким же, как и URL. однако запрос варьируется, поэтому нужно получить адрес веб-сайта, используя только «.com». После получения информации об адресе могут быть сделаны дополнительные запросы.
person kris123456    schedule 14.10.2013