刚写好的读取多网卡IP地址的函数
2016-04-15 00:01
274 查看
虽然现在一机多网卡已经很普遍(像Notebook带有线、无线、蓝芽等),但是找一个现成的能够一次过读出所有网卡IP地址的函数实在是难,无奈自己写了一个,好东西谁用谁知道。
[c-sharp] view plain copy
//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的朋友麻烦自己改改了。
http://blog.csdn.net/nhconch/article/details/4897682
[c-sharp] view plain copy
//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的朋友麻烦自己改改了。
http://blog.csdn.net/nhconch/article/details/4897682
相关文章推荐
- 在Ubuntu Kylin14上安装Redis
- FTP主动模式与被动模式
- 解决FTPClient linux 下载文件小于实际文件,线程挂起等问题
- 日程日历示例
- springmvc spring mybatis 添加ehcache
- Jquery File upload 初探
- 弹出框css技巧
- Thinkphp:引入第三方库的方法
- 学习Linux的正确姿势,你get到了吗?
- 使用SVN clang: error: linker command failed with exi
- iOS开发中Xcode编译错误 linker command failed with exit co
- 在laravel中用redis与nodejs的socket通讯
- 创建Laravel项目的几种方法
- Laravel Spark的安装
- 常见安装命令
- 小白学习工具
- 【Kafka】MirrorMaker 跨集群同步方案
- 使用JDK8新特性重构你的代码
- 天下数据叫你如何保证服务器登录安全
- KeyMob/移动广告聚合平台/爱上KeyMob/轻松赚收益