Форум: "Начинающим";
Текущий архив: 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