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

Вниз

Как узнать сколько байт было передано и получено по сетевой карте   Найти похожие ветки 

 
volser   (2005-06-04 18:37) [0]

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


 
Новичек ©   (2005-06-05 09:44) [1]

Возможно, это Вам поможет:
(оригинал тут: http://www.forum.ishodniki.ru/index.php?action=printpage;topic=353.0)

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

Параметры:
pIfTable - должен содержать указатель на структуру
pdwSize - должен содержать размер структуры
bOrder - указывает, нужна ли сортировка в возвращаемом массиве

В качестве первого параметра функция использует указатель на структуру, вот само описание структуры

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

Поля:
dwNumEntries - определяет размерность массива представленного вторым параметром
Table - является массивом структур

Структура сама по себе крайне неинформативна, нас интересует второе ее поле, также представляющее собой структуру, даю её описание:

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;

Поля:
wszName - Указатель на строку содержащую имя интерфейса
dwIndex - Определяет индекс интерфейса
dwType - Определяет тип интерфейса (см. MSDN)
dwMtu - Определяет максимальную скорость передачи
dwSpeed - Определяет текущую скорость передачи в битах в секунду
dwPhysAddrLen - Определяет длину адреса содержащегося в bPhysAddr
bPhysAddr - Содержит физический адрес интерфейса (если проще то его, немного видоизмененный, МАС адрес)
dwAdminStatus - Определяет активность интерфейса
dwOperStatus - Содержит текущий статус интерфейса (см. MSDN)
dwLastChange - Содержит последний измененный статус
dwInOctets - Содержит количество байт принятых через интерфейс
dwInUcastPkts - Содержит количество направленных пакетов принятых интерфейсом
dwInNUCastPkts - Содержит количество ненаправленных пакетов принятых интерфейсом (включая Броадкаст и т.п.)
dwInDiscards - Содержит количество забракованных входящих пакетов (даже если они не содержали ошибки)
dwInErrors - Содержит количество входящих пакетов содержащих ошибки
dwInUnknownProtos - Содержит количество забракованных входящих пакетов со структурой неизвестного протокола
dwOutOctets - Содержит количество байт отправленных интерфейсом
dwOutUCastPkts - Содержит количество направленных пакетов отправленных интерфейсом
dwOutNUCastPkts- Содержит количество ненаправленных пакетов отправленных интерфейсом (включая Броадкаст и т.п.)
dwOutDiscards- Содержит количество забракованных исходящих пакетов (даже если они не содержали ошибки)
dwOutErrors- Содержит количество исходящих пакетов содержащих ошибки
dwOutQLen - Содержит длину очереди данных
dwDescrLen - Содержит размер массива bDescr
bDescr - Содержит описание интерфейса

Как вы видите в этой структуре содержится уйма информации, которую мы и будем использовать (часть её ;) Заметьте, интерфейсом является не обязательно некое физическое устройство (например, сетевая карта), но на этом я останавливаться не буду. Если кому-то это интересно, посмотрите, что об этом говорит MSDN.

Итак, добавьте на форму ListView, назовем его lvTraffic, создайте в ней четыре колонки со следующими именами (Caption) - bDescr, bPhysAddr (MAC), dwInOctets и dwOutOctets. В них мы будем выводить наименование интерфейса, его МАС адрес, общее кол-во принятых и отправленных байт. Добавьте описания структур и функции в интерфейсную часть модуля. Примечание, если вы добавляете структуры в том виде, в каком они даны, поменяйте очередность их объявления, т.е. TMibIfRow должна быть объявлена первой. Теперь добавьте на форму таймер, он будет отвечать за ежесекундное обновление информации о трафике, назовем его tmrTraffic. Вот сам код определения текущего входящего - исходящего трафика:

procedure TMainForm.tmrTrafficTimer(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,2)+"-";
Result := Result + IntToHex(Value[Length-1],2);
end;
end;

//Сама процедура
var
FLibHandle : THandle;
Table : TMibIfTable;
i : Integer;
Size : Integer;
begin
tmrTraffic.Enabled := False; //Приостанавливаем на всякий случай таймер
lvTraffic.Items.BeginUpdate;
lvTraffic.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 lvTraffic.Items.Add do begin //Выводим результаты
Caption := String(Table.Table.bDescr); //Наименование интерфейса
SubItems.Add(GetMAC(TMAC(Table.Table.bPhysAddr),
Table.Table.dwPhysAddrLen)); //MAC адрес
SubItems.Add(IntToStr(Table.Table.dwInOctets)); //Всего принято байт
SubItems.Add(IntToStr(Table.Table.dwOutOctets)); //Всего отправлено байт
end;
end;
lvTraffic.Items.EndUpdate;
FreeLibrary(FLibHandle);
tmrTraffic.Enabled := True; //Не забываем активировать таймер
end;

Заметьте, я определяю новый тип данных TMAC для передачи массива, в котором содержится сам MAC адрес в функцию для преобразования его в более привычный вид. Обратите внимания на код TMAC(Table.Table.bPhysAddr), это передача массива, обязательно нужно указать, что массив передается как тип TMAC, в противном случае компилятор выдаст ошибку несовместимости типов.



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

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

Наверх




Память: 0.49 MB
Время: 0.042 c
3-1124258621
PChI
2005-08-17 10:03
2005.10.02
Описание dxdbgrid


10-1104266315
st. reset
2004-12-28 23:38
2005.10.02
corba


14-1126271364
Андрей Жук
2005-09-09 17:09
2005.10.02
Установка нестандартной частоты обновления экрана


2-1124830693
benn
2005-08-24 00:58
2005.10.02
RichEdit


2-1124776348
DLLKos88
2005-08-23 09:52
2005.10.02
Помогите сделать поисковик файлов!!!