Пытаюсь через ping перехватить девайс, через который идет трафик.
bool FindDevice( ) {
networkAdapters.clear();
pcap_if_t *alldevs = NULL;
// search for network devices
if( pcap_findalldevs( &alldevs, NULL ) == -1 )
return false;
unsigned devnum = 0;
char errbuf[PCAP_ERRBUF_SIZE];
for( pcap_if_t *curDev = alldevs; curDev != NULL; curDev = curDev->next, ++devnum ) // enumerate fonded devices
{
pcap_addr_t *addrs = NULL; // get network adapter ip-address
for( addrs = curDev->addresses; addrs != NULL; addrs = addrs->next )
if( addrs->addr->sa_family == AF_INET )
break;
if( pcap_t *capHandle = pcap_open_live(curDev->name, 65535, 0, 1, errbuf ) )
{
struct bpf_program bpf;
// create bpf filter for receiveing icmp packets, for current device
int rc = pcap_compile( capHandle, &bpf, "icmp[0] = 1 or icmp[0] = 8 and host google.com", 1, 0xFFFFFFFF );
if( rc < 0 )
{
pcap_close(capHandle);
continue;
}
rc = pcap_setfilter( capHandle, &bpf ); // Now set bpf filter
pcap_freecode( &bpf );
// handle packets for that device
NetworkAdapter netAdp( curDev, addrs, devnum, capHandle );
networkAdapters.push_back( netAdp );
netAdp.thread = ThreadCreate( reinterpret_cast<ThreadRoutine>(NetworkAdapter::CaptureIcmp), &networkAdapters.back() );
}
}
// all device listeners was run, now 'Ping' and determinate which device able to capture packets
//Ping("google.com");
system("ping google.com"); // в callback'e получаю TAP-Win32 Adapter V9. А хочется физ. адаптер D-Link :???:
Здравствуйте, licedey, Вы писали:
Функция pcap_lookupdev() — не помагает, и вроде бы deprecated. Возвращает слэш.
L>Пытаюсь через ping перехватить девайс, через который идет трафик.
L>L>bool FindDevice( ) {
L> networkAdapters.clear();
L> pcap_if_t *alldevs = NULL;
L> // search for network devices
L> if( pcap_findalldevs( &alldevs, NULL ) == -1 )
L> return false;
L> unsigned devnum = 0;
L> char errbuf[PCAP_ERRBUF_SIZE];
L> for( pcap_if_t *curDev = alldevs; curDev != NULL; curDev = curDev->next, ++devnum ) // enumerate fonded devices
L> {
L> pcap_addr_t *addrs = NULL; // get network adapter ip-address
L> for( addrs = curDev->addresses; addrs != NULL; addrs = addrs->next )
L> if( addrs->addr->sa_family == AF_INET )
L> break;
L> if( pcap_t *capHandle = pcap_open_live(curDev->name, 65535, 0, 1, errbuf ) )
L> {
L> struct bpf_program bpf;
L> // create bpf filter for receiveing icmp packets, for current device
L> int rc = pcap_compile( capHandle, &bpf, "icmp[0] = 1 or icmp[0] = 8 and host google.com", 1, 0xFFFFFFFF );
L> if( rc < 0 )
L> {
L> pcap_close(capHandle);
L> continue;
L> }
L> rc = pcap_setfilter( capHandle, &bpf ); // Now set bpf filter
L> pcap_freecode( &bpf );
L> // handle packets for that device
L> NetworkAdapter netAdp( curDev, addrs, devnum, capHandle );
L> networkAdapters.push_back( netAdp );
L> netAdp.thread = ThreadCreate( reinterpret_cast<ThreadRoutine>(NetworkAdapter::CaptureIcmp), &networkAdapters.back() );
L> }
L> }
L> // all device listeners was run, now 'Ping' and determinate which device able to capture packets
L> //Ping("google.com");
L> system("ping google.com"); // в callback'e получаю TAP-Win32 Adapter V9. А хочется физ. адаптер D-Link :???:
L>
Здравствуйте, licedey, Вы писали:
L>Пытаюсь через ping перехватить девайс, через который идет трафик.
Ну если ты делаешь ping, то можно попробовать следующий вариант. Он не тривиальный, но работать будет, имхо.
Перед отправкой пинга начинай "слушать" трафик на всех адаптерах. Ищи DNS-ответ на свой запрос. Ведь когда ты сделаешь ping google.com первым делом в
ход пойдет DNS-запрос разрешения имени "google.com", соответственно поймав DNS-ответ на одном из адаптеров можно сказать, что скорее всего именно через него идет трафик. Правда тут есть подводные камни (например если адрес google.com и соответствующий ему IP пробиты в hosts, но я не знаю кому нужно так извращаться).
Как видишь не самый тривиальный способ
Здравствуйте, n2o, Вы писали:
n2o>Ну если ты делаешь ping, то можно попробовать следующий вариант. Он не тривиальный, но работать будет, имхо.
n2o>Перед отправкой пинга начинай "слушать" трафик на всех адаптерах. Ищи DNS-ответ на свой запрос. Ведь когда ты сделаешь ping google.com первым делом в
n2o>ход пойдет DNS-запрос разрешения имени "google.com", соответственно поймав DNS-ответ на одном из адаптеров можно сказать, что скорее всего именно через него идет трафик. Правда тут есть подводные камни (например если адрес google.com и соответствующий ему IP пробиты в hosts, но я не знаю кому нужно так извращаться).
n2o>Как видишь не самый тривиальный способ
Плохой, негодный способ.
Адрес может быть тействительно забит в hosts
Адрес может быть закеширован системой
DNS-сервера могут располагаться в другой подсети на другом адаптере
Здравствуйте, n2o, Вы писали:
n2o>Здравствуйте, licedey, Вы писали:
L>>Пытаюсь через ping перехватить девайс, через который идет трафик.
n2o>Ну если ты делаешь ping, то можно попробовать следующий вариант. Он не тривиальный, но работать будет, имхо.
n2o>Перед отправкой пинга начинай "слушать" трафик на всех адаптерах. Ищи DNS-ответ на свой запрос. Ведь когда ты сделаешь ping google.com первым делом в
n2o>ход пойдет DNS-запрос разрешения имени "google.com", соответственно поймав DNS-ответ на одном из адаптеров можно сказать, что скорее всего именно через него идет трафик. Правда тут есть подводные камни (например если адрес google.com и соответствующий ему IP пробиты в hosts, но я не знаю кому нужно так извращаться).
n2o>Как видишь не самый тривиальный способ
Именно так и решил задачу
Пингует, ловит ICMP пакеты, перед этим поставив фильтры и прослушку на все адаптеры.