2013-06-03 136 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