Re[2]: winpcap 3.01a VS winpcap 3.1b
От: consumer  
Дата: 18.12.04 17:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, consumer, Вы писали:


C>>имеется сервак локальной сети с модемным выходом в инет. Необходимо считать трафик, который идёт из/в инета на каждую тачку этой локалки. Использовал 3.01a. Внутренний трафик сети считался не полностью, модемный трафик вообще не видел. Использовал 3.1b Модемный трафик считается абсолютно точно, а трафик локалки на нуле. В чём проблема не пойму, и как это отладить неясно. Кто-нибудь знает выход?


А>покажи выражение фильтра




перед этим прочитаны интерфейсы pcap_findalldevs
Определяет два интерфейса:
Generic NdisWan Adapter
и (если модем врублен) WAN (PPP/SLIP) Interface
Так вот, трафик по моедму считается нормально. А если слушать интерфейс Generic NdisWAn (я так понял это интерфейс объединающий все сетевые адаптеры на компе, потому что у меня две сетевухи), то трафик считается в несколько раз меньший.

//open device
if(!dev)
throw 0;
if(!(devhandle = pcap_open_live(dev->name, 65536, 0, 100, errbuf)))
throw 0;

//Check adapters' link layer (must be Ethernet)
if (pcap_datalink(devhandle) != DLT_EN10MB)
throw 0;

//check address list of the interface
if (!dev->addresses)
netmask = ((struct sockaddr_in *)(dev->addresses->netmask))->sin_addr.S_un.S_addr;

//get ip-addresses of interface
int ipi_cnt = 0;
/////////////////////////////////////
//тут заполняется массив IP-адресов, той тачки, которую нужно слушать. Это всё правильно делается (проверял).
u_long int_ip_array[MAX_IP_ADDRESSES];
hostent *hent = gethostbyname(cntr->GetHostName());

if(hent->h_addrtype != 0)
throw 0;

for(int i = 0; i < hent->h_length; i ++)
if(i < MAX_IP_ADDRESSES)
{
int_ip_array[i] = stoip(hent->h_addr_list[i]);
ipi_cnt++;
}

if(!ipi_cnt)
throw 0;
/////////////////////////////////////

//create, compile and setup packet filter
здесь я пробовал фильтр либо пустая строка "", либо "ip". не влияет на счёт.
cntr->CreatePacketFilter(packet_filter);
if (pcap_compile(devhandle, &fcode, packet_filter.c_str(), 1, netmask) < 0)
throw 0;
if (pcap_setfilter(devhandle, &fcode) < 0)
throw 0;
/* Put the interface in statstics mode */
//здесь MODE_STAT ничего абсолютно не считает.
pcap_setmode(devhandle, MODE_CAPT);

//.... тут не важно что

// capture pockets loop
while (true)
{
switch(pcap_next_ex(devhandle, &pkt_header, &pkt_data))
{
case 1: // packet has been read without problems

//тут анализ пакета...

как определить все ли пакеты считаются непонятно. В отладчике я ведь не могу считать все сотни пакетов. Пакеты ловятся, но не все. При копировании по сети 100 мегов, считается только десять или около того.


break;

case 0: // timeout set with pcap_open_live() has elapsed
break;

case -1: // error occurred
case -2: // EOF was reached reading from an offline capture
throw 0;
}//switch

}//while
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.