Цитата(Poseidon @ 7.5.2006, 18:36) | Цитата(Flat @ 7.5.2006, 16:27 ) | а как быть с pppoe(которое я юзаю ) и vpn? |
Код | //... interface
uses {...}, Winsock;
{Экспортируем функцию из WinSock 2 (WS2_32.DLL)} function WSAIoctl(s: TSocket; cmd: DWORD; lpInBuffer: PCHAR; dwInBufferLen: DWORD; lpOutBuffer: PCHAR; dwOutBufferLen: DWORD; lpdwOutBytesReturned: LPDWORD; lpOverLapped: POINTER; lpOverLappedRoutine: POINTER): Integer; stdcall; external 'WS2_32.DLL';
{ Константы взятые из заголовка C файлов } const SIO_GET_INTERFACE_LIST = $4004747F;
{ обьявляем необходимые нам типы } type sockaddr_gen = packed record AddressIn: sockaddr_in; filler: packed array[0..7] of char; end;
type INTERFACE_INFO = packed record iiFlags: u_long; // Флаги интерфейса iiAddress: sockaddr_gen; // Адрес интерфейса iiBroadcastAddress: sockaddr_gen; // Broadcast адрес iiNetmask: sockaddr_gen; // Маска подсети end;
//...
implementation {$R *.dfm}
function EnumInterfaces(var sInt: string): Boolean; var s: TSocket; wsaD: WSADATA; NumInterfaces: Integer; BytesReturned: u_long; pAddrInet: SOCKADDR_IN; pAddrString: PCHAR; PtrA: pointer; Buffer: array[0..20] of INTERFACE_INFO; i: Integer; begin result := true; // Инициализируем переменную sInt := '';
WSAStartup($0101, wsaD); // Запускаем WinSock // Здесь можно дабавить различные обработчики ошибки :)
s := Socket(AF_INET, SOCK_STREAM, 0); // Открываем сокет if (s = INVALID_SOCKET) then exit;
try // Вызываем WSAIoCtl PtrA := @bytesReturned; if (WSAIoCtl(s, SIO_GET_INTERFACE_LIST, nil, 0, @Buffer, 1024, PtrA, nil, nil) <> SOCKET_ERROR) then begin // Если OK, то определяем количество существующих интерфейсов
NumInterfaces := BytesReturned div SizeOf(INTERFACE_INFO);
for i := 0 to NumInterfaces - 1 do // Для каждого интерфейса begin pAddrInet := Buffer[i].iiAddress.addressIn; // IP адрес pAddrString := inet_ntoa(pAddrInet.sin_addr); sInt := sInt + pAddrString; sInt := sInt + #13#10; end; end; except end; // // Закрываем сокеты // CloseSocket(s); WSACleanUp; result := false; end; |
Использование:
Код | var tmp: string; begin EnumInterfaces(tmp); ShowMessage(tmp); end; |
|
спасибо! очень помогло!  |