имеется сервак локальной сети с модемным выходом в инет. Необходимо считать трафик, который идёт из/в инета на каждую тачку этой локалки. Использовал 3.01a. Внутренний трафик сети считался не полностью, модемный трафик вообще не видел. Использовал 3.1b Модемный трафик считается абсолютно точно, а трафик локалки на нуле. В чём проблема не пойму, и как это отладить неясно. Кто-нибудь знает выход?
Re: winpcap 3.01a VS winpcap 3.1b
От:
Аноним
Дата:
17.12.04 09:35
Оценка:
Здравствуйте, consumer, Вы писали:
C>имеется сервак локальной сети с модемным выходом в инет. Необходимо считать трафик, который идёт из/в инета на каждую тачку этой локалки. Использовал 3.01a. Внутренний трафик сети считался не полностью, модемный трафик вообще не видел. Использовал 3.1b Модемный трафик считается абсолютно точно, а трафик локалки на нуле. В чём проблема не пойму, и как это отладить неясно. Кто-нибудь знает выход?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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
Здравствуйте, consumer, Вы писали:
C>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, consumer, Вы писали:
C>>>имеется сервак локальной сети с модемным выходом в инет. Необходимо считать трафик, который идёт из/в инета на каждую тачку этой локалки. Использовал 3.01a. Внутренний трафик сети считался не полностью, модемный трафик вообще не видел. Использовал 3.1b Модемный трафик считается абсолютно точно, а трафик локалки на нуле. В чём проблема не пойму, и как это отладить неясно. Кто-нибудь знает выход?
А>>покажи выражение фильтра
C>перед этим прочитаны интерфейсы pcap_findalldevs C>Определяет два интерфейса: C>Generic NdisWan Adapter C>и (если модем врублен) WAN (PPP/SLIP) Interface C>Так вот, трафик по моедму считается нормально. А если слушать интерфейс Generic NdisWAn (я так понял это интерфейс объединающий все сетевые адаптеры на компе, потому что у меня две сетевухи), то трафик считается в несколько раз меньший.
Ну не знаю, должно быть на каждый интерфейс по записи.
Я, правда, пользую не pcap_* а низкоуровневые вызовы,
вот мой пример на паскакале:
function GetAdapterNames(L: TStrings): boolean;
var az, w, ss: string;
qz, k, ki: dword;
begin
Result := PacketDriverLoaded;
if not Result then Exit;
qz := 8192; SetLength(az, qz);
Result := PacketGetAdapterNames(@az[1], qz);
if not Result then Exit;
SetLength(az, qz);
{ enumerate adapter system ANSI names }if (Win32Platform = VER_PLATFORM_WIN32_NT) then begin
ki := 2; ss := #0#0;
end else begin
ki := 0; ss := #0;
end;
k := Pos(ss, az);
while (k > 0) do begin
w := Copy(az, 1, k - 1);
Delete(az, 1, k + ki);
if (w = EmptyStr) then Break;
if (ki <> 0) then w := WideCharToString(@w[1]);
if Assigned(L) then L.Add(w);
k := Pos(ss, az);
end;
end;
Здравствуйте, NeuroVirus, Вы писали:
NV>Здравствуйте, consumer, Вы писали:
C>>Здравствуйте, Аноним, Вы писали:
А>>>Здравствуйте, consumer, Вы писали:
C>>>>имеется сервак локальной сети с модемным выходом в инет. Необходимо считать трафик, который идёт из/в инета на каждую тачку этой локалки. Использовал 3.01a. Внутренний трафик сети считался не полностью, модемный трафик вообще не видел. Использовал 3.1b Модемный трафик считается абсолютно точно, а трафик локалки на нуле. В чём проблема не пойму, и как это отладить неясно. Кто-нибудь знает выход?
А>>>покажи выражение фильтра
C>>перед этим прочитаны интерфейсы pcap_findalldevs C>>Определяет два интерфейса: C>>Generic NdisWan Adapter C>>и (если модем врублен) WAN (PPP/SLIP) Interface C>>Так вот, трафик по моедму считается нормально. А если слушать интерфейс Generic NdisWAn (я так понял это интерфейс объединающий все сетевые адаптеры на компе, потому что у меня две сетевухи), то трафик считается в несколько раз меньший.
NV>Ну не знаю, должно быть на каждый интерфейс по записи. NV>Я, правда, пользую не pcap_* а низкоуровневые вызовы, NV>вот мой пример на паскакале:
Спасибо за пример, обязательно его попробую.
Это вариант для локалки. А тебе не приходилось считать модемный трафик?
Здравствуйте, consumer, Вы писали:
C>Здравствуйте, NeuroVirus, Вы писали:
NV>>Здравствуйте, consumer, Вы писали:
C>>>Здравствуйте, Аноним, Вы писали:
А>>>>Здравствуйте, consumer, Вы писали:
C>>>>>имеется сервак локальной сети с модемным выходом в инет. Необходимо считать трафик, который идёт из/в инета на каждую тачку этой локалки. Использовал 3.01a. Внутренний трафик сети считался не полностью, модемный трафик вообще не видел. Использовал 3.1b Модемный трафик считается абсолютно точно, а трафик локалки на нуле. В чём проблема не пойму, и как это отладить неясно. Кто-нибудь знает выход?
А>>>>покажи выражение фильтра
C>>>перед этим прочитаны интерфейсы pcap_findalldevs C>>>Определяет два интерфейса: C>>>Generic NdisWan Adapter C>>>и (если модем врублен) WAN (PPP/SLIP) Interface C>>>Так вот, трафик по моедму считается нормально. А если слушать интерфейс Generic NdisWAn (я так понял это интерфейс объединающий все сетевые адаптеры на компе, потому что у меня две сетевухи), то трафик считается в несколько раз меньший.
NV>>Ну не знаю, должно быть на каждый интерфейс по записи. NV>>Я, правда, пользую не pcap_* а низкоуровневые вызовы, NV>>вот мой пример на паскакале:
C>Спасибо за пример, обязательно его попробую. C>Это вариант для локалки. А тебе не приходилось считать модемный трафик?
кстати сейчас выяснил — моя функция не будет работать с 3.1 — надо переписывать
модемный когда-то считал, ужо и не помню что там за интерфейс мне показывали,
но считало нормально и в локалке и на модеме.
кстати про "недосчет" — это может просто не все пакеты успевают ловится,
надо буфера побольше и процессор пошустрее, особенно на 100Мб сетках,
про Гигабит ethernet вообще молчу...
Здравствуйте, NeuroVirus, Вы писали:
NV>>>Ну не знаю, должно быть на каждый интерфейс по записи. NV>>>Я, правда, пользую не pcap_* а низкоуровневые вызовы, NV>>>вот мой пример на паскакале:
C>>Спасибо за пример, обязательно его попробую. C>>Это вариант для локалки. А тебе не приходилось считать модемный трафик?
NV>кстати сейчас выяснил — моя функция не будет работать с 3.1 — надо переписывать NV>модемный когда-то считал, ужо и не помню что там за интерфейс мне показывали, NV>но считало нормально и в локалке и на модеме. NV>кстати про "недосчет" — это может просто не все пакеты успевают ловится,
Очень похоже именно на тормоза. У меня в локалке 100метров в считанные секунды копируются. NV>надо буфера побольше и процессор пошустрее, особенно на 100Мб сетках, NV>про Гигабит ethernet вообще молчу...
И чё теперь, фенита ля комедия? Заставить начальство проц покруче поставить из-за счётчика трафика не реально
Здравствуйте, consumer, Вы писали:
C>Здравствуйте, NeuroVirus, Вы писали:
NV>>кстати про "недосчет" — это может просто не все пакеты успевают ловится, C>Очень похоже именно на тормоза. У меня в локалке 100метров в считанные секунды копируются.
когда-то я делал пробную программку, был тогда P2-300, NT4Server, 512Mb RAM? 1000Mbit сетка,
программа считала траффик, но очень неэкономно — на каждый словленный пакет обновляла статистику
в окошке. Так вот она теряла примерно половину трафика. Это так — для ориентировки.
NV>>надо буфера побольше и процессор пошустрее, особенно на 100Мб сетках, NV>>про Гигабит ethernet вообще молчу... C>И чё теперь, фенита ля комедия? Заставить начальство проц покруче поставить из-за счётчика трафика не реально
вообще-то правильней считать трафик на шлюзе, т.е. не мимо проходящий а проходящий сквозь.
например первый пень с free-bsd или linux и на нем все настраивается: маршуртизатор, файервол, счетчики, шейперы...
consumer у меня такая же проблема, ловится только часть траффика на ethernete, проц P4 2.4, если ты победил єто все, то черкни плиз как. может буфера увеличить (:)) звучит).