C ++ Как получить имя хоста из пакета Http GET - PullRequest
0 голосов
/ 19 ноября 2011

Я хочу создать TCP-соединение с веб-сервером, используя информацию, полученную из пакета, подобного показанному ниже.Для этого мне нужно имя хоста и portno из пакета, чтобы получить адрес, который я могу использовать с функцией соединения

Это предполагает, что я использую c ++. Могу ли я предположить, что portno для связи с серверомзапрос на html-страницы будет 80?Как я могу получить имя хоста из пакета, предполагая, что пакет имеет форму массива char?В настоящее время я извлекаю строку символов bits.wikimedia.org и использую ее в качестве имени хоста.Это верно?Получив имя хоста, я предполагаю, что передал его в getaddrinfo и использовал переданную им структуру вместе с этой функцией, чтобы сгенерировать структуру, содержащую информацию, понятную для функции connect.Это предположение верно?

GET http://bits.wikimedia.org/en.wikipedia.org/load.php?debug=false&lang=en&modules=site&only=scripts&skin=vector&* HTTP/1.1
Host: bits.wikimedia.org
Proxy-Connection: close
User-Agent: Mozilla/5.0 (compatible; Konqueror/4.6; Linux) KHTML/4.6.5 (like Gecko) Fedora/4.6.5-7.fc15
Referer: http://en.wikipedia.org/wiki/Firewall_(computing)
Accept: */*
Accept-Encoding: x-gzip, x-deflate, gzip, deflate
Accept-Charset: utf-8, utf-8;q=0.5, *;q=0.5
Accept-Language: en-US,en;q=0.9

Ответы [ 2 ]

1 голос
/ 19 ноября 2011

Если вы получаете автономный http-пакет, содержащий массив string / char, вам нужно полагаться исключительно на URL-адрес в строке.URL-адреса HTTP указываются в формате http://hostname[:port]/resource..., где номер порта является необязательным, и по умолчанию используется порт http 80, если он не указан.Вам необходимо проанализировать URL-адрес, чтобы извлечь имя хоста и номер порта [предположим, порт 80, если он явно не указан] и выполнить попытку подключения через сокет.Вам нужно, чтобы ваш DNS был установлен и доступен из вашей программы, чтобы имя хоста было преобразовано в его IP-адрес.Без этого вы не сможете установить соединение.

0 голосов
/ 19 ноября 2011

Вы должны иметь возможность полагаться на поле заголовка Host: , чтобы иметь имя хоста в нем.

Посмотрите на ссылку, чтобы увидеть, как это отформатировано.Вам нужно читать строку заголовка построчно, определять строку «Host:», извлекать следующую строку, возможно извлекать номер порта, если он указан (host: port).

Да, можно использовать getaddrinfo ()получить IP-адрес (а) для имени хоста.

...