Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2011, 15:54   #1
masterbloger
Пользователь
 
Регистрация: 09.11.2010
Сообщений: 14
По умолчанию Увидеть все пакеты в сети. pcap

Здравствуйте!
У меня такая проблема.
Написал программу, которая с помощью 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 бесплатный и все его коды открыты, давать не надо.
Спасибо за помощь!
masterbloger вне форума Ответить с цитированием
Старый 24.03.2011, 18:46   #2
masterbloger
Пользователь
 
Регистрация: 09.11.2010
Сообщений: 14
По умолчанию

Может есть какая возможность подключится, с помощью pcap, к сетевому интерфейсу ip-телефона и перехватывать пакеты адресованные ему?
masterbloger вне форума Ответить с цитированием
Старый 24.03.2011, 18:56   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

не можно, а нужно
у вас даже спрашивается в проге, к какому интерфейсу подключиться:

Код:
printf("Enter the interface number (1-%d):",i);
правда, я не смотрел, что там дальше с i происходит.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 25.03.2011, 10:24   #4
masterbloger
Пользователь
 
Регистрация: 09.11.2010
Сообщений: 14
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
не можно, а нужно
у вас даже спрашивается в проге, к какому интерфейсу подключиться:
Да, но выбрать можно только сетевые интерфейсы того компьютера, на котором запущена программа.
Как подключится к сетевому интерфейсу ip-телефона?
Насколько я знаю возможность подключится к сетевому интерфейсу удаленного компьютера есть только в том случае если на нем установлен драйвер pcap.
Как быть с ip-телефоном?
masterbloger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить все 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