Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2009, 22:33   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию Как получить входящую/исходящую скороть сети/подключения? Зная его имя.

Или хотя бы сколько байт отправлено (в-ручную это можно увидеть зайдя в состояние сети)
TwiX вне форума Ответить с цитированием
Старый 25.11.2009, 23:22   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

есть такая либа <IPHLPAPI.DLL> и функа 'GetIfTable', через нее можно получить доступ к таблицам входящего и исходящего трафика по определенному сетевому адаптеру или виртуальному соединению, ну а разница в единицу времени даст вам скорость.

...даю вырезку измерения из своего проекта, думаю лишнее сами поубираете:
Код:
var //массив значений traygraph
    minc:integer;
    mi,mo:array[0..31]of real;
    oldvo,oldvi:real;

    netio,netoo  : array of integer;
    netold: boolean;

implementation
uses unit1, IniFiles;

type //таблицa траффика
  TMibIfRow = packed record
    wszName            : array[0..255] of WideChar;
    dwIndex,dwType,dwMtu,
    dwSpeed,dwPhysAddrLen: integer;
    bPhysAddr          : array[0..7] of Byte;
    dwAdminStatus,dwOperStatus,dwLastChange,dwInOctets,
    dwInUcastPkts,dwInNUCastPkts,dwInDiscards,
    dwInErrors,dwInUnknownProtos,dwOutOctets,dwOutUCastPkts,
    dwOutNUCastPkts,dwOutDiscards,dwOutErrors,dwOutQLen,
    dwDescrLen         : integer;
    bDescr             : array[0..255] of Char;
  end;
  TMibIfArray = array [0..512] of TMibIfRow;
  PMibIfRow = ^TMibIfRow;
  PMibIfArray = ^TMibIfArray;

type
 TMibIfTable = packed record
   dwNumEntries: integer;
   Table       : TMibIfArray;
 end;
 PMibIfTable = ^TMibIfTable;
var GetIfTable:function(pIfTable: PMibIfTable;
                        pdwSize : pulong;
                        bOrder  : Boolean ): DWORD; stdcall;
//======================

procedure _net(h:thandle);
//МАС адрес к "нормальному" виду
{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,k,Size   : integer;
    fm,pin,pout: shortstring;
    vi,vo      : real;
    //накопление-
    netinfo    : string;
    neti,neto  : array of integer;
    ini: tinifile;
begin
 FLibHandle:= LoadLibrary('IPHLPAPI.DLL');
 if FLibHandle= 0 then Exit;
 @GetIfTable:= GetProcAddress(FLibHandle, 'GetIfTable');
 if not Assigned(GetIfTable) then FreeLibrary(FLibHandle);
 //
 Size:= SizeOf(Table);
 netinfo:= '';
 if GetIfTable(@Table, @Size,false ) = 0 then begin //функции
  setlength(neti,Table.dwNumEntries);
  setlength(neto,Table.dwNumEntries);
  setlength(netio,Table.dwNumEntries);
  setlength(netoo,Table.dwNumEntries);
  for i:= 0 to Table.dwNumEntries-1 do begin
   neti[i]:= table.Table[i].dwInOctets;
   neto[i]:= table.Table[i].dwOutOctets;
   //
   if not netold then begin
    if i= Table.dwNumEntries-1 then netold:= true;
    if ini.ReadString('NET DATE','day','')<>datetostr(date) then begin
     ini.WriteInteger(string(Table.Table[i].bDescr),'inp_data_sum',ini.readInteger(string(Table.Table[i].bDescr),'inp_data_sum',0)+
      ini.readInteger(string(Table.Table[i].bDescr),'inp_data_day',0));
     ini.WriteInteger(string(Table.Table[i].bDescr),'out_data_sum',ini.readInteger(string(Table.Table[i].bDescr),'out_data_sum',0)+
      ini.readInteger(string(Table.Table[i].bDescr),'out_data_day',0));
    end;
    netio[i]:= ini.readInteger(string(Table.Table[i].bDescr),'inp_data_sum',0); //чтение данных-
    netoo[i]:= ini.readInteger(string(Table.Table[i].bDescr),'out_data_sum',0)
   end;
   ini.writeInteger(string(Table.Table[i].bDescr),'inp_data_day',neti[i]); //запись данных-
   ini.writeInteger(string(Table.Table[i].bDescr),'out_data_day',neto[i]);

   //
   if ((neti[0]+netio[0])/1024/1024)>1 then begin fm:=' MB'; k:= 1024 end else begin fm:=' kB'; k:=1 end;
   pin := 'inp  -'+ formatfloat(' 000.0',(neti[0]+netio[0])/1024/k);
   pout:= 'out -' + formatfloat(' 000.0',(neto[0]+netoo[0])/1024/k);
   //входящая cкорость
   vi:=((neti[0]+netio[0])-oldvi)*10/(2*1024);
   //исходящая-
   vo:=((neto[0]+netoo[0])-oldvo)*10/(2*1024);
   //на иконку
   traygraph(h,vi,vo,cllime,clred,clteal,copy(string(Table.Table[0].bDescr),1,25)+chr(13)+
    pin+fm+chr(13)+pout+fm//+chr(13)+'Cеть: '+inttostr(table.Table[0].dwSpeed div 1000000)+' Mбит/c'
    );
   //траффик. информация адаптера-
   if ((neti[i]+netio[i])/1024/1024)>1 then begin fm:= ' MB'; k:= 1024 end else begin fm:= ' kB'; k:= 1 end;
   netinfo:= netinfo + '• ' + string(Table.Table[i].bDescr) + ''#10 +
             'I/O' + formatfloat('  000.0',(neti[i]+netio[i])/1024/k)+ '/' + formatfloat('000.0',(neto[i]+netoo[i])/1024/k) + fm + ''#10#10
             ;

  end
 end;
 //траффик. все адаптеры-
 nettxt:= copy(netinfo,1,length(netinfo)-2);
 if ini.ReadString('NET DATE','day','')<>datetostr(date) then
  ini.writeString('NET DATE','day',datetostr(date));
 //
 FreeLibrary(FLibHandle);
 oldvi:= neti[0]+netio[0]; oldvo:= neto[0]+netoo[0]
end;
//=======
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 25.11.2009 в 23:27.
raxp вне форума Ответить с цитированием
Старый 26.11.2009, 00:47   #3
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Спасибо, буду разбираться=)
А библиотеку надо качать?
TwiX вне форума Ответить с цитированием
Старый 26.11.2009, 01:23   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

нет, она системная.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 23.03.2010, 22:58   #5
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Я знаю, что я быстрый) Но функция не работает...
traygraph заменил на вывод в label. С запущенным торрентом все скорости = 0
Код:
procedure _net(h:thandle);
//МАС адрес к "нормальному" виду
{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,k,Size   : integer;
    fm,pin,pout: shortstring;
    vi,vo      : real;
    //накопление-
    netinfo    : string;
    neti,neto  : array of integer;
    ini: tinifile;
begin
 FLibHandle:= LoadLibrary('IPHLPAPI.DLL');
 if FLibHandle= 0 then Exit;
 @GetIfTable:= GetProcAddress(FLibHandle, 'GetIfTable');
 if not Assigned(GetIfTable) then FreeLibrary(FLibHandle);
 //
 Size:= SizeOf(Table);
 netinfo:= '';
 if GetIfTable(@Table, @Size,false ) = 0 then begin //функции
  setlength(neti,Table.dwNumEntries);
  setlength(neto,Table.dwNumEntries);
  setlength(netio,Table.dwNumEntries);
  setlength(netoo,Table.dwNumEntries);
  for i:= 0 to Table.dwNumEntries-1 do begin
   neti[i]:= table.Table[i].dwInOctets;
   neto[i]:= table.Table[i].dwOutOctets;
   //
   if not netold then
      begin
        if i = Table.dwNumEntries - 1 then
          netold := true;
        ini:=TIniFile.Create('a.ini');
        if ini.ReadString('NET DATE', 'day', '') <> datetostr(date) then
        begin
          ini.WriteInteger(string(Table.Table[i].bDescr), 'inp_data_sum',
            ini.readInteger(string(Table.Table[i].bDescr), 'inp_data_sum', 0)
              + ini.readInteger(string(Table.Table[i].bDescr), 'inp_data_day',
              0));
          ini.WriteInteger(string(Table.Table[i].bDescr), 'out_data_sum',
            ini.readInteger(string(Table.Table[i].bDescr), 'out_data_sum', 0)
              + ini.readInteger(string(Table.Table[i].bDescr), 'out_data_day',
              0));
        end;
        netio[i] := ini.readInteger(string(Table.Table[i].bDescr),
          'inp_data_sum', 0); // чтение данных-
        netoo[i] := ini.readInteger(string(Table.Table[i].bDescr),
          'out_data_sum', 0)
      end;
      ini.WriteInteger(string(Table.Table[i].bDescr), 'inp_data_day', neti[i]);
      // запись данных-
      ini.WriteInteger(string(Table.Table[i].bDescr), 'out_data_day', neto[i]);

      //
      if ((neti[0] + netio[0]) / 1024 / 1024) > 1 then
      begin
        fm := ' MB';
        k := 1024
      end
      else
      begin
        fm := ' kB';
        k := 1
      end;
      pin := 'inp  -' + formatfloat(' 000.0', (neti[0] + netio[0]) / 1024 / k);
      pout := 'out -' + formatfloat(' 000.0', (neto[0] + netoo[0]) / 1024 / k);
      // входящая cкорость
      vi := ((neti[0] + netio[0]) - oldvi) * 10 / (2 * 1024);
      // исходящая-
      vo := ((neto[0] + netoo[0]) - oldvo) * 10 / (2 * 1024);
      // на иконку
      Form2.Label1.Caption :=Form2.Label1.Caption+ copy(string(Table.Table[0].bDescr), 1, 25) + chr
        (13) + pin + fm  + pout + fm;
      // traygraph(h,vi,vo,cllime,clred,clteal,copy(string(Table.Table[0].bDescr),1,25)+chr(13)+
      // pin+fm+chr(13)+pout+fm//+chr(13)+'Cеть: '+inttostr(table.Table[0].dwSpeed div 1000000)+' Mбит/c'
      // );
      // траффик. информация адаптера-
      if ((neti[i] + netio[i]) / 1024 / 1024) > 1 then
      begin
        fm := ' MB';
        k := 1024
      end
      else
      begin
        fm := ' kB';
        k := 1
      end;
      netinfo := netinfo + '• ' + string(Table.Table[i].bDescr)
        + ''#10 + 'I/O' + formatfloat
        ('  000.0', (neti[i] + netio[i]) / 1024 / k) + '/' + formatfloat
        ('000.0', (neto[i] + netoo[i]) / 1024 / k) + fm + ''#10#10;

    end
  end;
  // траффик. все адаптеры-
  // nettxt:= copy(netinfo,1,length(netinfo)-2);
  if ini.ReadString('NET DATE', 'day', '') <> datetostr(date) then
    ini.writeString('NET DATE', 'day', datetostr(date));
  //
  FreeLibrary(FLibHandle);
  oldvi := neti[0] + netio[0];
  oldvo := neto[0] + netoo[0]
end;
// =======

procedure TForm2.Button1Click(Sender: TObject);
begin
  _net(0);
end;
А при повторном нажати на Button выскакивает Acces Violation
TwiX вне форума Ответить с цитированием
Старый 23.03.2010, 23:40   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

table.Table[i], параметр i, Table.dwNumEntries-1 - это количество сетевых адаптеров... вам нужно выбрать именно тот, через который идет обмен, который вы хотите контролировать.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 24.03.2010, 11:40   #7
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Код:
for i:= 0 to Table.dwNumEntries-1 do begin
А зачем здесь цикл тогда?
TwiX вне форума Ответить с цитированием
Старый 24.03.2010, 11:42   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

это перебор доступных адаптеров... вот накидайте по отдельности в striggrid все параметры при каждом -i- для наглядности.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 24.03.2010, 14:45   #9
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Form2.Label1.Caption :=Form2.Label1.Caption+ copy(string(Table.Table[0].bDescr), 1, 25) + chr
(13) + pin + fm + pout + fm;
А это чем плохо? В Label'е оказывается штук 30 скоростей, все равны 0...
TwiX вне форума Ответить с цитированием
Старый 28.03.2010, 23:08   #10
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Апппппппппп
TwiX вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как убить процесс зная его имя? One.Love Win Api 14 18.02.2012 14:31
Как нажать на Button в чужом приложении зная его HANDLE SeRhy Win Api 2 04.02.2009 13:43
Как получить handle главного окна, зная имя приложения? Altera Win Api 8 22.12.2008 18:52
Как зная хендл окна закрыть его SeRhy Общие вопросы Delphi 1 24.08.2008 11:02
Как завершить процесс, зная его имя Никки Win Api 6 14.01.2008 14:04