Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Domain_name_IP_Traffic [D7, XP]


Страницы:   1 2 3

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 и чтото новое ранее не известное, вот и приходиться просить помощи узнавать

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо