アットウィキロゴ

IPからホスト名取得(hostsファイル作成まで)(VC)

// sas20_hostname.cpp : コンソール アプリケーション用のエントリ ポイントの定義
//

#include "stdafx.h"
#include "sas20_hostname.h"
#include <winsock2.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// 唯一のアプリケーション オブジェクト

CWinApp theApp;

//int sas20_hostname_main();
int sas20_ip_main(TCHAR* netstr, FILE* fp);
int checkParam(TCHAR* str);
void printHelp();

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// MFC の初期化および初期化失敗時のエラーの出力
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 必要に応じてエラー コードを変更してください。
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// TODO: この位置にアプリケーションの動作を記述してください。
CString strHello;
strHello.LoadString(IDS_HELLO);
cout << (LPCTSTR)strHello << endl;

//パラーメータ
if (argc != 3 ) {
cout << "argc=" << argc;
printHelp();
return 1;
} else {

int ret = checkParam(argv[1]);

//cout << " ※Check result = " << ret << "\n";

if (ret != 3) {
printHelp();
return 1;
}

//出力先OPEN
FILE *fp = fopen(argv[2], "w");
if (fp == NULL) {
cout << "ファイルオープン失敗\n";
return 1;
}

fprintf(fp, "## sas20_hostname create host file.\n\n");

//呼び出し@@@
sas20_ip_main(argv[1], fp);

//クローズ
fclose(fp);
}

}

return nRetCode;
}

// . で分割して数値チェック
// トークンは3個だけOK
int checkParam(TCHAR* str) {

const char *delim = ".";
char buf[255] = "";
char *tp;
int n ;
int count = 0;

//数値かつ

strcpy(buf, str);
tp = strtok(buf,delim);
n = atoi(tp);
cout << "n = " << n;
if (n <= 0 || 255 < n) {
return 0;
} else {
count++;
}
while (tp != NULL) {
tp = strtok(NULL, delim);
n = atoi(tp);
cout << "n = " << n;
if (n == 0) {
break;
}
if (n < 0 || 255 < n) {
return 0;
} else {
count++;
}
}

return count;

}



void printHelp() {
cout << "============================================================================\n";
cout << "Usage:\n";
cout << "sas20_hostname [ネットワークアドレス24ビット分の文字列表現] [出力ファイル名]\n";
cout << "例 \n";
cout << "       C:\\>sas20_hostname 192.168.10 host.txt\n";
cout << "============================================================================\n";

}


//ホスト名から引くのは考えたらあほ。
//IPアドレスからひく。
//実際にはネットワークアドレス配下の全IPを指定してホスト名がとれればOKでしょ。
int sas20_ip_main(TCHAR* netstr, FILE* fp)
{
// char netAddr[24] = "192.168.55.";
// char netAddr[24] = "127.0.0.";
char netAddr[24] = "";
char checkAddr[24];

struct hostent *host;
struct in_addr addr;
int idx ;

//コピー
strcpy(&netAddr[0], netstr);

//末尾が.なら削除
if (netAddr[strlen(netAddr)-1] == '.') {
netAddr[strlen(netAddr)-1] = '\0';
}


WSADATA wsaData;

WSAStartup(2 , &wsaData);
printf("バージョン = %d.%d\n記述 = %s\n状態 = %s\n" ,
(BYTE)wsaData.wHighVersion , wsaData.wHighVersion >> 8 ,
wsaData.szDescription , wsaData.szSystemStatus
);

//0~255までIPを作成してホスト名を取得
for (idx = 0; idx < 256; idx++) {

//クリア
memset(checkAddr, 0x00, sizeof(checkAddr));

//対象のIPアドレスを作成
sprintf(checkAddr, "%s.%d", netAddr, idx);

/* 文字列で表現されるIPアドレスを32ビットのバイナリ値に変換 */
addr.s_addr = inet_addr(checkAddr);

/* IPアドレスからホスト名を取得 */
//host = gethostbyaddr((const char *)&addr.s_addr, sizeof(addr.s_addr), AF_INET);
host = gethostbyaddr((const char *)&addr.s_addr, 4, AF_INET);

/* 結果を表示 */
if (host == NULL) {
//なし
printf("%15s--->%s\n", checkAddr, "(non)");
} else {
//あり
printf("%15s--->%s\n", checkAddr, host->h_name);

//ファイルに出力
fprintf(fp,"%s\t%s\n", checkAddr, host->h_name);
}

}

WSACleanup();
return 0;
}
最終更新:2010年05月31日 12:22