前章のプログラムでは、せっかくホストを列挙してもプログラムが終了すると、跡形もなく消えてしまいました。今回は、これをファイルに保存できるように改良します。保存してあったファイルを読み出せるようにします。 また、保存してあったファイルに、追加で書き足せるようにもします。
関数等で特に、目新しいものはありません。
では、プログラムを見てみましょう。(もちろんプロジェクトにWSock32.Libを参加させておきます)
/* ip02.c */
#include <stdio.h>
#include <winsock.h>
int gethost();
int mysave();
int myread();
int is_file = 0;
FILE *fp;
int main()
{
WSADATA wsaData;
char szAns[8];
int loop = 1;//1:ループを回る 0:ループを出る
WSAStartup(MAKEWORD(1, 1), &wsaData);
while (1) {
printf("------------------\n");
printf("1.ホスト名の取得\n");
printf("2.ファイルに保存\n");
printf("3.ファイル読みだし\n");
printf("0.終了\n");
printf("------------------\n");
printf("選択:");
gets(szAns);
switch (szAns[0]) {
case '0':
loop = 0;
break;
case '1':
gethost();
break;
case '2':
mysave();
break;
case '3':
myread();
break;
default:
printf("入力エラー\n");
break;
}
if (loop == 0)
break;
}
WSACleanup();
return 0;
}
main関数では、単にメニューを表示させているだけです。
int gethost()
{
char szIP3[256], szIPstart[16], szIPend[16], szIP[256], szEnd[16];
HOSTENT *lpHost;
int addr, n, i;
printf("IPアドレス上位3バイト(例: 192.168.0)---");
gets(szIP3);
printf("開始IPアドレス下位1バイト(例: 1)---");
gets(szIPstart);
printf("終了IPアドレス下位1バイト(例: 10)--");
gets(szIPend);
n = atoi(szIPend) - atoi(szIPstart) + 1;
if (n <= 0) {
printf("指定が不正です\n");
return -1;
}
for (i = 0; i < n; i++) {
strcpy(szIP, szIP3);
if (szIP3[strlen(szIP3)-1] != '.')
strcat(szIP, ".");
itoa(atoi(szIPstart) + i, szEnd, 10);
strcat(szIP, szEnd);
addr = inet_addr(szIP);
lpHost = gethostbyaddr((char *)&addr, (int)sizeof(addr), AF_INET);
if (lpHost == NULL) {
printf("ホスト名取得失敗(%s)\n", szIP);
continue;
}
printf("%s---%s\n", szIP, lpHost->h_name);
if (is_file)
fprintf(fp, "%s---%s\n", szIP, lpHost->h_name);
}
return 0;
}
これは、前章とほとんど同じですが、最後にis_fileが0でない時は、
fprintf関数でファイルに書き込んでいる点に注意してください。
int mysave()
{
char szFileName[256];
printf("保存するファイル名---");
gets(szFileName);
fp = fopen(szFileName, "a");
if (fp == NULL) {
perror("ファイルのオープンに失敗しました\n");
return -1;
}
is_file = 1;
gethost();
fclose(fp);
is_file = 0;
return 0;
}
is_fileを1にしてgethost関数を呼び出しています。これで、ファイルに書き込めます。
書き込みが終わったらis_fileを0に戻しています。
int myread()
{
char szFileName[256], buffer[64];
printf("ファイル名----");
gets(szFileName);
fp = fopen(szFileName, "r");
if (fp == NULL) {
printf("ファイルのオープンに失敗しました\n");
return -1;
}
while (fgets(buffer, 256, fp) != NULL) {
printf(buffer);
}
fclose(fp);
return 0;
}
ファイルの読み出しです。特にどうということもないですね。
Update Apr/04/2004 By Y.Kumei