今回は、任意のホスト名から、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