⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ipcfg.pas

📁 该程序用D5编译
💻 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 + -