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

本文介绍了一种在Delphi中获取计算机上所有活动网卡IP地址的方法。通过使用Winsock API函数GetAddrInfoW,该函数可以遍历并收集所有有效IPv4地址。文章提供了一份实用的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

//uses WinSock; type PAddrInfoW = ^ADDRINFOW; ADDRINFOW = record ai_flags : Integer; // AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST ai_family : Integer; // PF_xxx ai_socktype : Integer; // SOCK_xxx ai_protocol : Integer; // 0 or IPPROTO_xxx for IPv4 and IPv6 ai_addrlen : ULONG; // Length of ai_addr ai_canonname : PWideChar; // Canonical name for nodename ai_addr : PSOCKADDR; // Binary address ai_next : PAddrInfoW; // Next structure in linked list end; PPaddrinfoW = ^PAddrInfoW; TAddrInfoW = ADDRINFOW; function GetAddrInfoW(NodeName: PWideChar; ServiceName: PWideChar; Hints: PaddrinfoW; ppResult: PPaddrinfoW): Integer; stdcall; external 'WS2_32.DLL' name 'GetAddrInfoW'; procedure FreeAddrInfoW(ai: PaddrinfoW); stdcall; stdcall; external 'WS2_32.DLL' name 'FreeAddrInfoW'; procedure GetIPList(List: TStrings); var Buffer: array[0..63] of AnsiChar; Hostname: string; Hints: TAddrInfoW; LAddrInfo: pAddrInfoW; RetVal: Integer; GInitData: TWSADATA; begin WSAStartup($101, GInitData); GetHostName(Buffer, SizeOf(Buffer)); Hostname := string(Buffer); ZeroMemory(@Hints, SizeOf(TAddrInfoW)); Hints.ai_family := 2{AF_INET}; Hints.ai_socktype := 1{SOCK_STREAM}; LAddrInfo := nil; RetVal := GetAddrInfoW(PChar(Hostname), nil, @Hints, @LAddrInfo); try if (RetVal = 0) and (LAddrInfo <> nil) then repeat with TInAddr(LAddrInfo^.ai_addr^.sin_addr).S_un_b do List.Add(Format('%d.%d.%d.%d', [Byte(s_b1), Byte(s_b2), Byte(s_b3), Byte(s_b4)])); LAddrInfo := LAddrInfo^.ai_next; until LAddrInfo = nil; finally FreeAddrInfoW(LAddrInfo); WSACleanup; end; end;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值