![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подсчёт трафика в Delphi [D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]
Alban © (2007-02-12 00:19:00)Подскажите пожалуйста кто знает как подсчитывать трафик по каждому IP-адресу отдельно
Alban (2007-02-18 22:06:00) [1]Спасибо за помощь, а как узнать IP-адрес
alexm_hs (2007-02-16 23:48:00) [2]Тебе помогут функции из 'IPHLPAPI.DLL'
Вот пример. Кусок выдрал из проги, может чегонить забыл включить, но догадаться можно будет
type
TMibIfTable = packed record
dwNumEntries: DWORD;
Table: TMibIfArray;
end;
PMibIfTable = ^TMibIfTable;
var
GetIfTable: function(pIfTable: PMibIfTable;
pdwSize: PULONG;
bOrder: Boolean): DWORD; stdcall;
procedure TTrafficForm.tmrTrafficTimer(Sender: TObject);
var in_b, out_b: string;
// IntrNum, Rez: DWORD;
// Вспомогательная функция, преобразующая МАС адрес к "нормальному" виду
//Определяем специальный тип, чтобы можно было передать в функцию массив
type TMAC = array[0..7] of Byte;
//В качестве первого значения массив, второе значение, размер данных в массиве
function GetMAC(Value: TMAC; Length: DWORD): string;
var
i: Integer;
begin
if Length = 0 then Result := '00-00-00-00-00-00' else
begin
Result := '';
for i := 0 to Length - 2 do
Result := Result + IntToHex(Value[i], 2) + '-';
Result := Result + IntToHex(Value[Length - 1], 2);
end;
end;
function FormatSize(str: string): string;
var i, j: integer;
res: string;
begin
j := 0;
for i := length(str) downto 1 do begin
if j = 3 then begin res := ' ' + res; j := 0; end;
res := str[i] + res;
inc(j);
end;
result := res;
end;
//Сама процедура
var
FLibHandle: THandle;
Table: TMibIfTable;
// Row: TMibIfRow;
i: integer;
Size: integer;
in_t, out_t, delta_in, delta_out: int64;
begin
tmrTraffic.Enabled := false; //Приостанавливаем на всякий случай таймер
lvTraffic.Items.BeginUpdate;
lvTraffic.Items.Clear; //Очищаем список
FLibHandle := LoadLibrary('IPHLPAPI.DLL'); //Загружаем библиотеку
if FLibHandle = 0 then Exit;
@GetIfTable := GetProcAddress(FLibHandle, 'GetIfTable');
if not Assigned(GetIfTable) then
begin
FreeLibrary(FLibHandle);
exit;
end;
Size := SizeOf(Table);
if GetIfTable(@Table, @Size, false) = 0 then //Выполняем функцию
for i := 0 to Table.dwNumEntries - 1 do begin
with lvTraffic.Items.Add do begin //Выводим результаты
Caption := string(Table.Table[i].bDescr); //Наименование интерфейса
SubItems.Add(GetMAC(TMAC(Table.Table[i].bPhysAddr),
Table.Table[i].dwPhysAddrLen)); //MAC адрес
SubItems.Add(FloatToStr(Table.Table[i].dwSpeed / 1000000)); //скорость
in_t := Table.Table[i].dwInOctets;
out_t := int64(Table.Table[i].dwOutOctets);
delta_in := abs(in_t - buff_in[i]);
delta_out := abs(out_t - buff_out[i]);
in_b := IntToStr(buff_in[i] + Delta_in);
out_b := IntToStr(buff_out[i] + delta_out);
Buff_in[i] := in_t;
Buff_out[i] := out_t;
SubItems.Add(FormatSize(in_b) + ' (' + Format('%.2f', [delta_in / 1024]) + ' кб/с)'); //Всего принято байт
SubItems.Add(FormatSize(out_b) + ' (' + Format('%.2f', [delta_out / 1024]) + ' кб/с)'); //Всего отправлено байт
end;
end;
lvTraffic.Items.EndUpdate;
FreeLibrary(FLibHandle);
tmrTraffic.Enabled := true; //Не забываем активировать таймер
for i := 0 to lvTraffic.Items.Count - 1 do
if lvTraffic.Items.Item[i].Caption = SelItemText then lvTraffic.Items.Item[i].Selected := true;
end;