interface
uses WinSock, Sockets, ctypes;
+const
+
+ NI_NOFQDN = $01;
+ NI_NUMERICHOST = $02;
+ NI_NAMEREQD = $04;
+ NI_NUMERICSERV = $08;
+ NI_DGRAM = $10;
+
+
type
PAddrInfo = ^TAddrInfo;
ServiceBuffer: PChar; ServiceBufferSize: cuint32; Flags: cint): cint; stdcall;
external 'ws2_32.dll' name 'getnameinfo';
- function ResolveHost(HostName: ansistring): TGAIResult;
+ function ResolveHost(HostName: ansistring; Family: cint): TGAIResult;
procedure FreeHost(var GAIResult: TGAIResult);
- function ResolveIP(SockAddr: PSockAddr): ansistring;
+ function ResolveIP(AddrInfo: PAddrInfo; Flags: cint): ansistring; overload;
+ function ResolveIP(AddrInfo: PAddrInfo): ansistring; overload;
+ function ResolveIP(SockAddr: PSockAddr; Flags: cint): ansistring; overload;
+ function ResolveIP(SockAddr: PSockAddr): ansistring; overload;
+ function IPToStr(SockAddr: PSockAddr): ansistring;
implementation
-function ResolveHost(HostName: ansistring): TGAIResult;
+function ResolveHost(HostName: ansistring; Family: cint): TGAIResult;
var hint: TAddrInfo;
begin
FillByte(hint, SizeOf(hint), 0);
with hint do begin
- ai_family:= AF_INET;
+ ai_family:= Family;
ai_socktype:= SOCK_STREAM;
ai_protocol:= IPPROTO_TCP;
end;
begin
if GAIResult.AddrInfo <> nil then begin
freeaddrinfo(GAIResult.AddrInfo);
- GAIResult.AddrInfo:= nil;
+ GAIResult.AddrInfo:= nil;
end;
end;
-function ResolveIP(SockAddr: PSockAddr): ansistring;
+function ResolveIP(AddrInfo: PAddrInfo; Flags: cint): ansistring;
var
r: integer;
NodeBuffer: array[0..255] of char;
begin
NodeBuffer[0]:= #0;
- r:= getnameinfo(SockAddr, SizeOf(TSockAddr), @NodeBuffer, SizeOf(NodeBuffer), nil, 0, 0);
+ r:= getnameinfo(AddrInfo^.ai_addr, AddrInfo^.ai_addrlen, @NodeBuffer, SizeOf(NodeBuffer), nil, 0, Flags);
if r = 0 then ResolveIP:= PChar(@NodeBuffer)
- else ResolveIP:= NetAddrToStr(SockAddr^.sin_addr);
+ else ResolveIP:= IPToStr(AddrInfo^.ai_addr);
+end;
+
+function ResolveIP(AddrInfo: PAddrInfo): ansistring;
+begin
+ ResolveIP:= ResolveIP(AddrInfo, 0);
end;
+function ResolveIP(SockAddr: PSockAddr; Flags: cint): ansistring;
+var
+ AddrInfo: TAddrInfo;
+begin
+ AddrInfo.ai_addr:= SockAddr;
+
+ if SockAddr^.sa_family = AF_INET then
+ AddrInfo.ai_addrlen:= SizeOf(TSockAddr)
+ else if SockAddr^.sa_family = AF_INET6 then
+ AddrInfo.ai_addrlen:= SizeOf(TSockAddr6)
+ else
+ AddrInfo.ai_addrlen:= 0;
+
+ ResolveIP:= ResolveIP(PAddrInfo(@AddrInfo), Flags);
+end;
+
+function ResolveIP(SockAddr: PSockAddr): ansistring;
+begin
+ ResolveIP:= ResolveIP(SockAddr, 0);
+end;
+
+function IPToStr(SockAddr: PSockAddr): ansistring;
+begin
+{$IFNDEF GNI}
+ if SockAddr^.sa_family = AF_INET then
+ IPToStr:= NetAddrToStr(SockAddr^.sin_addr)
+ else if SockAddr^.sa_family = AF_INET6 then
+ IPToStr:= NetAddrToStr6(PSockAddr6(SockAddr)^.sin6_addr)
+ else
+ IPToStr:= 'unknown';
+{$ELSE}
+ IPToStr:= ResolveIP(SockAddr, NI_NUMERICHOST);
+{$ENDIF}
+end;
end.