2007-02 / 2007-02-26

前のエントリ: 髪 x 服 x カルボナーラ [diary]
次のエントリ: GD::Barcode::NW7でバーコード作成 [perl]

MACアドレスの取得[2]
2007-02-26-1 / カテゴリ: [programming][win][c] / [permlink]

[2007-02-21-2]の続き。
Windows/ネットワークプログラミング discypus経由。

GetIfTable() を使う方法
インターフェースの一覧取得
iphlpapi.h を include して iphlpapi.lib をリンクして取得する。非アクティブなNICのMACも取得できた。MAC以外にいろいろ取得できるっぽい。
手元の環境ではなぜか搭載NIC数+1が検出されて、最後のNICはMACが 00:00:00:00:00:00 になる…と思ったら、ループバックインタフェースの情報だった。
現在のIPアドレス情報はなさげ。
データ構造体の定義は iprtrmib.h より。(コメントは追加)
typedef struct _MIB_IFROW
{
    WCHAR   wszName[MAX_INTERFACE_NAME_LEN]; // 0x00で埋まる…?
    DWORD    dwIndex;
    DWORD    dwType;
    DWORD    dwMtu;
    DWORD    dwSpeed;                        // リンク速度(BTのは1Mだった)
    DWORD    dwPhysAddrLen;
    BYTE    bPhysAddr[MAXLEN_PHYSADDR];      // MAC
    DWORD    dwAdminStatus;
    DWORD    dwOperStatus;
    DWORD    dwLastChange;
    DWORD    dwInOctets;
    DWORD    dwInUcastPkts;
    DWORD    dwInNUcastPkts;
    DWORD    dwInDiscards;
    DWORD    dwInErrors;
    DWORD    dwInUnknownProtos;
    DWORD    dwOutOctets;
    DWORD    dwOutUcastPkts;
    DWORD    dwOutNUcastPkts;
    DWORD    dwOutDiscards;
    DWORD    dwOutErrors;
    DWORD    dwOutQLen;
    DWORD    dwDescrLen;
    BYTE    bDescr[MAXLEN_IFDESCR];          // インタフェース名
} MIB_IFROW,*PMIB_IFROW;


GetAdaptersInfo() を使う方法。
ネットワークアダプタ情報の取得(GetAdaptersInfo)
同じく iphlpapi.h を include して iphlpapi.lib をリンクする。非アクティブNICもOK。ループバックインタフェースは含まれない。
以下、構造体定義。iptypes.h より。
typedef struct _IP_ADAPTER_INFO {
    struct _IP_ADAPTER_INFO* Next;                        // 次の構造体定義へのポインタ
    DWORD ComboIndex;
    char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
    char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]; // インタフェース名
    UINT AddressLength;
    BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];             // MAC
    DWORD Index;
    UINT Type;
    UINT DhcpEnabled;
    PIP_ADDR_STRING CurrentIpAddress;                     // IPアドレスっぽいけど取れなかった
    IP_ADDR_STRING IpAddressList;                         // こっちにIPアドレスが入った
    IP_ADDR_STRING GatewayList;
    IP_ADDR_STRING DhcpServer;
    BOOL HaveWins;
    IP_ADDR_STRING PrimaryWinsServer;
    IP_ADDR_STRING SecondaryWinsServer;
    time_t LeaseObtained;
    time_t LeaseExpires;
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
最後のデータのNextはNULL


How do I get the MAC (a.k.a. hardware) address of the local Ethernet adapter? 4.7 の方法はよくわからんかった。second methodのExamples: Get MAC Address, RPC Methodだと、実行するたびに値が異なる…なんでや…
まぁ、GetIfTable() を使った方法でよさそうかな。
ipconfig /all の結果から抽出するのが最も楽なんだけど…(笑)
前のエントリ: 髪 x 服 x カルボナーラ [diary]
次のエントリ: GD::Barcode::NW7でバーコード作成 [perl]

2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2013-05-02 16:12