Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];

Вниз

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]

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



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

Форум: "Начинающим";
Текущий архив: 2009.08.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.61 MB
Время: 0.238 c
11-1204789806
Сашик
2008-03-06 10:50
2009.08.02
KOL SpinEdit


4-1213685860
TUserClass
2008-06-17 10:57
2009.08.02
XPManifest для DLL ...


8-1195925774
DmT
2007-11-24 20:36
2009.08.02
Как разместить объекты


15-1243512133
oldman
2009-05-28 16:02
2009.08.02
Сбылась мечта идиота...


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский