![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получение локального 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