2011-11-19 35 views
0

我想使用從下面顯示的數據包獲得的信息創建到Web服務器的tcp連接。要做到這一點,我需要數據包的主機名和portno得到一個地址,我可以使用連接功能C++如何從Http GET數據包獲取主機名

這是假設我正在使用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 

回答

0

您應該能夠依靠Host: header field有它的主機名。

看看鏈接,看看它是如何格式化的。您需要逐行讀取標題,標識「Host:」行,提取以下字符串,如果給定(host:port),可能會提取端口號。

是的,getaddrinfo()可用於獲取主機名的IP地址。

1

如果您正在獲取包含字符串/字符數組的脫機http數據包,則需要完全依賴字符串中的URL。 HTTP URL以格式http:// hostname [:port]/resource ...指定,其中端口號是可選的,如果未指定,則默認爲http端口80。您需要解析URL以提取主機名和端口號[假設端口80如果未明確指定]並嘗試套接字連接。您需要從您的程序中設置並可訪問DNS,以便將主機名解析爲其IP地址。沒有這個,你將無法建立連接。