![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 09.11.2010
Сообщений: 14
|
![]()
Здравствуйте!
У меня такая проблема. Написал программу, которая с помощью pcap ловит пакеты в локальной сети и анализирует их содержимое. Вот её код: /* prototype of the packet handler */ void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data); int _tmain(int argc, _TCHAR* argv[]) { pcap_if_t *alldevs; pcap_if_t *d; int inum; int i=0; pcap_t *adhandle; char errbuf[PCAP_ERRBUF_SIZE]; if (pcap_findalldevs_ex(PCAP_SRC_IF_ST RING, NULL, &alldevs, errbuf) == -1) //if (pcap_findalldevs_ex("rpcap://10.0.0.127:80", NULL, &alldevs, errbuf) == -1) { fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf); exit(1); } for(d=alldevs; d; d=d->next) { printf("%d. %s", ++i, d->name); if (d->description) printf(" (%s)\n", d->description); else printf(" (No description available)\n"); } if(i==0) { printf("\nNo interfaces found! Make sure WinPcap is installed.\n"); return -1; } printf("Enter the interface number (1-%d):",i); scanf_s("%d", &inum); if(inum < 1 || inum > i) { printf("\nInterface number out of range.\n"); /* Free the device list */ pcap_freealldevs(alldevs); return -1; } for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++); if ( (adhandle= pcap_open(d->name, // name of the device BUFSIZ, // portion of the packet to capture 1, -1, // read timeout NULL, // authentication on the remote machine errbuf // error buffer ) ) == NULL) { fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name); pcap_freealldevs(alldevs); return -1; } printf("\nlistening on %s...\n", d->description); long netmask; bpf_program fcode; if (d->addresses != NULL) netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr; else netmask=0xffffff; if (pcap_compile(adhandle, &fcode, "", 1, netmask) < 0) { fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n"); /* Free the device list */ pcap_freealldevs(alldevs); return -1; } if (pcap_setfilter(adhandle, &fcode) < 0) { fprintf(stderr,"\nError setting the filter.\n"); /* Free the device list */ pcap_freealldevs(alldevs); return -1; } pcap_freealldevs(alldevs); pcap_loop(adhandle, -1, packet_handler, NULL); return 0; } void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) { ip_header *ih; udp_header *uh; u_int ip_len; u_short sport,dport; struct in_addr addr; u8 buf[1024]; uprotos_ether_h *ether; uprotos_ipv4_h *ip; uprotos_tcpv4_h *tcp; (VOID)(param); ih = (ip_header *) (pkt_data + 14); //length of ethernet header ip_len = (ih->ver_ihl & 0xf) * 4; uh = (udp_header *) ((u_char*)ih + ip_len); sport = ntohs( uh->sport ); dport = ntohs( uh->dport ); printf("%d.%d.%d.%d:%d -> %d.%d.%d.%d:%d\n", ih->saddr.byte1, ih->saddr.byte2, ih->saddr.byte3, ih->saddr.byte4, sport, ih->daddr.byte1, ih->daddr.byte2, ih->daddr.byte3, ih->daddr.byte4, dport); memset(packetbuf,0,strlen(packetbuf )); ether = (uprotos_ether_h*)pkt_data; ip = (uprotos_ipv4_h*)(pkt_data+sizeof(u protos_ether_h)); tcp = (uprotos_tcpv4_h*)(pkt_data + 14 + (ip->header_len)*4); dump_ex((u8*)pkt_data, 0, header->len, packetbuf+strlen(packetbuf), 0, 0); printf("%s\n", packetbuf); fo = fopen("log.txt","a"); fprintf( fo, "%d.%d.%d.%d:%d -> %d.%d.%d.%d:%d\n", ih->saddr.byte1, ih->saddr.byte2, ih->saddr.byte3, ih->saddr.byte4, sport, ih->daddr.byte1, ih->daddr.byte2, ih->daddr.byte3, ih->daddr.byte4, dport); fclose(fo); } Компьютер подключен к сети через ip-телефон. Мне нужно видеть те пакеты, которые сервер направляет телефону, но моя программа их почему-то не видит. Сразу скажу, что компьютер, телефон и сервер находятся в разных подсетях. НО…! Запускаю WireShark и с её помощью вижу все нужные мне пакеты. Насколько я знаю, WireShark работает на том же pcap. В чём может быть проблема? Советы о том, что WireShark бесплатный и все его коды открыты, давать не надо. Спасибо за помощь! |
![]() |
![]() |
![]() |
#2 |
Пользователь
Регистрация: 09.11.2010
Сообщений: 14
|
![]()
Может есть какая возможность подключится, с помощью pcap, к сетевому интерфейсу ip-телефона и перехватывать пакеты адресованные ему?
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
не можно, а нужно
у вас даже спрашивается в проге, к какому интерфейсу подключиться: Код:
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#4 | |
Пользователь
Регистрация: 09.11.2010
Сообщений: 14
|
![]() Цитата:
Как подключится к сетевому интерфейсу ip-телефона? Насколько я знаю возможность подключится к сетевому интерфейсу удаленного компьютера есть только в том случае если на нем установлен драйвер pcap. Как быть с ip-телефоном? |
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Определить все IP и имена в локальной сети | Andrey85 | Работа с сетью в Delphi | 2 | 08.09.2010 20:13 |
Как найти все компьютеры в сети | евгений_8686 | Общие вопросы C/C++ | 1 | 26.03.2010 17:59 |
Пакеты | _Studentka_ | Общие вопросы по Java, Java SE, Kotlin | 0 | 04.11.2009 21:44 |
Звук с микрофона увидеть | dx+ | Мультимедиа в Delphi | 6 | 24.06.2009 09:58 |
Пакеты | benjaminfran | Фриланс | 7 | 20.02.2008 21:29 |