Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получение локального IP адреса [D6, Win2k, WinXP]


Progh ©   (2005-05-11 14:06:00) 

Как получить локальныйIP адресс?


Eraser   (2005-05-11 21:32:00) [1]

Vit@ly ©

Данный пример возвращает все активные локальные IP адреса.


Vit@ly   (2005-05-11 21:17:00) [2]

А что мешает попробовать GetHostByName()?


Eraser   (2005-05-11 15:29:00) [3]

не совершенный, но рабочий вариант.

unit alxUSock;

interface

uses Windows, Winsock;

{

 Åñëè Âû ïîìåñòèòå ñòðîêó ðåçóëüòàòîâ â wide TMEMO (â åãî ñâîéñòâî memo.lines.text)
 òî íèêàêèõ ðåçóëüòàòîâ íå óâèäèòå.

 Òåñòèðîâàëîñü íà Win98/ME/2K, 95 OSR 2 è NT service
 pack #3 , ïîòîìó ÷òî èñïîëüçóåòñÿ WinSock 2 (WS2_32.DLL)

}

function EnumInterfaces(var sInt: string): Boolean;

{ ôóíêöèÿ WSAIOCtl èìïîðòèðóåòñÿ èç Winsock 2.0 - Winsock 2 äîñòóïåí }
{ òîëüêî â Win98/ME/2K è 95 OSR2, NT srv pack #3 }

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;
 IFF_UP = $00000001;
 IFF_BROADCAST = $00000002;
 IFF_LOOPBACK = $00000004;
 IFF_POINTTOPOINT = $00000008;
 IFF_MULTICAST = $00000010;

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

{-------------------------------------------------------------------

1. Îòêðûâàåì WINSOCK
2. Ñîçäà¸ì ñîêåò
3. Âûçûâàåì WSAIOCtl äëÿ äîñòóïà ê ñåòåâûì èíòåðôåéñàì
4. Äëÿ êàæäîãî èíòåðôåéñà, ïîëó÷àåì IP, MASK, BROADCAST, ñòàòóñ
5. Ðàçäåëÿåì ñòðîêó ñèìâîëîì CRLF  
6. Êîíåö :)

--------------------------------------------------------------------}

function EnumInterfaces(var sInt: string): Boolean;
var s: TSocket;
 wsaD: WSADATA;
 NumInterfaces: Integer;
 BytesReturned, SetFlags: 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;
       if i=NumInterfaces-1 then
         sInt := sInt
       else
         sInt := sInt + #13#10;
       // CRLF ìåæäó êàæäûì èíòåðôåéñîì
     end;
   end;
 except
 end;
//
// Çàêðûâàåì ñîêåòû
//
 CloseSocket(s);
 WSACleanUp;
 result := false;
end;

end.


Progh   (2005-05-11 15:11:00) [4]

локальный сетевой


VMcL   (2005-05-11 14:29:00) [5]

127.0.0.1


Наверх

Титульная страница Поиск, карта сайта Написать письмо