Top > C/C++あれこれ > 自マシンのIPアドレスを取得(Windows API)

#freeze
#contents

自マシンのネットワークデバイス名に対応するIPアドレスを取得します。ネットワークデバイス名は、"ipconfig /all"で表示される、Description属性の値です。

*環境 [#la616624]
>WindowsXP SP2
>VisualC++ 2008 ExpressEdition

プロジェクトの「追加の依存ファイル」に"Ws2_32.lib"と"iphlpapi.lib"を追記します。

#code(c){{
int main(){
        const char* r = GetMyIpAddr("Intel(R) PRO/100 VE Network Connection");
        printf("%s\n", r);
        return 0;
}
}}

*参考サイト [#c396fbb9]
「札幌ソフト開発工場」の情報を参考にさせていただきました。&br;
http://homepage2.nifty.com/spw/tips/

*ソースコード [#t412230f]
#code(c){{
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <errno.h>


const char* GetMyIpAddr(const char* device_name);
long GetIndexOfIF(const char* device_name);

/**
 * 自マシンのIPアドレスを取得します。
 * @param デバイス名(e.g. "eth0")
 * @return 「数値とドット」記法のアドレス
 */
const char* GetMyIpAddr(const char* device_name) {
	char* ipAddr = NULL;
	
	//IFテーブル用のメモリを獲得します。
	DWORD dSize=0;
	GetIfTable( NULL , &dSize, FALSE );
	PMIB_IPADDRTABLE pIpAddrTable = (PMIB_IPADDRTABLE)new char[dSize];
	if( GetIpAddrTable( (PMIB_IPADDRTABLE)pIpAddrTable,&dSize,FALSE) == NO_ERROR ){

		//指定されたデバイス名のインデックスを取得します。
		long index = GetIndexOfIF(device_name);
		for( int i = 0 ; i < (int)pIpAddrTable->dwNumEntries ; i++ ){
			if( index == pIpAddrTable->table[i].dwIndex ) {
				in_addr ina;
				ina.S_un.S_addr = pIpAddrTable->table[i].dwAddr;
				ipAddr = inet_ntoa( ina );
				break;
			}
		}
	}
	delete [] pIpAddrTable;
	return ipAddr;
}

/**
 * 指定されたデバイス名のインデックスを取得します。
 * @param デバイス名(e.g. "eth0")
 * @return インデックス
 */
long GetIndexOfIF(const char* device_name) {
	
	DWORD dSize=0;
	DWORD dwIndex=0;
	
	//IFテーブル用のメモリを獲得します。
	GetIfTable( NULL , &dSize, FALSE );
	PMIB_IFTABLE pIfTable = (PMIB_IFTABLE)new char[dSize] ;

	if( GetIfTable( (PMIB_IFTABLE)pIfTable,&dSize,FALSE) == NO_ERROR ){
	
		for(int i=0;i< (int)pIfTable->dwNumEntries;i++ ){

			if( sizeof(pIfTable->table[i].bDescr) < strlen(device_name) ) {
				continue;
			}

			if( !strncmp((const char*)pIfTable->table[i].bDescr, device_name, strlen(device_name)) ) {
				dwIndex = pIfTable->table[i].dwIndex;
				break;
			}
		}
	}
	delete [] pIfTable;
	return (long)dwIndex;
}


}}

    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS