![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Domain_name_IP_Traffic [D7, XP]
jonin © (2009-05-17 14:05:00)как то я спрашивал про определение ИПов трафика и тд, мне подсказали прогу посмотреть эту дак вот я посмотрел там проип и трафик и нашол сверху в коде ( dwSpeed : DWORD; // определяет текущую скорость передачи в битах в секунду)мне скорость тоже надо определить не нечего чтото не получаеться(
вот сам код программа http://www.delphisources.ru/pages/sources/internet/1_internet.html
подскажите может раз там есть dwSpeed то как то можно определить скорость или вывести
Сергей М. (2009-06-09 21:26:00) [1]
> 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;
Текущие показания сохраняются., при следующем чтении таблицы интерфейсов эти сохраненные показания будут считаться предудущими (для расчета разниц, см. выше)
jonin (2009-06-09 18:10:00) [2]( чтото некто даже не подскадет
jonin (2009-06-08 12:36:00) [3]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;
Palladin (2009-06-07 14:18:00) [4]
> GetIfTable:=GetProcAddress(FLibHandle, 'GetIfTable'); //
> здесь что происходит
Происходит вызов функции GetProcAddress
> Win32Check(Assigned(@GetIfTable)); // и здесь
Происходит вызов процедуры Win32Check
Сергей М. (2009-06-07 14:16:00) [5]
> 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.
jonin (2009-06-07 13:03:00) [6]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;
jonin (2009-06-07 12:15:00) [7]а дальше описываються переменные которые в этой длл используються?
Сергей М. (2009-06-07 10:06:00) [8]Это не функция, а декларация (объявление) ее прототипа.
Код самой ф-ции находится в 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-06 21:31:00) [9]
TGetIfTable = function(pIfTable: PMibIfTable; pdwSize: PULONG; bOrder: Boolean): DWORD; stdcall;а вот что что функция делает?
jonin (2009-06-06 21:26:00) [10]извиняюсь за написание) поторопился
дак ты разбираешься очень хорошо, а я только начинаю изучать
а гденибудь можно про этот код прочитать или про примерно похожий? потому что в книгах с коментариями пишут а в интернете половина без(
Сергей М. (2009-06-06 18:56:00) [11]
> TMibIfArray = array [0..512] of TMibIfRow; // ассив типа
> TMibIfRow кторырй был описан выше ?
Да.
> PMibIfRow = ^TMibIfRow; // что тут делают и зачем?
Тут делают объявление указательного типа данных - отныне данные типа PMibIfRow будут указывать на данные типа TMibIfRow ("на огурцах" - переменная типа PMibIfRow должна рассматриваться компилятором как переменная, хранящая адрес переменной типа TMibIfRow)
> и вобще облязел форумы сайты, постоянно всплывают похожике
> воросы но вот про то чтобы код был с коментариями нет
Имей совесть - пиши ПО-РУССКИ , с соблюдением хотя бы синтаксиса и пунктуации.
Смотреть противно на эту поганую писанину.
Не говоря уже о желании помочь тебе после наблюдения этого буквоблудия.
> все юзают этот исходник
Я не юзаю, уверяю тебя в этом)
Мне повеситься ?
> и нечего не понимают
Отлично понимаю, несмотря на то что вижу этот код впервые.
Так что, веревку мне мылить или немного погодить ?)
jonin (2009-06-06 10:31:00) [12]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-05 21:15:00) [13]
> половину так и не разобрался
Задавай конкретные вопросы, по каждой строке из той "половины", в которой ты так и не разобрался ..
jonin (2009-06-05 17:01:00) [14]
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;
подскажи подалуйста функции что делают построчно( а то я половину так и не разобрался( что ношол что не понял в принципе что делает, если можно то поподробнее
jonin (2009-05-28 16:31:00) [15]спасибо что разяснил)
Сергей М. (2009-05-28 16:25:00) [16]
> у меня она как бы 1
Одну ты и видишь - Broadcom NetLink (TM) Gigabit Ethernet.
А остальные не карты, а виртуальные сетевые интерфейсы.
Связь с "внешиним миром" осуществляется непосредственно через сетевые интерфейсы, ассоциированные с реальными физическими устройствами, такими как в дан.случае твоя сет.карта, остальные интерфейсы тебя заботить не должы, если тебя интересует именно "закачка" и "вкачка")
jonin (2009-05-28 16:04:00) [17]подскажиье вот там начинаеться цикл по количеству сетевых рарт, я вот что не пойму у меня она как бы 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-21 09:52:00) [18]
> Dennis I. Komarov © (21.05.09 09:35) [31]
> за мое отсутствие что-то случилось?
А мы как-то и не заметили, что ты выходил "до вiтру")
Dennis I. Komarov (2009-05-21 09:35:00) [19]
> > просто не вытерпел
>
>
> Эт точно)
Мда, за мое отсутствие что-то случилось? :)
jonin (2009-05-21 07:28:00) [20]
> А получается-то иначе).. Не стыдно ?
ну дак я изучаю) но трудно когда все с 0 и чтото новое ранее не известное, вот и приходиться просить помощи узнавать
//а сколько вам лет? ответьте пожалуйста, просто интересно, вы неверно много знаете