本机IP地址uses Winsock;function GetIP:String;
VAR
ch: Array [1..32] OF Char;
i: Integer;
S: String;
WSData: TWSAData;
MyHost: PHostEnt;
begin
if WSAstartup(2,WSData) <> 0 then Halt(2);
try
if GetHostName(@ch[1],32) <> 0 then Halt(3);
except halt(3);
end;
MyHost := GetHostByName(@ch[1]);
if MyHost = nil then
Halt(4)
else
begin
for i := 0 to 3 do
begin
S := S + Inttostr(Ord(MyHost.H_Addr^[i]));
if i < 3 then
S := S + '.';
end;
end;
Result:=s;
end;
VAR
ch: Array [1..32] OF Char;
i: Integer;
S: String;
WSData: TWSAData;
MyHost: PHostEnt;
begin
if WSAstartup(2,WSData) <> 0 then Halt(2);
try
if GetHostName(@ch[1],32) <> 0 then Halt(3);
except halt(3);
end;
MyHost := GetHostByName(@ch[1]);
if MyHost = nil then
Halt(4)
else
begin
for i := 0 to 3 do
begin
S := S + Inttostr(Ord(MyHost.H_Addr^[i]));
if i < 3 then
S := S + '.';
end;
end;
Result:=s;
end;
{此函数列举出所有的TCP/IP连接,并返回一个由回车换行符分隔的字符串,包含以下信息:
IP, NetMask, BroadCast-Address, Up/Down status, Broadcast support, Loopback
如果你将这个字符串赋给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;
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'; 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; // Interface flags
iiAddress: sockaddr_gen; // Interface address
iiBroadcastAddress: sockaddr_gen; // Broadcast address
iiNetmask: sockaddr_gen; // Network mask
end; implementation
{-------------------------------------------------------------------
1. 打开Winsock
2. 创建一个socket
3. 调用WSAIOCtl获取网络连接
4. 对每个连接,获取它的IP、掩码、广播地址、状态
5. 将信息填充到一个由CDLF分隔的字符串中
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; // Initialize
sInt := '';
WSAStartup($0101, wsaD); // Start WinSock
// You should normally check
// for errors here
s := Socket(AF_INET, SOCK_STREAM, 0); // Open a socket
if (s = INVALID_SOCKET) then exit;
try // Call WSAIoCtl
PtrA := @bytesReturned;
if (WSAIoCtl(s, SIO_GET_INTERFACE_LIST, nil, 0, @Buffer, 1024, PtrA, nil,nil)<>SOCKET_ERROR) then
begin // If ok, find out how
// many interfaces exist
NumInterfaces := BytesReturned div SizeOf(INTERFACE_INFO);
for i := 0 to NumInterfaces - 1 do // For every interface
begin
pAddrInet := Buffer[i].iiAddress.addressIn; // IP ADDRESS
pAddrString := inet_ntoa(pAddrInet.sin_addr);
sInt := sInt + ' IP=' + pAddrString + ',';
pAddrInet := Buffer[i].iiNetMask.addressIn; // SUBNET MASK
pAddrString := inet_ntoa(pAddrInet.sin_addr);
sInt := sInt + ' Mask=' + pAddrString + ',';
pAddrInet := Buffer[i].iiBroadCastAddress.addressIn; // Broadcast addr
pAddrString := inet_ntoa(pAddrInet.sin_addr);
sInt := sInt + ' Broadcast=' + pAddrString + ',';
SetFlags := Buffer[i].iiFlags;
if (SetFlags and IFF_UP) = IFF_UP then
sInt := sInt + ' Interface UP,' // Interface up/down
else
sInt := sInt + ' Interface DOWN,';
if (SetFlags and IFF_BROADCAST) = IFF_BROADCAST then // Broadcasts
sInt := sInt + ' Broadcasts supported,' // supported or
else // not supported
sInt := sInt + ' Broadcasts NOT supported,';
if (SetFlags and IFF_LOOPBACK) = IFF_LOOPBACK then // Loopback or
sInt := sInt + ' Loopback interface'
else
sInt := sInt + ' Network interface'; // normal
sInt := sInt + #13#10; // CRLF between
// each interface
end;
end;
except
end;
CloseSocket(s);
WSACleanUp;
result := false;
end; end.