📄 ipcfg.pas
字号:
unit IpCfg;
interface
uses Windows, Winsock, SysUtils, ExtCtrls, ComCtrls;
Procedure EnumInterfaces;
{从Winsock 2.0导入函数WSAIOCtl -- 在Win98/ME/2K and 95 OSR2, NT srv pack #3下才有Winsock 2}
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';
{Constants taken from C header files}
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
uses Tools; //ToolsForm
Procedure EnumInterfaces;
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;
dwIP, dwMask, dwAddr_SubNetFisrt, dwAddr_SubNetLast, dwAddr_CNetFirst, dwAddr_CNetLast: DWORD;
strStatus, strType, strIP, strMask, strRange, strRange2, strBroadAddr: string;
Item: TListItem;
begin
// Initialize
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
SetFlags := Buffer[i].iiFlags;
if (SetFlags and IFF_UP) = IFF_UP then
strStatus := '正常' // Interface up/down
else
strStatus := '断开';
if (SetFlags and IFF_LOOPBACK) = IFF_LOOPBACK then // Loopback or
begin
strType := ' Loopback interface';
continue;
end
else
strType := ' Network interface'; // normal
pAddrInet := Buffer[i].iiAddress.addressIn; // IP ADDRESS
dwIP := pAddrInet.sin_addr.S_addr;
strIP := inet_ntoa(pAddrInet.sin_addr);
pAddrInet := Buffer[i].iiNetMask.addressIn; // SUBNET MASK
dwMask := Buffer[i].iiNetMask.addressIn.sin_addr.S_addr;
strMask := inet_ntoa(pAddrInet.sin_addr);
//Form1.Memo1.Lines.Add(format('%x : %x', [dwIP, dwMask]));
dwAddr_SubNetFisrt := dwIP and dwMask; //d3 := htonl(ntohl(d3) + 1);
dwAddr_SubNetLast := dwIP or (not dwMask);
strRange := inet_ntoa(in_addr(dwAddr_SubNetFisrt)) + ' - '
+ inet_ntoa(in_addr(dwAddr_SubNetLast));
strRange2 := '';
if dwMask <> $00FFFFFF then
begin
dwAddr_CNetFirst := dwIP and $00FFFFFF; //d5 := htonl(ntohl(d5) + 1);
dwAddr_CNetLast := dwIP or $FF000000;
strRange2 := inet_ntoa(in_addr(dwAddr_CNetFirst)) + ' - '
+ inet_ntoa(in_addr(dwAddr_CNetLast));
end;
pAddrInet := Buffer[i].iiBroadCastAddress.addressIn; // Broadcast addr
strBroadAddr := inet_ntoa(pAddrInet.sin_addr);
//ToolsForm.memIpCfg.Lines.Add('广播地址:' + strBroadAddr);
with ToolsForm do
begin
//ToolsForm.memIpCfg.Lines.Add('种类:' + strType);
memIpCfg.Lines.Add('您的IP地址:' + strIP);
memIpCfg.Lines.Add('子网掩码:' + strMask);
memIpCfg.Lines.Add('本子网的IP地址范围:' + strRange);
Item := lvIpAddr.Items.Add;
Item.Caption := inet_ntoa(in_addr(dwAddr_SubNetFisrt));
Item.SubItems.Add(inet_ntoa(in_addr(dwAddr_SubNetLast)));
if strRange2 <> '' then
begin
memIpCfg.Lines.Add('本C类网的IP地址范围:' + strRange2);
Item := lvIpAddr.Items.Add;
Item.Caption := inet_ntoa(in_addr(dwAddr_CNetFirst));
Item.SubItems.Add(inet_ntoa(in_addr(dwAddr_CNetLast)));
end;
memIpCfg.Lines.Add('连接状态:' + strStatus);
memIpCfg.Lines.Add(' ');
end;
end;
end;
except
end;
//
// Close sockets
//
CloseSocket(s);
WSACleanUp;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -