C ++如何从Http GET数据包中获取主机名

时间:2011-11-19 03:58:57

标签: c++ http packet hostname

我想使用从下面显示的数据包中获取的信息创建到Web服务器的tcp连接。为此,我需要数据包中的hostname和portno来获取一个可以与连接函数一起使用的地址

这假设我使用的是c ++ 我可以假设与服务器通信以请求html页面的portno将是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 个答案:

答案 0 :(得分:1)

如果要获取包含字符串/ char数组的脱机http数据包,则需要完全依赖字符串中的URL。 HTTP URL以http:// hostname [:port] / resource ...格式指定,其中端口号是可选的,如果未指定,则默认为http端口80。您需要解析URL以提取主机名和端口号[如果未明确指定则假定端口80]并尝试套接字连接。您需要设置DNS并且可以从程序中访问,以便将主机名解析为其IP地址。如果没有这个,你将无法建立连接。

答案 1 :(得分:0)

您应该可以依赖Host: header field来拥有主机名。

查看链接以了解其格式。您需要逐行读取标题,标识“主机:”行,提取以下字符串,如果给定(主机:端口),可能会提取端口号。

是的,getaddrinfo()可用于获取主机名的IP地址。