前章では、自分のホスト名を取得してIPアドレスに変換して表示するプログラムを示しました。今回は、任意のホスト名から、IPアドレスを取得したり、IPアドレスからホスト名を取得するプログラムを考えます。
ホスト名からIPアドレスを取得するにはgethostbyname関数を使いましたね。
これが、HOSTENT構造体へのポインタを返しました。
逆にIPアドレスからホスト名を取得するにはgethostbyaddr関数を使います。
struct HOSTENT FAR * gethostbyaddr( const char FAR *addr, int len, int type );addrには、IPアドレスを指定します。
lenには、アドレスのサイズ(4バイトなので4を指定)
typeは、アドレスタイプです(AF_INET)。
成功するとHOSTENT構造体へのポインタを返します。失敗したときはNULLが返されます。
さて、inet_addr関数は次のようになっています。
unsigned long inet_addr( const char FAR *cp );cpには、IPアドレスを表す"192.168.0.55"などのような文字列を指定します。
では、プログラムを見てみましょう。
// getip02.c
#include <stdio.h>
#include <winsock.h>
int getip();
int gethost();
int main()
{
WSADATA wsaData;
char szAns[8];
int loop = 1;//1:ループを回る 0:ループを出る
WSAStartup(MAKEWORD(1, 1), &wsaData);
while (1) {
printf("------------------\n");
printf("1.IPアドレスの取得\n");
printf("2.ホスト名の取得\n");
printf("0.終了\n");
printf("------------------\n");
printf("選択:");
gets(szAns);
switch (szAns[0]) {
case '0':
loop = 0;
break;
case '1':
getip();
break;
case '2':
gethost();
break;
default:
printf("入力エラー\n");
break;
}
if (loop == 0)
break;
}
WSACleanup();
return 0;
}
int getip()
{
char szHost[256], szIP[256];
HOSTENT *lpHost;
IN_ADDR inaddr;
printf("ホスト名---");
gets(szHost);
lpHost = gethostbyname(szHost);
if (lpHost == NULL) {
printf("IPアドレス取得失敗\n");
return -1;
}
memcpy(&inaddr, lpHost->h_addr_list[0], 4);
strcpy(szIP, inet_ntoa(inaddr));
printf("IP = %s\n", szIP);
return 0;
}
int gethost()
{
char szIP[256], szHost[256];
HOSTENT *lpHost;
int addr;
printf("IPアドレス---");
gets(szIP);
addr = inet_addr(szIP);
lpHost = gethostbyaddr((char *)&addr, 4, AF_INET);
if (lpHost == NULL) {
printf("ホスト名取得失敗\n");
return -2;
}
printf("ホスト名---%s\n", lpHost->h_name);
return 0;
}
パーソナル・ファイヤー・ウォールとかウィルスチェックのプログラムが動いている
環境では、うまく動作しない可能性があります。
Update Oct/27/2003 By Y.Kumei