Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Вниз

Перечислить сет. интерфейсы, Как?   Найти похожие ветки 

 
bloodman ©   (2006-01-12 19:47) [0]

Как пройтись по всем сетевым карточкам в компьютере? Мне нужно узнать все ip адреса компьютера на котором запущена программа, желательно, не просто списком, а чтобы можно было определить какой сетевой карте эти адреса принадлежат??
Спасибо.


 
Rouse_ ©   (2006-01-13 12:05) [1]

type
 USHORT = WORD;
 ULONG = DWORD;
 time_t = Longint;

 IP_ADDRESS_STRING = record
   S: array [0..15] of Char;
 end;
 IP_MASK_STRING = IP_ADDRESS_STRING;
 PIP_MASK_STRING = ^IP_MASK_STRING;

 PIP_ADDR_STRING = ^IP_ADDR_STRING;
 IP_ADDR_STRING = record
   Next: PIP_ADDR_STRING;
   IpAddress: IP_ADDRESS_STRING;
   IpMask: IP_MASK_STRING;
   Context: DWORD;
 end;

 PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
 IP_ADAPTER_INFO = record
   Next: PIP_ADAPTER_INFO;
   ComboIndex: DWORD;
   AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 3] of Char;
   Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of Char;
   AddressLength: UINT;
   Address: array [0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of BYTE;
   Index: DWORD;
   Type_: UINT;
   DhcpEnabled: UINT;
   CurrentIpAddress: PIP_ADDR_STRING;
   IpAddressList: IP_ADDR_STRING;
   GatewayList: IP_ADDR_STRING;
   DhcpServer: IP_ADDR_STRING;
   HaveWins: BOOL;
   PrimaryWinsServer: IP_ADDR_STRING;
   SecondaryWinsServer: IP_ADDR_STRING;
   LeaseObtained: time_t;
   LeaseExpires: time_t;
 end;

 function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
   var pOutBufLen: ULONG): DWORD; stdcall; external IPHelper;

procedure TfrmMain.ReadLanInterfaces;
var
 InterfaceInfo,
 TmpPointer: PIP_ADAPTER_INFO;
 IP: PIP_ADDR_STRING;
 Len: ULONG;
begin
 if GetAdaptersInfo(nil, Len) = ERROR_BUFFER_OVERFLOW then
 begin
   GetMem(InterfaceInfo, Len);
   try
     if GetAdaptersInfo(InterfaceInfo, Len) = ERROR_SUCCESS then
     begin
       TmpPointer := InterfaceInfo;
       repeat
         IP := @TmpPointer.IpAddressList;
         repeat
           cbInterfaces.Items.Add(Format("%s - [%s]",
             [IP^.IpAddress.S, TmpPointer.Description]));
           IP := IP.Next;
         until IP = nil;
         TmpPointer := TmpPointer.Next;
       until TmpPointer = nil;
     end;
   finally
     FreeMem(InterfaceInfo);
   end;
 end;
 if cbInterfaces.Items.Count = 0 then
 begin
   memReport.Text := "Сетевые интерфейсы не обнаружены." + sLineBreak +
     "Продолжение работы программы не возможно.";
   btnStartStop.Enabled := False;
   Exit;
 end
 else
   cbInterfaces.ItemIndex := 0;
end;


 
Rouse_ ©   (2006-01-13 12:07) [2]

Если нужны имена виртуальных устройств, то подход несколько иной:

const
 MAX_ADAPTER_NAME       = 255;
type
 PIP_ADAPTER_INDEX_MAP = ^IP_ADAPTER_INDEX_MAP;
 IP_ADAPTER_INDEX_MAP = record
    Index: DWORD;
    Name: array [0..MAX_ADAPTER_NAME-1] of WideChar;
 end;

 PIP_INTERFACE_INFO = ^IP_INTERFACE_INFO;
 IP_INTERFACE_INFO = record
    NumAdapters: Longint;
    Adapter: array [0..0] of IP_ADAPTER_INDEX_MAP;
 end;

 function GetIfEntry(pIfRow: PMibIfRow): DWORD; stdcall external "iphlpapi.dll";
 function GetNumberOfInterfaces(var pdwIntf: DWORD): DWORD; stdcall; external "iphlpapi.dll";
 function GetInterfaceInfo(pIfTable: PIP_INTERFACE_INFO; var dwOutBufLen:DWORD): DWORD;
   stdcall; external "iphlpapi.dll";
 function GetAdapterIndex(AdapterName: PWideChar; var IfIndex: DWORD): DWORD;
   stdcall; external "iphlpapi.dll";

procedure TMainForm.Button1Click(Sender: TObject);
var
 I, pdwIntf, dwOutBufLen, IfIndex: DWORD;
 lpInfo: PIP_INTERFACE_INFO;
 mirIfDescr: TMibIfRow;
begin
 //if GetNumberOfInterfaces(pdwIntf) = NO_ERROR then
 //begin
   GetInterfaceInfo(nil, dwOutBufLen);
   GetMem(lpInfo, dwOutBufLen);
   try
     if GetInterfaceInfo(lpInfo, dwOutBufLen) = NO_ERROR then
     begin
       for I := 0 to lpInfo^.NumAdapters - 1 do
       begin
         Memo1.Lines.Add("AdapterName: " + lpInfo^.Adapter[I].Name);
         if GetAdapterIndex(lpInfo^.Adapter[I].Name, IfIndex) = NO_ERROR then
           Memo1.Lines.Add("AdapterIndex: " + IntToStr(IfIndex))
         else
           RaiseLastOSError;
         ZeroMemory(@mirIfDescr, SizeOf(TMibIfRow));
         mirIfDescr.dwIndex := IfIndex;
         if GetIfEntry(@mirIfDescr) = NO_ERROR then
           Memo1.Lines.Add("AdapterDescription: " + mirIfDescr.bDescr)
         else
           RaiseLastOSError;
       end;
     end
     else
       RaiseLastOSError;
   finally
     FreeMem(lpInfo);
   end;
 end
 //else
   //RaiseLastOSError;
end;


 
bloodman ©   (2006-01-13 17:26) [3]

Огромное Спасибо!!



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

Форум: "Сети";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.014 c
15-1144544890
Бугага
2006-04-09 05:08
2006.04.30
Updates for Windows


3-1141489847
Александр К...
2006-03-04 19:30
2006.04.30
Распространение приложений, использующих BDE


2-1144820856
IntruderLab
2006-04-12 09:47
2006.04.30
DLL


3-1141989429
Ega23
2006-03-10 14:17
2006.04.30
Утилита osql


3-1140564295
TheEd
2006-02-22 02:24
2006.04.30
Как при вставке задать полям знач-я по умолч., те что в БД заданы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский