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

Вниз

Domain_name_IP_Traffic   Найти похожие ветки 

 
jonin   (2009-05-17 14:05) [0]

как то я спрашивал про определение ИПов трафика и тд, мне подсказали прогу посмотреть эту дак вот я посмотрел там проип и трафик и нашол сверху в коде (  dwSpeed          : DWORD; // определяет текущую скорость передачи в битах в секунду)мне скорость тоже надо определить не нечего чтото не получаеться(

вот сам код программа http://www.delphisources.ru/pages/sources/internet/1_internet.html

подскажите может раз там есть dwSpeed  то как то можно определить скорость или вывести


 
Сергей М. ©   (2009-05-17 14:22) [1]


> надо определить не нечего чтото не получаеться


Что конкретно не получается ?


 
jonin   (2009-05-17 16:10) [2]

я дамал раз там есть dwSpeed, то ее как то присвоить или вызвать и будет у меня вывадиться скорость соединения с интернетом

> Что конкретно не получается ?

вывести скорость


 
Сергей М. ©   (2009-05-17 16:31) [3]

Add("dwSpeed : " + IntToStr(Table.Table[i].dwSpeed));


 
jonin   (2009-05-17 16:38) [4]

ипшет 10000000


 
Сергей М. ©   (2009-05-17 16:54) [5]

Раз пишет, значит "вывести скорость" у тебя получилось, т.е. проблема решена.
Что еще ?


 
jonin   (2009-05-17 17:04) [6]

это такая скорость?) даже если ее перевсети ну получиться около 1000кб а мне нужно ту скорость которая реальная при закачке
мне бы надо чтобы скорость выводило реальную вот посмотрите как тут выводит
http://www.delphi.int.ru/files/sources/sources_n/nettrafmonitor.zip


 
Сергей М. ©   (2009-05-17 17:29) [7]


> мне нужно ту скорость которая реальная при закачке


Какой такой еще "закачке" ?

Значение dwSpeed не имеет ни малейшего отношения к каким-то там "закачкам", это Link Speed сетевого интерфейса, а не Download Speed какой-то там программной "качалки"


 
jonin   (2009-05-18 06:07) [8]

дак я же не знаю вот и спрашиваю, а как определить Download Speed


 
Сергей М. ©   (2009-05-18 08:53) [9]


> как определить Download Speed


 dwInOctets       : DWORD; // содержит количество байт принятых через интерфейс

Абсолютная разность значений dwInOctets, полученных в начале и в конце некоего периода времени, отнесенная к длительности этого периода, даст искомую "скорость закачки".


 
jonin   (2009-05-18 20:46) [10]

а если мне сколько скачено делить на время то тоже же получиться скорость?


 
Сергей М. ©   (2009-05-18 21:12) [11]


> а если мне


И тебе тоже)


 
jonin   (2009-05-19 16:10) [12]

а как перевсети из real в Bytes
я считаю в прграмме как бы делю все это и вывожу но чтобы вывести данные мне нужен тип стринг, перевел так FloatToStr, а можно как нибудь сдеалть так же как BytesToString ?


 
Сергей М. ©   (2009-05-19 16:18) [13]


> jonin   (19.05.09 16:10) [12]


Бррр ..
Ничего не понял)

Какие такие real и Bytes ? Откуда они взялись ?


 
jonin   (2009-05-19 16:32) [14]

черт нечего не получаеться Т_Т сейчас посмотрел я время делаю постоянно time:=time+1 а сколько скачено беру dwInOctets

а ты сказал что нужно брать разность между ними через момаент времяни.

как я понял брать dwInOctets присвоить его к какой то переменной например A, дальше через секунду я его присваюиваю например к B дальше из B-A приравниваю к C а дальше что С делить на time:=time+1


 
Сергей М. ©   (2009-05-19 16:38) [15]


> а дальше что С делить на time:=time+1


Зачем делить-то, если "через секунду" ?

N / 1 = N

Если период опроса равен 1 секунде, то и делить ничего не надо : разница B - A и есть скорость, выраженная в байтах в секунду ..

Делить следует. если период опроса не равен 1 секунде)


 
jonin   (2009-05-19 17:01) [16]

ааа вон что)) блин ступил
а как вот теперь сделать чтобы была эта задержка в  1секунду если делать проверку в таймере с интервалом в 1000(1сек) то получиться что оно мгновенно прравняет и вычтет из B A и получиться 0 надо как то чтобы бал промежуток в 1 сек, подскажи как я в таймере делаю инадо наверно какое то условие
a:=Table.Table[i].dwInOctets;
if(прошла секунда) then
                                 b:=Table.Table[i].dwInOctets;
                                 c=b-a; // вот эта самая скорость)
                           end;

подскажите с условием пожалуйста


 
Сергей М. ©   (2009-05-19 17:29) [17]

var
 a : DWord= 0; // статическая (!!) переменная твоего юнита
 b, с : DWord= 0; // локальные переменные метода-обработчика таймера

В обработчике OnTimer :

- подключаешься к MifTable, читаешь dwInOctets в переменную b

- вычисляешь разницу:
c := b - a

- сохраняешь тек.значение b в переменную a
a := b

- показываешь с:

MyForm.MyLabel.Caption := IntToStr(c) + " байт в секунду"


 
jonin   (2009-05-19 18:22) [18]


>  a : DWord= 0; // статическая (!!) переменная

это типо глобальная?

и когда я делаю в таймере в варе пишу b, с : DWord= 0; указатель показывает на 0 и пишет в ошибках Cannot initialize local variable


> - подключаешься к MifTable

сори за нубский вопрос, они правдо все нубские) я ведь только учусь
каким образом это сделать?


 
Сергей М. ©   (2009-05-19 20:05) [19]


> это типо глобальная?


Это типо нелокальная.


> пишу b, с : DWord= 0;


Жирное убери.


> каким образом это сделать?


Ну у тебя же есть перед носом пример

> вот сам код программа http://www.delphisources.ru/pages/sources/internet/1_internet. html


 
jonin   (2009-05-19 20:34) [20]


> подключаешься к MifTable

блин я не знаю как это сделать код то не мой да и до конца я с ним не разобрался подскажи плиз как то сделать


 
Сергей М. ©   (2009-05-19 20:38) [21]


> я с ним не разобрался


Ну так давай уже разбирайся до конца !
Что мешает ? Что в этом коде не понятно ?


 
jonin   (2009-05-19 20:55) [22]

ну вот ты говоришь подключаешься к MifTable
там вот переменная Table: TMibIfTable; я ее в глобальные переменные переношу чтобы его видели все процедуры в том числе и таймер
но при компиляции на нее ошибка
Undeclared identifier: "TMibIfTable"

после нее еще одна типо оьявленна в этом коде
Identifier redeclared: "TMibIfTable"
вот на это показывает что он сново оьявлен
type
TMibIfTable = packed record
  dwNumEntries: DWORD;
  Table       : TMibIfArray;
end;
PMibIfTable = ^TMibIfTable;

var
GetIfTable:function(pIfTable: PMibIfTable; pdwSize: PULONG;
                             bOrder: Boolean): DWORD; stdcall;


вот я и не пойму куда что добовлять


 
jonin   (2009-05-19 21:05) [23]

вот сейчас сделал в ту же процедуру где все определяеться а не в отдельный таймер в итоге у меня выводит примерно в районе
4274004809 байт в секунду
ка то мне это кажеться как то много потому тчо у меня скорость интернет соединения 1мб но по идее не выше 180кб


 
Сергей М. ©   (2009-05-19 21:29) [24]


> сделал в ту же процедуру где все определяеться а не в отдельный
> таймер


Так а как же ты без таймера секундные интервалы отсчитываешь ?)


 
jonin   (2009-05-20 06:10) [25]

да нет она в таймере
procedure TForm1.Timer2Timer(Sender: TObject);
// вспомогательная функция, преобразующая МАС адрес к
// "нормальному" виду определяем специальный тип, чтобы
// можно было передать в функцию массив
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;

var
FLibHandle: THandle;
Table: TMibIfTable;
i, Size, DS, a1, b1: integer;
s, trafnormin, trafnormout, dio : string;
DTS : real;
b, c : DWord ;
begin
Timer2.Enabled:=false; // приостанавливаем на всякий случай таймер
ListBox1.Items.BeginUpdate;
ListBox1.Items.Clear; // очищаем список
FLibHandle:=LoadLibrary("IPHLPAPI.DLL"); // загружаем библиотеку
if FLibHandle=0
then Exit;
@GetIfTable:=GetProcAddress(FLibHandle, "GetIfTable");
if not Assigned(GetIfTable)
then
 begin
  FreeLibrary(FLibHandle);
  Close;
 end;
//
Size:=SizeOf(Table);
if GetIfTable(@Table,@Size,false)=0
then // выполняем функцию
 for i:=0 to Table.dwNumEntries-1 do // кол-во сетевых карт
  begin
   with ListBox1.Items do
    begin // выводим результаты
     // if string(GetMAC(TMAC(Table.Table[i].bPhysAddr),Table.Table[i].dwPhysAddrLen))<>"00 -00-00-00-00-00" // сравнение MAC адресов
     // then
      begin
       Add({"Description: "+}string(Table.Table[i].bDescr)); // наименование интерфейса
       Add("MAC-adress: "+string(GetMAC(TMAC(Table.Table[i].bPhysAddr),Table.Table[i].dwPhysAddrLen))); // МАС адрес
       // перевод к нормальным единицам "Входящего" трафика
       trafbitin:=Table.Table[i].dwInOctets; // всего принято байт
       trafnormin:=BytesToString(trafbitin);
       Form1.Edit_traf_in.Text:=trafnormin;
       // перевод к нормальным единицам "Исходящего" трафика
       trafbitout:=Table.Table[i].dwOutOctets; // всего отправлено байт
       trafnormout:=BytesToString(trafbitout);
       Form1.Edit_traf_out.Text:=trafnormout;
       ////////////////////////////////////// сброс трафика
       if stop_traf=true
       then
        begin
         trafbitold:=trafbitin;
         trafnormin:="0,00 B";
         trafnormout:="0,00 B";
        end;
       //
       if trafbitin>=trafbitold // новый трафик больше старого
       then
        begin
         trafbitin:=trafbitin-trafbitold;
         trafnormin:=BytesToString(trafbitin);

        end
       else  // новый трафик меньше старого
        begin
         trafbitin:=trafbitold;
         trafnormin:=BytesToString(trafbitin);
        end;
       /////////////////////////////////////
       Add({"In (Byte): "+}trafnormin); // всего принято байт
       Add({"Out (Byte): "+}trafnormout); // всего отправлено байт
       Add("-------------------------------------------------"); //
       Form1.Label_Description.Caption:=(Form1.ListBox1.Items[0]);

      end;
    end;

b:=Table.Table[i].dwInOctets;
c:=b-a;
a:=b;
Form1.Edit3.Text:=IntToStr(c) + " байт в секунду";
  end;
//
EnumInterfaces(s);
ListBox1.Items.Add(s);
//
ListBox1.Items.EndUpdate;
FreeLibrary(FLibHandle);
Timer2.Enabled:=true; // не забываем активировать таймер
Form1.Edit1.Text:=Form1.ListBox1.Items[8];
Form1.Edit2.Text:=Form1.ListBox1.Items[7];
end;


 
jonin   (2009-05-20 06:13) [26]

видишь она в таймере), по идее ты подсказал мне правильно далеть
b:=Table.Table[i].dwInOctets;
c:=b-a;
a:=b;
Form1.Edit3.Text:=IntToStr(c) + " байт в секунду";
но почему козда даже разеденяешь соединение с интернетом он пишет такое большое число, 4274004809 байт в секунду


 
Сергей М. ©   (2009-05-20 11:21) [27]


type
TMibIfRow = packed record
 wszName          : array[0..255] of WideChar;
 dwIndex          : DWORD;
 dwType           : DWORD;
 dwMtu            : DWORD;
 dwSpeed          : DWORD;
 dwPhysAddrLen    : DWORD;
 bPhysAddr        : array[0..7] of Byte;
 dwAdminStatus    : DWORD;
 dwOperStatus     : DWORD;
 dwLastChange     : DWORD;
 dwInOctets       : DWORD;
 dwInUcastPkts    : DWORD;
 dwInNUCastPkts   : DWORD;
 dwInDiscards     : DWORD;
 dwInErrors       : DWORD;
 dwInUnknownProtos: DWORD;
 dwOutOctets      : DWORD;
 dwOutUCastPkts   : DWORD;
 dwOutNUCastPkts  : DWORD;
 dwOutDiscards    : DWORD;
 dwOutErrors      : DWORD;
 dwOutQLen        : DWORD;
 dwDescrLen       : DWORD;
 bDescr           : array[0..255] of Char;
end;
TMibIfArray = array [0..512] of TMibIfRow;
PMibIfRow = ^TMibIfRow;
PMibIfArray = ^TMibIfArray;

TMibIfTable = packed record
  dwNumEntries: DWORD;
  Table       : TMibIfArray;
end;
PMibIfTable = ^TMibIfTable;

TGetIfTable = function(pIfTable: PMibIfTable; pdwSize: PULONG; bOrder: Boolean): DWORD; stdcall;

PMAC = ^TMAC;
TMAC = array [0..5] of Byte;

PIfDataItem = ^TIfDataItem;
TIfDataItem = packed record
   MAC: TMAC;
   SentAmount, RcvdAmount: DWord;
   SentDelta, RcvdDelta: DWord;
end;
TIfData = array of TIfDataItem;

var
 FLibHandle: THandle = 0;
 GetIfTable: TGetIfTable;
 IfTable: TMibIfTable;
 IfTableSize: DWord;
 IfData: TIfData;

procedure TForm1.Button6Click(Sender: TObject);
begin
 if Timer1.Enabled then begin
   Timer1.Enabled := False;
   SetLength(IfData, 0);
   FreeLibrary(FLibHandle);
 end
 else
 begin
   FLibHandle := LoadLibrary("IPHLPAPI.DLL"); // загружаем библиотеку
   Win32Check(FLibHandle <> 0);
   GetIfTable:=GetProcAddress(FLibHandle, "GetIfTable");
   Win32Check(Assigned(@GetIfTable));
   Timer1.Interval := 1000;
   Timer1.Enabled := True;
 end;
end;

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 GetItemByMAC(var AMAC: TMAC): PIfDataItem;
var
 i: Integer;
begin
 Result := nil;
 for i := 0 to Length(IfData) - 1 do
   if CompareMem(@IfData[i].MAC, @AMAC, SizeOf(TMAC)) then
   begin
     Result := @IfData[i];
     Break;
   end;
 if not Assigned(Result) then
 begin
   i := Length(IfData);
   SetLength(IfData, i + 1);
   Result := @IfData[i];
   with Result^ do
   begin
     Move(AMAC, MAC, SizeOf(TMAC));
     SentAmount := 0;
     RcvdAmount := 0;
     SentDelta := 0;
     RcvdDelta := 0;
   end;
 end;
end;

function GetUpdatedIfDataItem(var AMAC: TMAC; ASent, ARcvd: DWord): PIfDataItem;
begin
 Result := GetItemByMAC(AMAC);
 with Result^ do
 begin
   SentDelta := Max(ASent - SentAmount, 0);
   RcvdDelta := Max(ARcvd - RcvdAmount, 0);
   SentAmount := ASent;
   RcvdAmount := ARcvd;
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
 MAC: PMAC;
 SendSpeed, RecvSpeed: DWord;
 IfDataItem: PIfDataItem;
 i, Seconds: Integer;
begin
 Memo.Clear;
 if GetIfTable(@IfTable, @IfTableSize, False) = 0 then
 begin
   Seconds := Timer1.Interval div 1000;
   for i:= 0 to IfTable.dwNumEntries-1 do //цикл по всем интерфейсам
     with IfTable.Table[i], Memo.Lines do
     begin
       MAC := @IfTable.Table[i].bPhysAddr;
       IfDataItem := GetUpdatedIfDataItem(MAC^, dwOutOctets, dwInOctets);
       SendSpeed := IfDataItem.SentDelta div Seconds;
       RecvSpeed := IfDataItem.RcvdDelta div Seconds;
       Add("--------------------------------------------------");
       Add("MAC address        : " + GetMAC(MAC^, dwPhysAddrLen));
       Add("Description        : " + string(bDescr)); // описание интерфейса
       Add("Amount bytes sent  : " + IntToStr(dwOutOctets));
       Add("Amount bytes rcvd  : " + IntToStr(dwInOctets));
       Add("Average send speed : " + IntToStr(SendSpeed) + " bytes per sec (" + FormatFloat("# ##0.0", SendSpeed/1024) + " kbytes per sec)");
       Add("Average recv speed : " + IntToStr(RecvSpeed) + " bytes per sec (" + FormatFloat("# ##0.0", RecvSpeed/1024) + " kbytes per sec)");;
     end;
 end;
end;


 
jonin   (2009-05-20 19:04) [28]

оуоу 0_0 спасибо огромное за пмошь Сергей М. , наверно ты просто не вытерпел моей тупости) я просто еще мало что знаю а проект задали чтоббы мы сами изучали и делали, я немножко конечно переделаю и выводить буду не в мемо
СПАСИБО за помошь Сергей!
и еще вопросик 1 как делать так чтобы запись из базы удалять последнюю?
и еще правдо 1) а мне интересно сколько вам лет?


 
Сергей М. ©   (2009-05-20 19:58) [29]


> просто не вытерпел


Эт точно)


> задали чтоббы мы сами изучали и делали


А получается-то иначе).. Не стыдно ?


> как делать так чтобы запись из базы удалять последнюю?


Из какой такой "базы" ?
Из базы данных что ли ?
В базе данных нет никаких записей - ни первой ни последней.
Смотри не ляпни эту глупость преподу - банан тебе будет обеспечен)


 
jonin   (2009-05-21 07:28) [30]


> А получается-то иначе).. Не стыдно ?

ну дак я изучаю) но трудно когда все с 0 и чтото новое ранее не известное, вот и приходиться просить помощи узнавать

//а сколько вам лет? ответьте пожалуйста, просто интересно, вы неверно много знаете


 
Dennis I. Komarov ©   (2009-05-21 09:35) [31]


> > просто не вытерпел
>
>
> Эт точно)


Мда, за мое отсутствие что-то случилось? :)


 
Сергей М. ©   (2009-05-21 09:52) [32]


> Dennis I. Komarov ©   (21.05.09 09:35) [31]


> за мое отсутствие что-то случилось?


А мы как-то и не заметили, что ты выходил "до вiтру")


 
jonin   (2009-05-28 16:04) [33]

подскажиье вот там начинаеться цикл по количеству сетевых рарт, я вот что не пойму у меня она как бы 1)

а вывод вот аткой скажите что 2  и 3?
-------------------------------------------------- // вот моя сетевая карти
MAC address        : 00-16-E6-4E-0D-AF
Description        : Broadcom NetLink (TM) Gigabit Ethernet - Минипорт планировщика пакетов
Amount bytes sent  : 41460
Amount bytes rcvd  : 552265272
0,0 Kb/s
59,2 Kb/s
-------------------------------------------------- // а вот здесь что?
MAC address        : 00-53-45-00-00-00
Description        : WAN (PPP/SLIP) Interface
Amount bytes sent  : 13636916
Amount bytes rcvd  : 459658932
1,4 Kb/s
57,4 Kb/s
-------------------------------------------------- // а вот здесь что?
MAC address        : 00-00-00-00-00-00
Description        : MS TCP Loopback interface
Amount bytes sent  : 554240835
Amount bytes rcvd  : 554240835
67,1 Kb/s
67,1 Kb/s

сори заранее за тупость) но чтото не пойму


 
Сергей М. ©   (2009-05-28 16:25) [34]


> у меня она как бы 1


Одну ты и видишь - Broadcom NetLink (TM) Gigabit Ethernet.

А остальные не карты, а виртуальные сетевые интерфейсы.

Связь с "внешиним миром" осуществляется непосредственно через сетевые интерфейсы, ассоциированные с реальными физическими устройствами, такими как в дан.случае твоя сет.карта, остальные интерфейсы тебя заботить не должы, если тебя интересует именно "закачка" и "вкачка")


 
jonin   (2009-05-28 16:31) [35]

спасибо что разяснил)


 
jonin   (2009-06-05 17:01) [36]


type
TMibIfRow = packed record
 wszName          : array[0..255] of WideChar;  // указатель на строку содержащую имя интерфейса
 dwIndex          : DWORD; // определяет индекс интерфейса
 dwType           : DWORD; // определяет тип интерфейса
 dwMtu            : DWORD; // определяет максимальную скорость передачи
 dwSpeed          : DWORD; // определяет текущую скорость передачи в битах в секунду
 dwPhysAddrLen    : DWORD; // определяет длину адреса
 bPhysAddr        : array[0..7] of Byte; // содержит физический адрес интерфейса (если проще то его, немного видоизмененный, МАС адрес)
 dwAdminStatus    : DWORD; // определяет активность интерфейса
 dwOperStatus     : DWORD; // текущий статус интерфейса
 dwLastChange     : DWORD; // последний измененный статус
 dwInOctets       : DWORD; // содержит количество байт принятых через интерфейс
 dwInUcastPkts    : DWORD; // количество байт принятых через интерфейс
 dwInNUCastPkts   : DWORD; // количество ненаправленных пакетов принятых интерфейсом
 dwInDiscards     : DWORD; // количество забракованных входящих пакетов
 dwInErrors       : DWORD; // количество входящих пакетов содержащих ошибки
 dwInUnknownProtos: DWORD; // количество забракованных входящих пакетов со структурой неизвестного протокола
 dwOutOctets      : DWORD; // содержит количество байт отправленных интерфейсом
 dwOutUCastPkts   : DWORD; // количество направленных пакетов отправленных интерфейсом
 dwOutNUCastPkts  : DWORD; //
 dwOutDiscards    : DWORD; // количество забракованных исходящих пакетов
 dwOutErrors      : DWORD; // количество исходящих пакетов содержащих ошибки
 dwOutQLen        : DWORD; // содержит длину очереди данных
 dwDescrLen       : DWORD; //
 bDescr           : array[0..255] of Char; // cодержит описание интерфейса
end;
TMibIfArray = array [0..512] of TMibIfRow;
PMibIfRow = ^TMibIfRow;
PMibIfArray = ^TMibIfArray;

TMibIfTable = packed record
 dwNumEntries: DWORD; // количество сетевых интерфейсов
 Table       : TMibIfArray; // массив структур MIB_IF_ROW
end;
PMibIfTable = ^TMibIfTable;

TGetIfTable = function(pIfTable: PMibIfTable; pdwSize: PULONG; bOrder: Boolean): DWORD; stdcall;

PMAC = ^TMAC;
TMAC = array [0..5] of Byte;

PIfDataItem = ^TIfDataItem;
TIfDataItem = packed record
  MAC: TMAC;
  SentAmount, RcvdAmount: DWord;
  SentDelta, RcvdDelta: DWord;
end;
TIfData = array of TIfDataItem;

var
FLibHandle: THandle = 0;
GetIfTable: TGetIfTable;
IfTable: TMibIfTable;
IfTableSize: DWord;
IfData: TIfData;

procedure TForm1.Button6Click(Sender: TObject);
begin
if Timer1.Enabled then begin
  Timer1.Enabled := False;
  SetLength(IfData, 0);
  FreeLibrary(FLibHandle);
end
else
begin
  FLibHandle := LoadLibrary("IPHLPAPI.DLL"); // загружаем библиотеку
  Win32Check(FLibHandle <> 0);
  GetIfTable:=GetProcAddress(FLibHandle, "GetIfTable");
  Win32Check(Assigned(@GetIfTable));
  Timer1.Interval := 1000;
  Timer1.Enabled := True;
end;
end;

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 GetItemByMAC(var AMAC: TMAC): PIfDataItem;
var
i: Integer;
begin
Result := nil;
for i := 0 to Length(IfData) - 1 do
  if CompareMem(@IfData[i].MAC, @AMAC, SizeOf(TMAC)) then
  begin
    Result := @IfData[i];
    Break;
  end;
if not Assigned(Result) then
begin
  i := Length(IfData);
  SetLength(IfData, i + 1);
  Result := @IfData[i];
  with Result^ do
  begin
    Move(AMAC, MAC, SizeOf(TMAC));
    SentAmount := 0;
    RcvdAmount := 0;
    SentDelta := 0;
    RcvdDelta := 0;
  end;
end;
end;

function GetUpdatedIfDataItem(var AMAC: TMAC; ASent, ARcvd: DWord): PIfDataItem;
begin
Result := GetItemByMAC(AMAC);
with Result^ do
begin
  SentDelta := Max(ASent - SentAmount, 0);
  RcvdDelta := Max(ARcvd - RcvdAmount, 0);
  SentAmount := ASent;
  RcvdAmount := ARcvd;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
MAC: PMAC;
SendSpeed, RecvSpeed: DWord;
IfDataItem: PIfDataItem;
i, Seconds: Integer;
begin
Memo.Clear;
if GetIfTable(@IfTable, @IfTableSize, False) = 0 then
begin
  Seconds := Timer1.Interval div 1000;
  for i:= 0 to IfTable.dwNumEntries-1 do //цикл по всем интерфейсам
    with IfTable.Table[i], Memo.Lines do
    begin
      MAC := @IfTable.Table[i].bPhysAddr;
      IfDataItem := GetUpdatedIfDataItem(MAC^, dwOutOctets, dwInOctets);
      SendSpeed := IfDataItem.SentDelta div Seconds;
      RecvSpeed := IfDataItem.RcvdDelta div Seconds;
      Add("--------------------------------------------------");
      Add("MAC address        : " + GetMAC(MAC^, dwPhysAddrLen));
      Add("Description        : " + string(bDescr)); // описание интерфейса
      Add("Amount bytes sent  : " + IntToStr(dwOutOctets));
      Add("Amount bytes rcvd  : " + IntToStr(dwInOctets));
      Add("Average send speed : " + IntToStr(SendSpeed) + " bytes per sec (" + FormatFloat("# ##0.0", SendSpeed/1024) + " kbytes per sec)");
      Add("Average recv speed : " + IntToStr(RecvSpeed) + " bytes per sec (" + FormatFloat("# ##0.0", RecvSpeed/1024) + " kbytes per sec)");;
    end;
end;
end;


подскажи подалуйста функции что делают построчно( а то я половину так и не разобрался( что ношол что не понял в принципе что делает, если можно то поподробнее


 
Сергей М. ©   (2009-06-05 21:15) [37]


> половину так и не разобрался


Задавай конкретные вопросы, по каждой строке из той "половины", в которой ты так и не разобрался ..


 
jonin   (2009-06-06 10:31) [38]

TMibIfArray = array [0..512] of TMibIfRow; // ассив типа TMibIfRow кторырй был описан выше ?
PMibIfRow = ^TMibIfRow; // что тут делают и зачем?
PMibIfArray = ^TMibIfArray; //

TMibIfTable = packed record
dwNumEntries: DWORD; // количество сетевых интерфейсов
Table       : TMibIfArray; // массив структур MIB_IF_ROW
end;
PMibIfTable = ^TMibIfTable;

TGetIfTable = function(pIfTable: PMibIfTable; pdwSize: PULONG; bOrder: Boolean): DWORD; stdcall;

PMAC = ^TMAC;
TMAC = array [0..5] of Byte;

PIfDataItem = ^TIfDataItem;
TIfDataItem = packed record
 MAC: TMAC;
 SentAmount, RcvdAmount: DWord;
 SentDelta, RcvdDelta: DWord;
end;
TIfData = array of TIfDataItem;

var
FLibHandle: THandle = 0;
GetIfTable: TGetIfTable;
IfTable: TMibIfTable;
IfTableSize: DWord;
IfData: TIfData;


и вобще облязел форумы сайты, постоянно всплывают похожике воросы но вот про то чтобы код был с коментариями нет( вот и приходитьс яяискать по строчкам да по функциям(все юзают этот исходник и нечего не понимают а я хочу понять и разобраться, но как то плохо олучаеться


 
Сергей М. ©   (2009-06-06 18:56) [39]


> TMibIfArray = array [0..512] of TMibIfRow; // ассив типа
> TMibIfRow кторырй был описан выше ?


Да.


> PMibIfRow = ^TMibIfRow; // что тут делают и зачем?


Тут делают объявление указательного типа данных - отныне данные типа PMibIfRow будут указывать на данные типа TMibIfRow ("на огурцах" - переменная типа PMibIfRow должна рассматриваться компилятором как переменная, хранящая адрес переменной типа TMibIfRow)


> и вобще облязел форумы сайты, постоянно всплывают похожике
> воросы но вот про то чтобы код был с коментариями нет


Имей совесть - пиши ПО-РУССКИ, с соблюдением хотя бы синтаксиса и пунктуации.
Смотреть противно на эту поганую писанину.
Не говоря уже о желании помочь тебе после наблюдения этого буквоблудия.


> все юзают этот исходник


Я не юзаю, уверяю тебя в этом)
Мне повеситься ?


> и нечего не понимают


Отлично понимаю, несмотря на то что вижу этот код впервые.
Так что, веревку мне мылить или немного погодить ?)


 
jonin   (2009-06-06 21:26) [40]

извиняюсь за написание) поторопился
дак ты разбираешься очень хорошо, а я только начинаю изучать
а гденибудь можно про этот код прочитать или про примерно похожий? потому что в книгах с коментариями пишут а в интернете половина без(


 
jonin   (2009-06-06 21:31) [41]

TGetIfTable = function(pIfTable: PMibIfTable; pdwSize: PULONG; bOrder: Boolean): DWORD; stdcall; а вот что что функция делает?


 
Сергей М. ©   (2009-06-07 10:06) [42]

Это не функция, а декларация (объявление) ее прототипа.
Код самой ф-ции находится в iphlpapi.dll.
Эта библиотека экспортирует (публикует) текстовый идентификатор "GetIfTable", по которому после загрузки этой dll с пом., например, ф-ции GetProcAddress() можно получить точку входа (адрес начальной инструкции) в эту функцию и присвоить полученное значение некоей переменной MyGetIfTable, имеющей тип TGetIfTable. Последующие операторы вида
MyResult := MyGetIfTable(фактические параметры)
указывают компилятору на необходимость вызова ф-ции, адрес которой находится в переменной MyGetIfTable.
Ф-ция iphlpapi.GetIfTable предназначена для получения мгновенного информационного "снимка", содержащего таблицу текущего состояния сетевых интерфейсов. Каждая строка таблицы содержит структурированные данные, описывающие отдельный интерфейс и его тек.состояние.

http://www.xakep.ru/magazine/xa/100/116/1.asp


 
jonin   (2009-06-07 12:15) [43]

а дальше описываються переменные которые в этой длл используються?


 
jonin   (2009-06-07 13:03) [44]

procedure TForm1.Button6Click(Sender: TObject);
begin
if Timer1.Enabled then begin
 Timer1.Enabled := False;
 SetLength(IfData, 0); // вот здесь что делаеться?
 FreeLibrary(FLibHandle);
end
else
begin
 FLibHandle := LoadLibrary("IPHLPAPI.DLL"); // загружаем библиотеку
 Win32Check(FLibHandle <> 0);
 GetIfTable:=GetProcAddress(FLibHandle, "GetIfTable"); //  здесь что происходит
 Win32Check(Assigned(@GetIfTable)); //  и здесь
 Timer1.Interval := 1000;
 Timer1.Enabled := True;
end;
end;

end;


 
Сергей М. ©   (2009-06-07 14:16) [45]


> GetIfTable:=GetProcAddress(FLibHandle, "GetIfTable"); //
>  здесь что происходит


Здесь происходит получение точки входа (адреса) функции, которую библиотека экспортирует (публикует) под именем "GetIfTable", и присвоение полученного значения переменной с именем GetIfTable.


> Win32Check(Assigned(@GetIfTable)); //  и здесь


См. выше - полученное значение является действительным адресом (действительным указателем) интересующей функции "GetIfTable" , если оно <> 0 (not nil),
В противном случае (nil) это значение говорит о некоей ошибке, возникшей при выполнении ф-ции GetProcAddress, код которой м.б. тут же получен вызовом ф-ции GetLastError, а текстовое ее описание - вызовом  УSysErrorMessage(GetLastError)

Псевдофункция Assigned() возвращает True, если ее аргумент <> nil, иначе возвращает False.

Функция Win32Check не делает ничего, если ее аргумент равен True, в противном случае возбуждает исключительную ситуацию класса EWin32Error.


 
Palladin ©   (2009-06-07 14:18) [46]


> GetIfTable:=GetProcAddress(FLibHandle, "GetIfTable"); //
>  здесь что происходит

Происходит вызов функции GetProcAddress


> Win32Check(Assigned(@GetIfTable)); //  и здесь

Происходит вызов процедуры Win32Check


 
jonin   (2009-06-08 12:36) [47]

function GetUpdatedIfDataItem(var AMAC: TMAC; ASent, ARcvd: DWord): PIfDataItem; // здесь вызываетьсся функция из dll библиотеки?
begin
Result := GetItemByMAC(AMAC); //здесь ее результат
with Result^ do
begin // а вот что в этих 4 строчках происходит?
 SentDelta := Max(ASent - SentAmount, 0);
 RcvdDelta := Max(ARcvd - RcvdAmount, 0);
 SentAmount := ASent;
 RcvdAmount := ARcvd;
end;
end;


 
jonin   (2009-06-09 18:10) [48]

( чтото некто даже не подскадет


 
Сергей М. ©   (2009-06-09 21:26) [49]


> function GetUpdatedIfDataItem(var AMAC: TMAC; ASent, ARcvd:
>  DWord): PIfDataItem; // здесь вызываетьсся функция из dll
> библиотеки?


Нет тут никакого вызова никакой ф-ции из dll

> а вот что в этих 4 строчках происходит?



> SentDelta := Max(ASent - SentAmount, 0);


Вычисляется разность между текущим и предыдущим прочитанными показаниями числа переданных байт заданного для интерфейса, если полученная разность имеет отрицательное значение, то разность считается равной нулю.


> RcvdDelta := Max(ARcvd - RcvdAmount, 0);


тоже самое, но для принятых байт.


>  SentAmount := ASent;
>  RcvdAmount := ARcvd;



>  SentAmount := ASent;
>  RcvdAmount := ARcvd;


Текущие показания сохраняются., при следующем чтении таблицы интерфейсов эти сохраненные показания будут считаться предудущими (для расчета разниц, см. выше)



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

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

Наверх




Память: 0.65 MB
Время: 0.013 c
15-1243926982
xayam
2009-06-02 11:16
2009.08.02
Вопрос по php-ext


15-1244061366
Юрий
2009-06-04 00:36
2009.08.02
С днем рождения ! 4 июня 2009 четверг


15-1243883957
Petr V. Abramov
2009-06-01 23:19
2009.08.02
посоветйте клиент аськи


15-1243584571
Клерк
2009-05-29 12:09
2009.08.02
Дизайн пользовательского интерфейса 2


15-1243456205
Юрий
2009-05-28 00:30
2009.08.02
С днем рождения ! 28 мая 2009 четверг