uses WinSock 定义函数: function HostToIP(Name: string; var Ip: string): Boolean; var wsdata : TWSAData; hostName : array [0..255] of char; hostEnt : PHostEnt; addr : PChar; begin WSAStartup ($0101, wsdata); try gethostname (hostName, sizeof (hostName)); StrPCopy(hostName, Name); hostEnt := gethostbyname (hostName); if Assigned (hostEnt) then if Assigned (hostEnt^.h_addr_list) then begin addr := hostEnt^.h_addr_list^; if Assigned (addr) then begin IP := Format ('%d.%d.%d.%d', [byte (addr [0]), byte (addr [1]), byte (addr [2]), byte (addr [3])]); Result := True; end else Result := False; end else Result := False else begin Result := False; end; finally WSACleanup; end end; 调用 var IP: string; DNS: string; begin DNS := InputBox('输入DNS域名', '主机名称:', ''); if HostToIp(DNS, IP) then showmessage(IP); end;
procedure StartTracert(Ip : string;log : TStrings); var WSAData:TWSAData; dwAddr:integer; hp:phostent; begin //init winsock dll if (WSAStartup(MAKEWORD(2,0),WSAData)<>0) then raise Exception.Create('Winsock Version Error'); ZeroMemory(Addr(dwAddr),sizeof(dwAddr)); //resolve IP //convert form dotted address dwAddr:=inet_addr(pchar(Ip)); if (dwAddr=INADDR_NONE) then begin hp:=gethostbyname(pchar(Ip)); if hp = nil then begin log.Add('Failed to resolve host IP'); exit//Failed to resolve host; end else CopyMemory(Addr(dwAddr),hp.h_addr^,hp.h_length); end; log.Add(Format('Resolve Target: %d.%d.%d.%d',[LoByte(LoWord(dwAddr)), HiByte(LoWord(dwAddr)), LoByte(HiWord(dwAddr)), HiByte(HiWord(dwAddr))])); WSACleanUP; end;
TO :Mag1cD(Magic.D) 你这是在局域网内通过机器名 返回IP, 我是要在广域网内通过域名,获其IP
通过域名获得IP function GetHostIP(HostName: String): String; var buf:pChar; iWsaRet:Integer; Data:WSAData; hostent:PHostEnt; begin Result := ''; iWsaRet := WSAStartup($101,Data); if iWsaRet<>0 then begin ShowMessage('Socket initialize error!'); Exit; end; buf := Allocmem(60); strcopy(buf,PChar(HostName)); if Trim(buf)='' then gethostname(buf,60); hostent := gethostbyname(buf); Freemem(buf,60); if hostent=nil then Exit; Result := inet_ntoa(pinAddr(hostent^.h_addr^)^); WSACleanup(); end; 通过IP获得计算机名 function GetDomainName(Ip: string): string; var pH : PHostent; data : twsadata; ii : dword; begin WSAStartup($101, Data); ii := inet_addr(pchar(ip)); pH := gethostbyaddr(@ii, sizeof(ii), PF_INET); if (ph <> nil) then result := pH.h_name else begin result := '未知的计算机'; end; WSACleanup; end;
TO:hellolongbin(一个人) 域名:www.google.com 返回:‘’
uses winsock;function GetIP(Name:string) : string; type TaPInAddr = array [0..10] of PInAddr; PaPInAddr = ^TaPInAddr; var phe :PHostEnt; pptr : PaPInAddr; I : Integer; GInitData : TWSADATA; begin WSAStartup($101, GInitData); Result := ''; phe :=GetHostByName(pchar(Name)); //返回一个指向主机信息结构的指针 pptr := PaPInAddr(Phe^.h_addr_list); //强制转换 result:=StrPas(inet_ntoa(pptr^[0]^));//返回一个点分形式的字符串IP地址 WSACleanup; end;procedure TForm1.Button1Click(Sender: TObject); begin showmessage(GetIP('www.google.com')); //得到的IP:64.233.189.104end;Winxp+Delphi7测试通过~~~
描述一个将主机名解释成IP地址的函数 ------------------------------------------- 在use子句声明Winsock ............ function HostToIP(Name: string; var Ip: string): Boolean; var wsdata : TWSAData; hostName : array [0..255] of char; hostEnt : PHostEnt; addr : PChar; begin WSAStartup ($0101, wsdata); try gethostname (hostName, sizeof (hostName)); StrPCopy(hostName, Name); hostEnt := gethostbyname (hostName); if Assigned (hostEnt) then if Assigned (hostEnt^.h_addr_list) then begin addr := hostEnt^.h_addr_list^; if Assigned (addr) then begin IP := Format ('%d.%d.%d.%d', [byte (addr [0]), byte (addr [1]), byte (addr [2]), byte (addr [3])]); Result := True; end else Result := False; end else Result := False else begin Result := False; end; finally WSACleanup; end end; ................................ 你可以这样试用这个功能:在form上放置EditBox、一个按钮和一个标签,在把代码加到按钮的OnClick事件上procedure TForm1.Button1Click(Sender: TObject); var IP: string; begin if HostToIp(Edit1.Text, IP) then Label1.Caption := IP; end;
procedure TForm1.Button1Click(Sender: TObject); type //copy the add_list TAddrList = array [0..20] of PInAddr; PAddrList = ^TAddrList; var phent : PHostEnt; P: PAddrList; I : Integer; begin //detect yahoo.com phent := GetHostByName(pchar(edit1.text)); if phent<>nil then begin I := 0; P := PAddrList(phent^.h_Addr_list); while P[I] <> nil do begin listbox1.items.Add(StrPas(inet_ntoa(P[I]^))); Inc(I) end end; end;
procedure TForm1.Button1Click(Sender: TObject); type //copy the add_list TAddrList = array [0..20] of PInAddr; PAddrList = ^TAddrList; var phent : PHostEnt; P: PAddrList; I : Integer; WSAData : TWSAData; begin if (WSAStartup(MAKEWORD(2,0),WSAData)<>0) then raise Exception.Create('Winsock Version Error'); //detect yahoo.com phent := GetHostByName(pchar(edit1.text)); if phent<>nil then begin I := 0; P := PAddrList(phent^.h_Addr_list); while P[I] <> nil do begin listbox1.items.Add(StrPas(inet_ntoa(P[I]^))); Inc(I) end end; WSACleanUP; end;
定义函数:
function HostToIP(Name: string; var Ip: string): Boolean;
var
wsdata : TWSAData;
hostName : array [0..255] of char;
hostEnt : PHostEnt;
addr : PChar;
begin
WSAStartup ($0101, wsdata);
try
gethostname (hostName, sizeof (hostName));
StrPCopy(hostName, Name);
hostEnt := gethostbyname (hostName);
if Assigned (hostEnt) then
if Assigned (hostEnt^.h_addr_list) then begin
addr := hostEnt^.h_addr_list^;
if Assigned (addr) then begin
IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
byte (addr [1]), byte (addr [2]), byte (addr [3])]);
Result := True;
end
else
Result := False;
end
else
Result := False
else begin
Result := False;
end;
finally
WSACleanup;
end
end;
调用
var
IP: string;
DNS: string;
begin
DNS := InputBox('输入DNS域名', '主机名称:', '');
if HostToIp(DNS, IP) then showmessage(IP);
end;
var
WSAData:TWSAData;
dwAddr:integer;
hp:phostent;
begin
//init winsock dll
if (WSAStartup(MAKEWORD(2,0),WSAData)<>0) then
raise Exception.Create('Winsock Version Error');
ZeroMemory(Addr(dwAddr),sizeof(dwAddr));
//resolve IP
//convert form dotted address
dwAddr:=inet_addr(pchar(Ip));
if (dwAddr=INADDR_NONE) then
begin
hp:=gethostbyname(pchar(Ip));
if hp = nil then
begin
log.Add('Failed to resolve host IP');
exit//Failed to resolve host;
end
else
CopyMemory(Addr(dwAddr),hp.h_addr^,hp.h_length);
end;
log.Add(Format('Resolve Target: %d.%d.%d.%d',[LoByte(LoWord(dwAddr)),
HiByte(LoWord(dwAddr)),
LoByte(HiWord(dwAddr)),
HiByte(HiWord(dwAddr))]));
WSACleanUP;
end;
你这是在局域网内通过机器名 返回IP,
我是要在广域网内通过域名,获其IP
function GetHostIP(HostName: String): String;
var
buf:pChar;
iWsaRet:Integer;
Data:WSAData;
hostent:PHostEnt;
begin
Result := '';
iWsaRet := WSAStartup($101,Data);
if iWsaRet<>0 then
begin
ShowMessage('Socket initialize error!');
Exit;
end;
buf := Allocmem(60);
strcopy(buf,PChar(HostName));
if Trim(buf)='' then
gethostname(buf,60);
hostent := gethostbyname(buf);
Freemem(buf,60);
if hostent=nil then
Exit;
Result := inet_ntoa(pinAddr(hostent^.h_addr^)^);
WSACleanup();
end;
通过IP获得计算机名
function GetDomainName(Ip: string): string;
var
pH : PHostent;
data : twsadata;
ii : dword;
begin
WSAStartup($101, Data);
ii := inet_addr(pchar(ip));
pH := gethostbyaddr(@ii, sizeof(ii), PF_INET);
if (ph <> nil) then
result := pH.h_name
else
begin
result := '未知的计算机';
end;
WSACleanup;
end;
域名:www.google.com 返回:‘’
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe :PHostEnt;
pptr : PaPInAddr;
I : Integer;
GInitData : TWSADATA;
begin
WSAStartup($101, GInitData);
Result := '';
phe :=GetHostByName(pchar(Name)); //返回一个指向主机信息结构的指针
pptr := PaPInAddr(Phe^.h_addr_list); //强制转换
result:=StrPas(inet_ntoa(pptr^[0]^));//返回一个点分形式的字符串IP地址
WSACleanup;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(GetIP('www.google.com')); //得到的IP:64.233.189.104end;Winxp+Delphi7测试通过~~~
-------------------------------------------
在use子句声明Winsock
............
function HostToIP(Name: string; var Ip: string): Boolean;
var
wsdata : TWSAData;
hostName : array [0..255] of char;
hostEnt : PHostEnt;
addr : PChar;
begin
WSAStartup ($0101, wsdata);
try
gethostname (hostName, sizeof (hostName));
StrPCopy(hostName, Name);
hostEnt := gethostbyname (hostName);
if Assigned (hostEnt) then
if Assigned (hostEnt^.h_addr_list) then begin
addr := hostEnt^.h_addr_list^;
if Assigned (addr) then begin
IP := Format ('%d.%d.%d.%d', [byte (addr [0]),
byte (addr [1]), byte (addr [2]), byte (addr [3])]);
Result := True;
end
else
Result := False;
end
else
Result := False
else begin
Result := False;
end;
finally
WSACleanup;
end
end;
................................
你可以这样试用这个功能:在form上放置EditBox、一个按钮和一个标签,在把代码加到按钮的OnClick事件上procedure TForm1.Button1Click(Sender: TObject);
var
IP: string;
begin
if HostToIp(Edit1.Text, IP) then Label1.Caption := IP;
end;
回各位:以上方法都能通过计算机名取回IP,但通过域名却不行,我用Delphi win200,且用在cmd下
ping www.google.com 提示 ‘Unknow host www.google.com’,能上网为什么PING不通?
type
//copy the add_list
TAddrList = array [0..20] of PInAddr;
PAddrList = ^TAddrList;
var
phent : PHostEnt;
P: PAddrList;
I : Integer;
begin
//detect yahoo.com
phent := GetHostByName(pchar(edit1.text));
if phent<>nil then
begin
I := 0;
P := PAddrList(phent^.h_Addr_list);
while P[I] <> nil do
begin
listbox1.items.Add(StrPas(inet_ntoa(P[I]^)));
Inc(I)
end
end;
end;
type
//copy the add_list
TAddrList = array [0..20] of PInAddr;
PAddrList = ^TAddrList;
var
phent : PHostEnt;
P: PAddrList;
I : Integer;
WSAData : TWSAData;
begin
if (WSAStartup(MAKEWORD(2,0),WSAData)<>0) then
raise Exception.Create('Winsock Version Error'); //detect yahoo.com
phent := GetHostByName(pchar(edit1.text));
if phent<>nil then
begin
I := 0;
P := PAddrList(phent^.h_Addr_list);
while P[I] <> nil do
begin
listbox1.items.Add(StrPas(inet_ntoa(P[I]^)));
Inc(I)
end
end;
WSACleanUP;
end;
www.google.com-----64.233.189.104