Главная страница
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.47 MB
Время: 0.03 c
15-1171350596
Леприкон
2007-02-13 10:09
2007.03.11
Компонент для панели поиска


2-1171995551
abba
2007-02-20 21:19
2007.03.11
Как определить сколько файлов в папке?


15-1171536457
mmms
2007-02-15 13:47
2007.03.11
Какой процессор взять, требуется совет...


15-1171465263
Ученик чародея
2007-02-14 18:01
2007.03.11
JavaScript


2-1171718834
Novichok_New
2007-02-17 16:27
2007.03.11
Проверка почты