Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Интернет


Автор: Yura_Matsuk 25.10.2004, 11:15
Подскажите, как измерить кличество информации, переданной/полученной через сеть?

Автор: bartram 25.10.2004, 11:56
Цитата(Yura_Matsuk @ 25.10.2004, 11:15)

Подскажите, как измерить кличество информации, переданной/полученной через сеть?

Снифер надо делать, я щас как раз этим занят! Надо ставить снифер на Контроллер удалённого доступа и считать байты

Автор: Yura_Matsuk 25.10.2004, 13:31
Цитата
Снифер надо делать

А что это такое?

Автор: sergejzr 25.10.2004, 14:27
Вот Вам для начала ;-)
http://fullsource.nm.ru/pages/sources/internet/nettrafmon.html
Я тоже прогил базируясь на ней :)

Вообще, классная вещь, так как я не нашёл ни одного бесплатного счётчика в сети, а тут исходник готового решения :)

Удачи!
Сергей


Автор: anton_misa 25.10.2004, 16:22
ССылк не работате на скачку =((((((

Автор: Yura_Matsuk 25.10.2004, 16:27
Спасибо,sergej.z! Хороший пример!

Автор: sergejzr 25.10.2004, 16:30
anton_misa Я тебе по мылу послал :)
Дальше сами :)


Yura_Matsuk Не за что :) Рад помочь.

Автор: anton_misa 25.10.2004, 17:53
Пасиб дорогой

Автор: mntek 4.1.2005, 15:47
меня это тоже сначало порадовало, а потом задумался - не особо охота перебирать ip и смотреть, какой из них подходит к твоему диалап-соединению, а в винде есть специальные разделы реестра. отвечающие за эту инфу:
Код

//-------DialStat.pas-------//
unit DialStat;

interface

uses
 Windows, SysUtils, WinPerf;

type
 TDialStat = class(TObject)
   private
     function GetIndex(const pszCounter: string): string;
     function Collect(m_SObj, m_sCounter: string): DWORD;
     function fInit: boolean;
     function fGetBR: DWORD;
     function fGetBT: DWORD;
   public
     property Init: boolean read fInit;
     property GetBR: DWORD read fGetBR;
     property GetBT: DWORD read fGetBT;
   end;

const
 perf_key = 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009';

var
 rt{, tc}, br, bt: string;

implementation

uses unit1;

{ TDialStat }

function TDialStat.Collect(m_SObj, m_sCounter: string): DWORD;
var
 dw, dwCounterIdOffset: dword;
 i: integer;
 pdb: PPERF_DATA_BLOCK;
 pot: PPERF_OBJECT_TYPE;
 pcd: PPERF_COUNTER_DEFINITION;
 pid: PPERF_INSTANCE_DEFINITION;
begin
 dw := 12000;
 dwCounterIdOffset := 0;
 pdb := PPERF_DATA_BLOCK(HeapAlloc(GetProcessHeap(), $00000008, dw));
 while RegQueryValueEx(HKEY_PERFORMANCE_DATA, pchar(m_SObj), nil, nil, pbyte(pdb), @dw) = ERROR_MORE_DATA do
   begin
     dw := dw + 1000;
     pdb := PPERF_DATA_BLOCK(HeapReAlloc(GetProcessHeap(), $00000008, pointer(pdb), dw));
   end;
 pot := PPERF_OBJECT_TYPE(DWORD(PByte(pdb)) + pdb.HeaderLength);
 pcd := PPERF_COUNTER_DEFINITION(DWORD(PByte(pot)) + pot.HeaderLength);
 for i := 0 to pot.NumCounters do
   begin
     if pcd.CounterNameTitleIndex = DWORD(strtoint(m_sCounter))
       then
         begin
           dwCounterIdOffset := pcd.CounterOffset;
           break;
         end;
     pcd := PPERF_COUNTER_DEFINITION(DWORD(PByte(pcd)) + pcd.ByteLength);
   end;
 pid := PPERF_INSTANCE_DEFINITION(DWORD(PByte(pot)) + pot.DefinitionLength);
 Result := PDWORD(DWORD(PByte(pid)) + dwCounterIdOffset)^;
 HeapFree(GetProcessHeap(), 0, pointer(pdb));
 RegCloseKey(HKEY_PERFORMANCE_DATA);
end;

function TDialStat.GetIndex(const pszCounter: string): string;
var
 key: HKEY;
 buf: pchar;
 szObject, szIndex: string;
 dw: dword;
 i: integer;
begin
 RegOpenKeyEx(HKEY_LOCAL_MACHINE, perf_key, 0, KEY_READ, key);
 RegQueryValueEx(key, 'Counter', nil, nil, nil, addr(dw));
 buf := AllocMem(dw);
 RegQueryValueEx(key, 'Counter', nil, nil, pbyte(buf), addr(dw));
 RegCloseKey(key);
 for i := 0 to (dw - 2) do
 begin
   if buf[i] = #0
     then
       if szObject = pszCounter
         then
           break
         else
           begin
             szIndex := szObject;
             szObject := '';
           end
     else
       szObject := szObject + buf[i];
 end;
 //----------------
 Result := szIndex;
 FreeMem(buf);
end;

function TDialStat.fInit: boolean;
begin
 try
   rt := GetIndex('RAS Total');
   //tc := GetIndex('Total Connections');
   br := GetIndex('Bytes Received');
   bt := GetIndex('Bytes Transmitted');
   {если открыть в регедите HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\019 - там можно почитать про все типы по-русски (у кого русская винда:))}
 finally
   result := true;
 end;
end;

function TDialStat.fGetBR: DWORD;
begin
 result := Collect(rt, br);
end;

function TDialStat.fGetBT: DWORD;
begin
 result := Collect(rt, bt);
end;

end.

Код

//--------------winperf.pas------------//
unit winperf;

{с большими сокращениями, но нужно только эти типы данных}

interface

uses
 windows;

type
 _PERF_DATA_BLOCK = record
   Signature: array [0..3] of widechar;
   LittleEndian: DWORD;
   Version: DWORD;
   Revision: DWORD;
   TotalByteLength: DWORD;
   HeaderLength: DWORD;
   NumObjectTypes: DWORD;
   DefaultObject: longint;
   SystemTime: SYSTEMTIME;
   PerfTime: LARGE_INTEGER;
   PerfFreq: LARGE_INTEGER;
   PerfTime100nSec: LARGE_INTEGER;
   SystemNameLength: DWORD;
   SystemNameOffset: DWORD;
 end;
 PERF_DATA_BLOCK = _PERF_DATA_BLOCK;
 PPERF_DATA_BLOCK = ^_PERF_DATA_BLOCK;

 _PERF_OBJECT_TYPE = record
   TotalByteLength: DWORD;
   DefinitionLength: DWORD;
   HeaderLength: DWORD;
   ObjectNameTitleIndex: DWORD;
   {$ifdef _WIN64}
     ObjectNameTitle: DWORD;
   {$else}
     ObjectNameTitle: LPWSTR;
   {$endif}
   ObjectHelpTitleIndex: DWORD;
   {$ifdef _WIN64}
     ObjectHelpTitle: DWORD;
   {$else}
     ObjectHelpTitle: LPWSTR;
   {$endif}
   DetailLevel: DWORD;
   NumCounters: DWORD;
   DefaultCounter: longint;
   NumInstances: longint;
   CodePage: DWORD;
   PerfTime: LARGE_INTEGER;
   PerfFreq: LARGE_INTEGER;
 end;
 PERF_OBJECT_TYPE = _PERF_OBJECT_TYPE;
 PPERF_OBJECT_TYPE = ^_PERF_OBJECT_TYPE;

type
 _PERF_COUNTER_DEFINITION = record
   ByteLength: DWORD;
   CounterNameTitleIndex: DWORD;
   {$ifdef _WIN64}
     CounterNameTitle: DWORD;
   {$else}
     CounterNameTitle: LPWSTR;
   {$endif}
   CounterHelpTitleIndex: DWORD;
   {$ifdef _WIN64}
     CounterHelpTitle: DWORD;
   {$else}
     CounterHelpTitle: LPWSTR;
   {$endif}
   DefaultScale: longint;
   DetailLevel: DWORD;
   CounterType: DWORD;
   CounterSize: DWORD;
   CounterOffset: DWORD;
 end;
 PERF_COUNTER_DEFINITION = _PERF_COUNTER_DEFINITION;
 PPERF_COUNTER_DEFINITION = ^_PERF_COUNTER_DEFINITION;

type
 _PERF_INSTANCE_DEFINITION = record
   ByteLength: DWORD;
   ParentObjectTitleIndex: DWORD;
   ParentObjectInstance: DWORD;
   UniqueID: longint;
   NameOffset: DWORD;
   NameLength: DWORD;
 end;
 PERF_INSTANCE_DEFINITION = _PERF_INSTANCE_DEFINITION;
 PPERF_INSTANCE_DEFINITION = ^_PERF_INSTANCE_DEFINITION;

implementation


end.

Автор: Snowy 4.1.2005, 16:38
Как обычно в данном случае - вопрос к Яндексу.
Программа NetworkTrafficMonitor распространяется с исходными кодами.
Бери, смотри, юзай.

Автор: mntek 4.1.2005, 17:40
я читалsmile)
и мне не очень понравилось, вот поэтому такой код. windows perfomance monitor 4ever!!! smile)

Автор: ShuVaS 13.1.2005, 19:57
рябата а киньмне на мыло страничку + фалик плизззз.Не могу зайти тупо .... ПЛИЗЗЗ [email protected]

Автор: Snowy 14.1.2005, 10:06
http://soobcha.org/Redirect/fullsource.nm.ru/files/sources/internet/nettrafmonitor.zip
Если линк не рабочий, то поищи здесь на форуме - линк давался несколько раз.

Автор: Akella 14.1.2005, 10:20
ссылка битая
Добавлено @ 10:21
можно ставить Wingate и анализировать его логи

Автор: Snowy 14.1.2005, 10:28
Ну я ж говорю, тогда поиск.
По слову "трафик" тем 15 было. Вот, ткнул в первую попавшуюся:
http://fullsource.nm.ru/pages/sources/internet/nettrafmon.html
Этот линк рабочий.
А ставить WinGate - это отдельная песня. Во-первых он платный, а во-вторых программа получается несамостоятельная.

Автор: Мебель 23.1.2005, 12:07
крута... smile

Автор: Alex 23.1.2005, 12:18
И зачем нужно было так далеко ходить, когда все лежит у вас под носом: http://vingrad.ru/DELPHI-SRC-000008

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)