Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, consumer, Вы писали:
C>>имеется сервак локальной сети с модемным выходом в инет. Необходимо считать трафик, который идёт из/в инета на каждую тачку этой локалки. Использовал 3.01a. Внутренний трафик сети считался не полностью, модемный трафик вообще не видел. Использовал 3.1b Модемный трафик считается абсолютно точно, а трафик локалки на нуле. В чём проблема не пойму, и как это отладить неясно. Кто-нибудь знает выход?
А>покажи выражение фильтра
перед этим прочитаны интерфейсы pcap_findalldevs
Определяет два интерфейса:
Generic NdisWan Adapter
и (если модем врублен) WAN (PPP/SLIP) Interface
Так вот, трафик по моедму считается нормально. А если слушать интерфейс Generic NdisWAn (я так понял это интерфейс объединающий все сетевые адаптеры на компе, потому что у меня две сетевухи), то трафик считается в несколько раз меньший.
//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++;
}
//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