ホスト名かIPアドレスから別名も含めてホスト情報を得る
|
81 |
GetHostInfo |
動作確認 |
Delphi2007 |
更新日 |
2008/02/06(水) |
インターネットのホスト名やIPアドレスに対して
名前問い合わせをして、それの別名も含めて求める関数を作りました。
例えば『www.google.co.jp』を引数にして問い合わせると
IPアドレス:66.249.89.107
ホスト名:www.l.google.com
ホスト別名:www.google.co.jp
ホスト別名:www.google.com
という値が戻ってきます。
逆に『66.249.89.107』を引数にして問い合わせると
IPアドレス:66.249.89.107
ホスト名:jp-in-f107.google.com
という値が戻ってきます。
別名が無い場合ももちろんあります。
────────────────────
type
THostInfo = record
HostName: String;
IPAddress: String;
AnotherNames: array of String;
end;
{-------------------------------
// host名かIPアドレスからhost情報を求める
引数: host名かIPアドレスを渡す
戻り値: ホスト名/IPアドレス/ホスト別名
ホスト別名は文字列の動的配列で戻るようになる
備考: uses Winsockが必要
履歴: 2008/02/06
//------------------------------}
function GetHostInfo(NetworkName: String): THostInfo;
type PPChar=^PChar;
var
PH : PHostEnt;
InAddr: TInAddr;
WSADATA : TWSADATA;
ppc: PPChar;
begin
Result.HostName := '';
Result.IPAddress := '';
SetLength(Result.AnotherNames, 0);
if NetworkName='' then Exit;
WSAStartup(MakeWord(1,1) , WSADATA);
InAddr.S_addr := inet_addr(PChar(NetworkName));
if InAddr.S_addr = INADDR_NONE then
begin
PH := gethostbyname(PChar(NetworkName));
end else
begin
PH := gethostbyaddr(@(InAddr.S_addr), 4, AF_INET);
end;
Result.HostName := PH^.h_name;
Result.IPAddress := inet_ntoa(PInAddr(PH^.h_addr_list^)^);
ppc:=PPChar(PH^.h_aliases);
while assigned(ppc^) do begin
SetLength(Result.AnotherNames, Length(Result.AnotherNames)+1);
Result.AnotherNames[Length(Result.AnotherNames)-1] := ppc^;
inc(ppc);
end;
WSACleanUp;
end;
//------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
HostInfo: THostInfo;
s: String;
begin
HostInfo := GetHostInfo(Edit1.Text);
Memo1.Lines.Add(HostInfo.IPAddress);
Memo1.Lines.Add(HostInfo.HostName);
for s in HostInfo.AnotherNames do
begin
Memo1.Lines.Add(s);
end;
end;
────────────────────
参考────────────────────
こける Wired-Winsockを使ってみようぜ-3.住所と氏名 '97/11/23
http://www.asahi-net.or.jp/~nk2w-ishr/winsock3.htm
|