2013-06-03 133 views
0

瀏覽器我寫了一個測試程序來捕獲用於給定域名的數據包。 我正在使用gethostbyname()來檢索ip地址和pcap來捕獲目的地爲該ip地址的數據包。 pcap_loop()計數設置爲-1,因此它應該保持捕獲。IP地址不同於連接到

從理論上講,從我的電腦發送到該IP地址的所有數據包都將被捕獲,無論該域名是通過網絡瀏覽器訪問還是僅通過ping它,對吧?

經過測試,雖然許多網站都是如此,但它不適用於像google或ebay這樣的高流量網站。這意味着如果我ping從gethostbyname()檢索到的IP地址,ping數據包將被程序捕獲,但如果我在firefox上訪問google.com,則不會捕獲數據包。這表明可能會有與google.com相同的域名有不同的IP地址。

如果是這樣的話,爲什麼DNS服務器返回google.com不同的IP,而其他是相同的? gethostbyname()和web瀏覽器的請求之間有什麼不同(如果有的話)?

在此先感謝。

+0

你捕獲流量** **所有用'的gethostbyname()'或只是第一個返回的IP地址? – Celada

+0

是不是gethostbyname()只返回struct hostent中的一個IP地址? – AuA

+0

不,它返回它們的數組。順便說一句,你應該考慮使用'getaddrinfo()'而不是'gethosybyname()'。 'gethostbyname()'被棄用和廢棄。 – Celada

回答

1

如果給定的域名解析爲多個IP地址,則需要確保您的捕獲篩選器已設置爲捕獲所有這些IP地址,因爲您永遠不知道Web瀏覽器將選擇哪一個。如果你只是過濾(比如說)返回的第一個數據,那麼你將只能選擇一個與瀏覽器相同的數據(其中n是地址數)。

順便說一下,您應該考慮使用getaddrinfo()而不是gethosybyname()gethostbyname()已棄用,作廢。最重要的是,它無法返回IPv6地址。

gethostbyname()將解析後的IP地址列表作爲數組返回......但只包含IPv4地址。

getddrinfo()將解析的IP地址列表作爲鏈接列表返回。

+0

謝謝,很好的解釋。 – AuA

+0

我認爲gethostbyname返回IPv4和IPv6。看看showip.c在這裏:http://www.beej.us/guide/bgnet/output/html/singlepage/bgnet.html#getaddrinfo適合我。 – JohnMudd

+1

@JohnMudd:不,你引用的例子實際上使用'getaddrinfo()'。該網頁甚至說:「特別是,** gethostbyname()**不適用於IPv6。」 'getaddrinfo()'絕對是可以使用的。 – Celada