刚写好的读取多网卡IP地址的函数

虽然现在一机多网卡已经很普遍(像Notebook带有线、无线、蓝芽等),但是找一个现成的能够一次过读出所有网卡IP地址的函数实在是难,无奈自己写了一个,好东西谁用谁知道。

[c-sharp] view plain copy
 
  1. //uses WinSock;  
  2. type  
  3.   PAddrInfoW = ^ADDRINFOW;  
  4.   ADDRINFOW = record  
  5.     ai_flags        : Integer;      // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST  
  6.     ai_family       : Integer;      // PF_xxx  
  7.     ai_socktype     : Integer;      // SOCK_xxx  
  8.     ai_protocol     : Integer;      // 0 or IPPROTO_xxx for IPv4 and IPv6  
  9.     ai_addrlen      : ULONG;        // Length of ai_addr  
  10.     ai_canonname    : PWideChar;    // Canonical name for nodename  
  11.     ai_addr         : PSOCKADDR;    // Binary address  
  12.     ai_next         : PAddrInfoW;   // Next structure in linked list  
  13.   end;  
  14.   PPaddrinfoW = ^PAddrInfoW;  
  15.   TAddrInfoW = ADDRINFOW;  
  16.   
  17. function GetAddrInfoW(NodeName: PWideChar; ServiceName: PWideChar; Hints: PaddrinfoW; ppResult: PPaddrinfoW): Integer; stdcall; external 'WS2_32.DLL' name 'GetAddrInfoW';  
  18. procedure FreeAddrInfoW(ai: PaddrinfoW); stdcall; stdcall; external 'WS2_32.DLL' name 'FreeAddrInfoW';  
  19.   
  20. procedure GetIPList(List: TStrings);  
  21. var  
  22.     Buffer: array[0..63] of AnsiChar;  
  23.     Hostname: string;  
  24.     Hints: TAddrInfoW;  
  25.     LAddrInfo: pAddrInfoW;  
  26.     RetVal: Integer;  
  27.     GInitData: TWSADATA;  
  28. begin  
  29.     WSAStartup($101, GInitData);  
  30.     GetHostName(Buffer, SizeOf(Buffer));  
  31.     Hostname := string(Buffer);  
  32.     ZeroMemory(@Hints, SizeOf(TAddrInfoW));  
  33.     Hints.ai_family := 2{AF_INET};  
  34.     Hints.ai_socktype := 1{SOCK_STREAM};  
  35.     LAddrInfo := nil;  
  36.     RetVal := GetAddrInfoW(PChar(Hostname), nil, @Hints, @LAddrInfo);  
  37.     try  
  38.         if (RetVal = 0) and (LAddrInfo <> nil) then  
  39.             repeat  
  40.                 with TInAddr(LAddrInfo^.ai_addr^.sin_addr).S_un_b do  
  41.                     List.Add(Format('%d.%d.%d.%d', [Byte(s_b1), Byte(s_b2), Byte(s_b3), Byte(s_b4)]));  
  42.                 LAddrInfo := LAddrInfo^.ai_next;  
  43.             until LAddrInfo = nil;  
  44.     finally  
  45.         FreeAddrInfoW(LAddrInfo);  
  46.         WSACleanup;  
  47.     end;  
  48. end;  

PS:我用D2009,用低版本D的朋友麻烦自己改改了。

http://blog.csdn.net/nhconch/article/details/4897682

原文地址:https://www.cnblogs.com/findumars/p/5393703.html