OrangeMaker_logo
memo アイコン SDK-MFC 備忘録

Windows SDKやMFCに関するメモです。
(記載内容について正しいことを保証するものではありません。MSDN等で確認してください)

ネットワークアダプタの情報取得

2010/7/21 作成

 ネットワークアダプタ(NIC)の情報はGetAdaptersInfo()という一発ものAPIで取得できます。

 このAPIは、接続されているアダプタの分だけ情報を返すので可変長の情報を返却します。

なので用意するバッファ量を確定させるために1回空読みのあとに本ちゃんの呼び出しをおこないます。こういったAPIは他にもあるのですが可変長タイプのAPIの呼び出し方の例としてメモしておきます。

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
//アダプタ情報を格納するコンテナ(vector)
vector<IP_ADAPTER_INFO> m_vList;

//
// Adapter listを作成する
//
BOOL makeList()
{
    // It is possible for an adapter to have multiple
    // IPv4 addresses, gateways, and secondary WINS servers
    // assigned to the adapter. 
    //
    BOOL ret = FALSE;
    PIP_ADAPTER_INFO pAdapterInfo;
    DWORD dwRetVal = 0;

    ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);
    pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(sizeof (IP_ADAPTER_INFO));
    if (pAdapterInfo == NULL) {
        AfxMessageBox(_T("Error allocating memory needed to call GetAdaptersinfo"));
        return FALSE;
    }
    // 必要なバッファサイズを取得するために1個分のバッファで呼び出す
    if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
        //バッファが不足しているので
        //一旦バッファを開放して再取得する
        FREE(pAdapterInfo);
        pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen);
        if (pAdapterInfo == NULL) {
            AfxMessageBox(
                _T("Error allocating memory needed to call GetAdaptersinfo"));
            return FALSE;
        }
    }
    // 必要なバッファを取得した上でもう一度情報を取得する
    if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
        PIP_ADAPTER_INFO pAdapter = pAdapterInfo;
        m_vList.clear();
        while (pAdapter) {
            IP_ADAPTER_INFO data = {0};
            data = *pAdapter;			//データをcopy
            m_vList.push_back(data);		//コンテナに格納
            //次のデータをおさえる
            pAdapter = pAdapter->Next;
        }
    } 
    else {
        CString msg;
        msg.Format(_T("GetAdaptersInfo failed with error: %d"),dwRetVal);
        AfxMessageBox(msg);
        ret = FALSE;

    }
    if (pAdapterInfo){
        FREE(pAdapterInfo);
    }
    return ret;
}
		

補足:
GetAdaptersInfo()はIPV4の情報を取得します。IPV6を含む情報はXP以降の場合GetAdaptersAddresses ()で情報が取得できますが、単にIPアドレスやMACアドレスを取得するだけならGetAdapterInfo()で十分な情報が取得できます。