Как по IP адресу получить HostName (и обратно)
Материал из DRKB
function TGenericNetTask.GetPeerOrigin(const ALogin: string): DWORD;
const
AddressStrMaxLen = 256;
var
len: DWORD;
ptr: PChar;
pHE: PHostEnt;
addr: TSockAddr;
buf: Array [0..AddressStrMaxLen-1] of Char;
begin
if FNet = nil then
raise ESocketError.Error(-1, ClassName + '.GetPeerAds: Net is not defined', WSAHOST_NOT_FOUND);
len := SizeOf(TSockAddr);
if GetPeerName(FSocket, addr, len) <> 0 then
RaiseLastSocketError(-1, ClassName + '.GetPeerAds: GetPeerName()');
case addr.sin_family of
AF_INET: // TCP/IP
begin
pHE := GetHostByAddr(PChar(@addr.sin_addr), SizeOf(TInAddr), AF_INET);
if pHE = nil then
RaiseLastSocketError(-1, ClassName + '.GetPeerAds: GetHostByAddr()');
FPeerNodeName := pHE^.h_name;
if FNet.NodeByName(FPeerNodeName) = nil then
begin
ptr := StrScan(pHE^.h_name, '.');
if ptr <> nil then
FPeerNodeName := Copy(pHE^.h_name, 1, ptr-pHE^.h_name);
end;
end;
else
len := AddressStrMaxLen;
if WSAAddressToStringA(sin, sinlen, nil, buf, len) <> 0 then
RaiseLastSocketError(-1, ClassName + '.GetPeerAds: WSAAddressToStringA()');
ptr := StrRScan(buf, ':');
if ptr <> nil then len := ptr - buf;
FPeerNodeName := Copy(buf, 1, len);
end;
Result := FNet.EncodeAddress(ALogin, FPeerNodeName, '', [bLoginIdRequired, bNodeIdREquired, bRaiseError]);
end;
Alex Konshin mailto:alexk@msmt.spb.su" (2:5030/217)
Author: StayAtHome
Source: Vingrad.ru http://forum.vingrad.ru
ID: 03353