IPアドレスからMACアドレスを取得するには?

解決


どら  2004-11-12 22:39:35  No: 55127

毎度毎度すみません。

IPアドレスからMACアドレスを取得する方法を探しています。
今は、sbtstatをコマンドプロンプトから実行し、そこで一時ファイルを保存
    →データを読み込んで、必要な値だけを文字列に変換

といった手順で構築しています。

せっかくなのでAPI関数を使ってできないものかと・・・
何かよい方法を御存知な方はいらっしゃいませんか?

宜しくお願いします・・・


かな  2004-11-12 23:58:36  No: 55128

GetIpNetTable API
かな?


どら  2004-11-18 19:48:55  No: 55129

すみません・・・IPアドレスからだと、ネットワークに接続されていないIPのMACは取得できないですよね?
ローカルマシンのMACアドレスを取得するには、どうしたらいいのでしょう?
     の間違いでした・・・。


かな  2004-11-18 20:03:01  No: 55130

GetIfTable
ではどうでしょう

こんなかんじ
http://www.dinop.com/vc/getmac_iphlpapi2.html


どら  2004-11-19 04:26:03  No: 55131

かなさん

ありがとうございました☆

こ〜んな感じで作ってみました。

int GetMACAddressDora(char *MACAddress, int Count);

int main()
{
  char MACAddress[64];
  GetMACAddressDora(MACAddress, 1);
  printf("%s", MACAddress);

}

//MACアドレスを取得
int GetMACAddressDora(char *MACAddress, int Count)
{
  DWORD d = 0;
  char Buf[1024];
 
  //第1パラメータにNULLをおいて、必要サイズを DWORD d に取得する
  GetIfTable( NULL , &d, FALSE );

  //MIB_IFADDRTABLEへのポインタに、必要サイズを確保する
  PMIB_IFTABLE IfTable = (PMIB_IFTABLE)new char[d] ;

    if( IfTable )
  {
    //アドレステーブルの取得
    if( GetIfTable( (PMIB_IFTABLE)IfTable,&d,FALSE) == NO_ERROR )
    {
      //取得したテーブル数は、dwNumEntriesで分かる
      for(int i=0;i< (int)IfTable->dwNumEntries;i++ )
      {
        if(i+1 == Count)
        {
          //MACを表示
          wsprintf(Buf,"%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x" ,(unsigned char)IfTable->table[i].bPhysAddr[0] ,(unsigned char)IfTable->table[i].bPhysAddr[1] ,(unsigned char)IfTable->table[i].bPhysAddr[2], (unsigned char)IfTable->table[i].bPhysAddr[3], (unsigned char)IfTable->table[i].bPhysAddr[4], (unsigned char)IfTable->table[i].bPhysAddr[5]);
          strcpy(MACAddress, Buf);

          //MIB_IFADDRTABLEへのポインタに、確保したメモリを解放する
          delete [] IfTable;
          
          //成功したら0を返す
          return 0;
        }
      }
    }
    else
    {
      //エラーが発生したときは1を返す
      //MIB_IFADDRTABLEへのポインタに、確保したメモリを解放する
      delete [] IfTable;
      return 1;
    }

    //MIB_IFADDRTABLEへのポインタに、確保したメモリを解放する
    delete [] IfTable;
  }
  //最後まできてしまったら、MACをみたいNICの枚数が多すぎ。この時は2を返す
  return 2;
}

一部省略ですが、こんな感じで。
まだ試していないですが、複数NICがあったときに、いったんこの関数を使ってカウントし、そのうちの指定した番号のMACが取れたらいいな〜って感じで作っています。

現状では、まだNIC1枚挿しでしか試していませんが・・・
これからデバッグでっす☆

本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加