2013-06-03 2 views
0

Я написал тестовую программу для захвата пакетов для данного имени домена. Я использовал gethostbyname() для извлечения ip-адреса и pcap для захвата пакетов, предназначенных для этого IP-адреса. Счетчик pcap_loop() был установлен в -1, поэтому он должен продолжать захватывать.IP-адрес, полученный gethostbyname(), отличается от браузера, связанного с

Теоретически, все пакеты, отправляемые с моего компьютера на этот IP-адрес, будут захвачены независимо от того, посещено ли это доменное имя веб-браузером или просто пингом, верно?

После тестирования, хотя это верно для многих сайтов, оно неприменимо для сайтов с высоким трафиком, таких как google или ebay. Значение, если я ping ip-адрес, полученный из gethostbyname(), пакеты ping будут захвачены программой, но если я нахожу google.com в firefox, пакеты не будут захвачены. Это показывает, что может быть другой IP-адрес для того же имени домена, что и google.com.

Если это так, почему DNS-сервер возвращает разные ips для google.com, а другие идентичны? И каковы разные, если они есть, между запросами от gethostbyname() и те из браузера?

Заранее спасибо.

+0

Записываете ли вы трафик на ** все ** IP-адресов, возвращаемых 'gethostbyname()' или только первый? – Celada

+0

Разве это не означает, что gethostbyname() возвращает только один IP-адрес в struct hostent? – AuA

+0

Нет, он возвращает массив из них. Кстати, вы должны использовать 'getaddrinfo()' вместо 'gethosybyname()'. 'gethostbyname()' устарел и устарел. – Celada

ответ

1

Если данное доменное имя разрешено для более чем одного IP-адреса, вам необходимо убедиться, что ваш фильтр захвата настроен для захвата для всех из них, потому что вы никогда не знаете, какой из них будет выбирать веб-браузер. Если вы только отфильтровываете (скажем) первый, который возвращается, есть только один шанс на то, что вы выбрали тот же, что и браузер (где 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

Смежные вопросы