Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Список сетевых интерфейсов


Автор: djmix777 12.7.2006, 10:07
Poseidon,  здрасте!
подскажите плииз, как сделать правильно следующее
вообщем ip выяснили у меня по коду без проблем всё получилось!
а как мне выводить скажем отдельно, чтобы и название интерфейса и мак адрес и ip,
дорустим по нажатию кнопки чтобы все интерфейсы загрузились в комбобокс и потом при выборе уже появлялась информация, перечисленная выше.

да и ещё один момент я хотел узнать как  выводить входящий и исходящий трафик
по данному интерфейсу и продолжительность подключения!!!

вот какой у меня вопрос! 

Спасибо заранее ОГРОМНОЕ, даже за уже предоставленную инфу, так сказать, ЛЁД тронулся!!!!! 

M
Snowy
Тема выделена из http://forum.vingrad.ru/index.php?showtopic=81077
 

Автор: Snowy 12.7.2006, 12:14
Нарисовал код получения информации по адаптерам:
Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject); // при запуске составляем список адаптеров
    procedure ComboBox1Select(Sender: TObject); // При выборе, показываем инфу
  private
    procedure FindNetInt; // поиск адаптеров
    procedure GetIntInfo(Id: dword); // получить информацию об адаптере
  end;

var Form1: TForm1;

implementation

{$R *.dfm}

uses IPHLPAPI, IPHelper, WinSock;

procedure TForm1.FindNetInt;
var
 MibArr: IpHlpAPI.TMIBIfArray;
 i: integer;
begin
  Get_IfTableMIB(MibArr);
  if Length(MibArr)>0 then
    for i := Low(MIBArr) to High(MIBArr) do
      ComboBox1.Items.AddObject(MibArr[i].bDescr, Pointer(MibArr[i].dwIndex));
end;

procedure TForm1.GetIntInfo(Id: dword);
var
 MibArr: IpHlpAPI.TMIBIfArray;
 IPArr:  TMibIPAddrArray;
 i,a: integer;
 s: string;
begin
  Memo1.Clear;
  Get_IfTableMIB(MibArr);
  Get_IPAddrTableMIB(IPArr);
  if Length(MibArr)>0 then
    for i:=Low(MIBArr) to High(MIBArr) do
      if MibArr[i].dwIndex = Id then
      with Memo1.Lines do begin
        Add('Name: ' + MibArr[i].bDescr);
        Add('Speed: ' + IntToStr(MibArr[i].dwSpeed div 1000000) + 'Mbit/s');
        case MibArr[i].dwType of
          6: s := 'ETHERNET';
          23: s := 'PPP';
          24: s := 'LOOPBACK';
          9: s := 'TOKENRING';
          15: s := 'FDDI';
          28: s := 'SLIP';
        else s := 'OTHER';
        end;
        Add('Type: ' + s);
        s := 'Mac: ';
        for a := 0 to 7 do s := s + IntToHex(MibArr[i].bPhysAddr[a], 2) + '-';
        Add(Copy(s, 1, Length(s)-1));
        case MibArr[i].dwOperStatus of
          1: s := 'UNREACHABLE';
          2: s := 'DISCONNECTED';
          3: s := 'CONNECTING';
          4: s := 'CONNECTED';
          5: s := 'OPERATIONAL';
        else s := 'NON_OPERATIONAL';
        end;
        Add('Status: ' + s);
        for a := Low(IPArr) to High(IPArr) do
          if IPArr[a].dwIndex = MibArr[i].dwIndex then
            Add('IP:' + inet_ntoa(in_addr(IPArr[a].dwAddr)));
      end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FindNetInt;
end;

procedure TForm1.ComboBox1Select(Sender: TObject);
var i: integer;
begin
  Memo1.Clear;
  i := ComboBox1.ItemIndex;
  if i >= 0 then
    GetIntInfo(integer(ComboBox1.Items.Objects[i]));
end;

end.

Для работы потребуются модули IPHLPAPI и IPHelper.
Пришиваю к посту  

Автор: djmix777 13.7.2006, 11:03
всё удачно прошло  smile !


Спасибо!

 ну вот честно не допёр я сам что надо события обозначить, 

всё идеально и инфа та самая, как бы сейчас сделать так чтобы он определяло если включено соединение, то сколько времени и какой трафик входящий и исходящий

на примере 
допустим подключён к инету ADSL модем, этому соединению присваивается при каждом подключении к серваку провайдера динамический IP 

и я хотел вести такой маленький учёт, прога постоянно запущена и следит за этим интерфейсом, 
если вышел модем в инет, время пошло, и пошёл трафик (вход и исход), закончилось соединение
пишет в лог файл эту инфу

вот что я бы хотел в конце сделать.

  

Автор: Snowy 13.7.2006, 11:21
У MibArr[i] есть следующие поля с информацией о трафике:
Цитата

dwInOctets 
Specifies the number of octets of data received through this interface. 
dwInUcastPkts 
Specifies the number of unicast packets received through this interface. 
dwInNUcastPkts 
Specifies the number of non-unicast packets received through this interface. This includes broadcast and multicast packets. 
dwInDiscards 
Specifies the number of incoming packets that were discarded even though they did not have errors. 
dwInErrors 
Specifies the number of incoming packets that were discarded because of errors. 
dwInUnknownProtos 
Specifies the number of incoming packets that were discarded because the protocol was unknown. 
dwOutOctets 
Specifies the number of octets of data sent through this interface. 
dwOutUcastPkts 
Specifies the number of unicast packets sent through this interface. 
dwOutNUcastPkts 
Specifies the number of non-unicast packets sent through this interface. This includes broadcast and multicast packets. 
dwOutDiscards 
Specifies the number of outgoing packets that were discarded even though they did not have errors. 
dwOutErrors 
Specifies the number of outgoing packets that were discarded because of errors. 
dwOutQLen 
Specifies the output queue length.

Также посмотри программу NetTrafficMonitor: http://fullsource.nm.ru/files/sources/internet/nettrafmonitor.zip
Скорее всего там надёшь большую часть того, что тебе нужно.

Добавлено @ 11:24 
Полное описание полей MibArr[i] можно почитать здесь: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mib/mib/mib_ifrow.asp 

Автор: djmix777 13.7.2006, 12:47
спасибо огромное! сейчас погляжу!!!  smile  

Автор: djmix777 14.7.2006, 10:22
блин, вот всё удачно, вроде как, но не мог найти где там инфу взять про то когда соединение законнектилось и расконнектилось. а как протестить текущую скорость соединения при соединении через ADSL модем, чем можно воспользоваться? 
 

Автор: Snowy 14.7.2006, 10:48
Цитата(djmix777 @  14.7.2006,  10:22 Найти цитируемый пост)
но не мог найти где там инфу взять про то когда соединение законнектилось и расконнектилось.
Цитата
dwLastChange
Specifies the length of time, in centaseconds (10^-2 sec), that elapsed between January 1, 1601, and the last change of the operational status of the interface (connection). The value rolls over after 2^32 centaseconds.


Цитата(djmix777 @  14.7.2006,  10:22 Найти цитируемый пост)
а как протестить текущую скорость соединения, чем можно воспользоваться?
Если скорость канала, то dwSpeen. Если текущую, то это уже отдельный вопрос.
Смотри поиском: http://forum.vingrad.ru/index.php?act=Search&CODE=show&searchid=73e2bc5b1155072575af6cab12fda308&search_in=posts&result_type=topics&flag=search&debug=&highlite=%F1%EA%EE%F0%EE%F1%F2%FC&skipped= 

Автор: djmix777 17.7.2006, 06:05
посмотрел отдельные вопросики, что и говорить  ещё, не нашёл ответа, и даже потестить из возможного ничего не могу, потому как нет компоненты IDHTTP. на работе скачать не могу. позакрывали zip'ы, 


если не трудно то поомгите плиииз эту скорость определить!!!
чтобы допустим  пусть по нажатию кнопки скачивался и закачивался куда нить, какой нить файлик небольшой и из него уже рассчитывалась скорость.
решение очень нужно!

 

Автор: Snowy 17.7.2006, 09:07
Если нет Indy попробуй
WinInet: http://forum.vingrad.ru/index.php?act=Search&CODE=show&searchid=9c3f0915eccbe8b6ce23c066f69733b1&search_in=posts&result_type=topics&flag=search&debug=&highlite=wininet&skipped=
или
NMHTTP: http://forum.vingrad.ru/index.php?act=Search&CODE=show&searchid=81b6b35a785bed9739fa656542ce0f19&search_in=posts&result_type=topics&flag=search&debug=&highlite=nmhttp&skipped= 

Автор: djmix777 18.7.2006, 08:02
Snowy
по скорости не получается, отложу пока с этим вопросом,
знаешь у меня вопрос следующий, есть дом. сетка, и есть пользователь, который через меня в инет выходит, вернее через мой комп smile
хочу сделать на дельфи чтобы я мог указывая порт смотреть какие он сайты открывает и на какие адреса шлёт письма и какого размера входящие и исходящие. понимаю что гемор и такое есть, допустим в файрволах и где нить ещё, но хочу сам попробовать сделать, ну почти сам. помоги плз

используя только стандартные компоненты можно сделать? 

Автор: Snowy 18.7.2006, 09:50
Это тебе нужно писать прокси.
Ставь Delphi7 или BDS2005 - там есть Indy.
В Indy есть всё для написание проксей. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)