![]() |
| ||
|
|
Новости |
Поиск |
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-05-20 19:58:00) [21]
> просто не вытерпел
Эт точно)
> задали чтоббы мы самиизучали и делали
А получается-то иначе).. Не стыдно ?
> как делать так чтобы запись из базы удалять последнюю?
Из какой такой "базы" ?
Из базы данных что ли ?
В базе данных нет никаких записей - ни первой ни последней.
Смотри не ляпни эту глупость преподу - банан тебе будет обеспечен)
jonin (2009-05-20 19:04:00) [22]оуоу 0_0 спасибо огромное за пмошь Сергей М. , наверно ты просто не вытерпел моей тупости) я просто еще мало что знаю а проект задали чтоббы мы сами изучали и делали, я немножко конечно переделаю и выводить буду не в мемо
СПАСИБО за помошь Сергей!
и еще вопросик 1 как делать так чтобы запись из базы удалять последнюю?
и еще правдо 1) а мне интересно сколько вам лет?
Сергей М. (2009-05-20 11:21:00) [23]
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 06:13:00) [24]видишь она в таймере), по идее ты подсказал мне правильно далеть
b:=Table.Table[i].dwInOctets;
c:=b-a;
a:=b;
Form1.Edit3.Text:=IntToStr(c) + ' байт в секунду';
но почему козда даже разеденяешь соединение с интернетом он пишет такое большое число, 4274004809 байт в секунду
jonin (2009-05-20 06:10:00) [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;
Сергей М. (2009-05-19 21:29:00) [26]
> сделал в ту же процедуру где все определяеться а не в отдельный
> таймер
Так а как же ты без таймера секундные интервалы отсчитываешь ?)
jonin (2009-05-19 21:05:00) [27]вот сейчас сделал в ту же процедуру где все определяеться а не в отдельный таймер в итоге у меня выводит примерно в районе
4274004809 байт в секунду
ка то мне это кажеться как то много потому тчо у меня скорость интернет соединения 1мб но по идее не выше 180кб
jonin (2009-05-19 20:55:00) [28]ну вот ты говоришь подключаешься к 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;
вот я и не пойму куда что добовлять
Сергей М. (2009-05-19 20:38:00) [29]
> я с ним не разобрался
Ну так давай уже разбирайся до конца !
Что мешает ? Что в этом коде не понятно ?
jonin (2009-05-19 20:34:00) [30]
> подключаешься к MifTable
блин я не знаю как это сделать код то не мой да и до конца я с ним не разобрался подскажи плиз как то сделать
Сергей М. (2009-05-19 20:05:00) [31]
> это типо глобальная?
Это типо нелокальная.
> пишу b, с : DWord = 0;
Жирное убери.
> каким образом это сделать?
Ну у тебя же есть перед носом пример
> вот сам код программа http://www.delphisources.ru/pages/sources/internet/1_internet.html
jonin (2009-05-19 18:22:00) [32]
> a : DWord= 0; // статическая (!!) переменная
это типо глобальная?
и когда я делаю в таймере в варе пишу b, с : DWord= 0; указатель показывает на 0 и пишет в ошибках Cannot initialize local variable
> - подключаешься к MifTable
сори за нубский вопрос, они правдо все нубские) я ведь только учусь
каким образом это сделать?
Сергей М. (2009-05-19 17:29:00) [33]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 17:01:00) [34]ааа вон что)) блин ступил
а как вот теперь сделать чтобы была эта задержка в 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 16:38:00) [35]
> а дальше что С делить на time:=time+1
Зачем делить-то, если "через секунду" ?
N / 1 = N
Если период опроса равен 1 секунде, то и делить ничего не надо : разница B - A и есть скорость, выраженная в байтах в секунду ..
Делить следует. если период опроса не равен 1 секунде)
jonin (2009-05-19 16:32:00) [36]черт нечего не получаеться Т_Т сейчас посмотрел я время делаю постоянно time:=time+1 а сколько скачено беру dwInOctets
а ты сказал что нужно брать разность между ними через момаент времяни.
как я понял брать dwInOctets присвоить его к какой то переменной например A, дальше через секунду я его присваюиваю например к Bдальше из B- Aприравниваю к Cа дальше что Сделить на time:=time+1
Сергей М. (2009-05-19 16:18:00) [37]
> jonin (19.05.09 16:10) [12]
Бррр ..
Ничего не понял)
Какие такие real и Bytes ? Откуда они взялись ?
jonin (2009-05-19 16:10:00) [38]а как перевсети из real в Bytes
я считаю в прграмме как бы делю все это и вывожу но чтобы вывести данные мне нужен тип стринг, перевел так FloatToStr, а можно как нибудь сдеалть так же как BytesToString ?
Сергей М. (2009-05-18 21:12:00) [39]
> а если мне
И тебе тоже)
jonin (2009-05-18 20:46:00) [40]а если мне сколько скачено делить на время то тоже же получиться скорость?