如何用vc++取得网卡的物理地址?

解决方案 »

  1.   

    我想需要对底层协议如arp了解一些,应该对网络原理了解一些。
      

  2.   

    try SendArp, or you can get it from NetBIOS
    // Note: Win2000 only
    //   NOT NT 4.0, Win9x, WinME#pragma comment( lib, "Iphlpapi" )
    #pragma comment( lib, "Ws2_32" )#include <windows.h>
    #include <Iphlpapi.h>int main( ) {IPAddr ip = 0;
    ULONG  mac = 0;
    DWORD  error = 0;    DWORD dwSize = sizeof( ULONG) ;
        ip = inet_addr("192.168.0.100");
        //ip = inet_addr("xxx.xxx.xxx.xxx");
        error = SendARP(ip,0,&mac,&dwSize);    return 0;
    }
      

  3.   

    athere_08(于斯) 
    有什么好的建义
      

  4.   

    其实,我现在才学计算机网络,我看过网络中嗅探程序的原理,即修改mac网卡地址,我今天又看到说注册表中有mac地址,具体的查到了告诉你。
      

  5.   

    vc中应该有这样的函数来获得mac地址,到MSDN搜一下
      

  6.   

    netbios方法如下:bool GetAdapterInfo(int nAdapterNum, string & sMAC)
    {
        // Reset the LAN adapter so that we can begin querying it 
        NCB Ncb;
        memset(&Ncb, 0, sizeof(Ncb));
        Ncb.ncb_command = NCBRESET;
        Ncb.ncb_lana_num = nAdapterNum;
        if (Netbios(&Ncb) != NRC_GOODRET) {
            char acTemp[80];
            ostrstream outs(acTemp, sizeof(acTemp));
            outs << "error " << Ncb.ncb_retcode << " on reset" << ends;
            sMAC = acTemp;
            return false;
        }
        
        // Prepare to get the adapter status block 
        memset(&Ncb, 0, sizeof(Ncb));
        Ncb.ncb_command = NCBASTAT;
        Ncb.ncb_lana_num = nAdapterNum;
        strcpy((char *) Ncb.ncb_callname, "*");
        struct ASTAT {
            ADAPTER_STATUS adapt;
            NAME_BUFFER NameBuff[30];
        } Adapter;
        memset(&Adapter, 0, sizeof(Adapter));
        Ncb.ncb_buffer = (unsigned char *)&Adapter;
        Ncb.ncb_length = sizeof(Adapter);
        
        // Get the adapter's info and, if this works, return it in standard,
        // colon-delimited form.
        if (Netbios(&Ncb) == 0) {
            char acMAC[18];
            sprintf(acMAC, "%02X:%02X:%02X:%02X:%02X:%02X",
                    int (Adapter.adapt.adapter_address[0]),
                    int (Adapter.adapt.adapter_address[1]),
                    int (Adapter.adapt.adapter_address[2]),
                    int (Adapter.adapt.adapter_address[3]),
                    int (Adapter.adapt.adapter_address[4]),
                    int (Adapter.adapt.adapter_address[5]));
            sMAC = acMAC;
            return true;
        }
        else {
            char acTemp[80];
            ostrstream outs(acTemp, sizeof(acTemp));
            outs << "error " << Ncb.ncb_retcode << " on ASTAT" << ends;
            sMAC = acTemp;
            return false;
        }
    }int main()
    {
        // Get adapter list
        LANA_ENUM AdapterList;
        NCB Ncb;
        memset(&Ncb, 0, sizeof(NCB));
        Ncb.ncb_command = NCBENUM;
        Ncb.ncb_buffer = (unsigned char *)&AdapterList;
        Ncb.ncb_length = sizeof(AdapterList);
        Netbios(&Ncb);    // Get all of the local ethernet addresses
        string sMAC;
        for (int i = 0; i < AdapterList.length; ++i) {
            if (GetAdapterInfo(AdapterList.lana[i], sMAC)) {
                cout << "Adapter " << int (AdapterList.lana[i]) <<
                        "'s MAC is " << sMAC << endl;
            }
            else {
                cerr << "Failed to get MAC address! Do you" << endl;
                cerr << "have the NetBIOS protocol installed?" << endl;
                break;
            }
        }    return 0;
    }