Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.11;
Скачать: CL | DM;

Вниз

Подсчёт трафика в Delphi   Найти похожие ветки 

 
Alban ©   (2007-02-12 00:19) [0]

Подскажите пожалуйста кто знает как подсчитывать трафик по каждому IP-адресу отдельно


 
alexm_hs ©   (2007-02-16 23:48) [1]

Тебе помогут функции из "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;


 
Alban ©   (2007-02-18 22:06) [2]

Спасибо за помощь, а как узнать IP-адрес



Страницы: 1 вся ветка

Текущий архив: 2007.03.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.052 c
15-1171349663
Virgo_Style
2007-02-13 09:54
2007.03.11
Помогите найти старый мультфильм


1-1168784135
The X
2007-01-14 17:15
2007.03.11
Корректная работа с CHM-хелпами в Delphi5.


2-1171722532
НОВИЧЕК2007
2007-02-17 17:28
2007.03.11
добавить / удалить строку


15-1171510884
Slider007
2007-02-15 06:41
2007.03.11
С днем рождения ! 15 февраля


3-1165846925
kymnyoff
2006-12-11 17:22
2007.03.11
Настройка BDE