普通、URLを指定するときに、IPアドレスを直接指定する人はいません。だいたいにして、「www.text2music.com」などのドメインを指定します。
サーバー名からIPアドレスを取得 |
それでは、まずサーバー名からIPアドレスを取得する方法を覚えましょう。
function GetIpAddressStr(server: string): string;
var
addr: u_long;
phe: PHostEnt;
begin
// サーバー名からIPアドレスを得る............(1)
phe := gethostbyname(PChar(server));
if phe = nil then
begin
// IPアドレスの指定があったか?............(2)
addr := inet_addr(PChar(server));
phe := gethostbyaddr(@addr, 4, AF_INET);
end;
if phe = nil then
begin
Result := ''; // 失敗
end else
begin
// in_addr型から、xx.xx.xx.xx の文字列に変換する..(3)
Result := inet_ntoa(PInAddr(phe.h_addr_list^)^);
end;
end;
(1)の『gethostbyname()』関数でサーバー名からホスト情報を取得することができます。戻り値は、PHostEnt型です。PHostEnt型は以下で説明してます。
(2)は、(1)の『gethostbyname()』関数が失敗したときに別の方法でアドレスを取得します。『gethostbyaddr()』関数は、文字列で『192.168.1.1』などのように指定したときに、ホスト情報を取得するのです。
(3)の部分で、ホスト情報を、『xx.xx.xx.xx』の文字列に変換します。
さて、ホスト情報を取得する場面で、PHostEnt型が出てきました。これは何かというと、PHostEnt型は、THostEnt型のポインタ型で、以下のように宣言されています。
hostent = record
h_name: PChar;
h_aliases: ^PChar;
h_addrtype: Smallint;
h_length: Smallint;
case Byte of
0: (h_addr_list: ^PChar);
1: (h_addr: ^PChar)
end;
THostEnt = hostent;
h_nameは一般的なサーバー名。
h_aliases は、ホストの別名が格納されている配列へのポインタです。別名のないコンピューターもあります。
h_addrtype は、要求したアドレスの種類を表します。通常は、AF_INET が格納されてます。
h_length はアドレスのサイズをバイト単位で表します。通常の IP であれば 4 バイト、IPv6 であれば 16 バイトとなります。
h_addr_list には、ネットワークアドレスの情報へのポインタの配列です。