只会第一个
#include "stdafx.h"
#include <Windows.h>
#include <iphlpapi.h>#pragma comment(lib,"iphlpapi.lib")int _tmain(int argc, _TCHAR* argv[])
{
 IP_ADAPTER_INFO adapter[5];  //Maximum 5 adapters DWORD buflen=sizeof(adapter); DWORD status=GetAdaptersInfo(adapter,&buflen);
 
 BYTE s[8]; if(status==ERROR_SUCCESS)
 {  PIP_ADAPTER_INFO painfo=adapter;
  memcpy(s,painfo->Address,6);
  printf("Physical Address:%02X-%02X-%02X-%02X-%02X-%02X\n",s[0],s[1],s[2],s[3],s[4],s[5]);
  return TRUE;
 } 

解决方案 »

  1.   

    后面三个问题,看
    TCP/IP详解 .
      

  2.   

    正巧我刚做好一个ARP的玩意,学校也是ARP狂多供参考#include <afxwin.h>
    #include "global.h"
    #include"include/pcap.h"#pragma pack(push)
    #pragma pack(1)typedef struct tagARPFrame                      
    {
        u_char8 DestMAC[6];
    u_char8 SourMAC[6];
    u_char8 EthType[2];
    unsigned short         HW_Type;           /* hardware address */
        unsigned short         Prot_Type;             /* protocol address */
        unsigned char      HW_Addr_Len;       /* length of hardware address */
        unsigned char      Prot_Addr_Len;         /* length of protocol address */
        unsigned short         Opcode;                /* ARP/RARP */
     
        unsigned char      Send_HW_Addr[6];     /* sender hardware address */
        unsigned char      Send_Prot_Addr[4];      /* sender protocol address */
        unsigned char      Targ_HW_Addr[6];     /* target hardware address */
        unsigned char      Targ_Prot_Addr[4];      /* target protocol address */
        unsigned char      padding[18];
    } ARPPACKET, *PARPPACKET;
    #pragma pack(pop)class CSendARP
    {
    public:
    CSendARP(const HWND hDlg);
    ~CSendARP(void);
    BOOL Start();
    void Init(const USERDATA* pUserData);
    void Close();
    private:
    const USERDATA* m_pData;
    pcap_t* m_fp;
    pcap_t* m_fp2;

    bool SendARP_Multiple(ARPPACKET & packet,int ip3);
    bool OpenAdapter();
    friend UINT WorkProc_Send(LPVOID lpParam);
    friend UINT WorkProc_Recv(LPVOID lpParam);

    protected:
    HWND m_hDlg;
    CWinThread* Thread_Send;
    CWinThread* Thread_Recv;
    int Continue;
    int nCount;
    UCHAR mac[6];
    int d_ip3;
    int __i;

    };//////////////////////////////////////////////
      

  3.   


    #include "StdAfx.h"
    #include "SendARP.h"
    #include "resource.h"CSendARP::CSendARP(const HWND hDlg) : m_hDlg(hDlg)
    {
    m_fp=NULL;
    m_fp2=NULL;
    }CSendARP::~CSendARP(void)
    {}bool CSendARP::OpenAdapter()
    {
    bpf_u_int32 netmask = 0;              
    char pcap_filter[100];              //filter space
    struct bpf_program pcap_fp;         //hold the compiled filter.
    char errbuf[PCAP_ERRBUF_SIZE] = "";
    //打开网卡
    char* str=new char[sizeof(m_pData->nic)+sizeof("\\Device\\NPF_")];
    strcpy(str,"\\Device\\NPF_");
    strcat(str,m_pData->nic);

    if(!(m_fp = pcap_open_live(str,// name of the device
    256, // portion of the packet to capture, max 65536
    0, // promiscuous mode closed
    10, // read timeout
    errbuf))) // error buffer
    {
    ::SendMessage(m_hDlg, IDC_LIST_MSG, -1, (long)errbuf);
    delete[] str;
    return false;
    }
    //设置过滤器
    delete[] str;
    sprintf_s(pcap_filter, "ether dst %x:%x:%x:%x:%x:%x and ether proto 0x0806",
          m_pData->mac[0],m_pData->mac[1],m_pData->mac[2],
      m_pData->mac[3],m_pData->mac[4],m_pData->mac[5]); if (pcap_compile(m_fp, &pcap_fp, pcap_filter, 0, netmask) == -1)
    return false; if (pcap_setfilter(m_fp, &pcap_fp) == -1)
    return false;

    return true;
    }bool CSendARP::SendARP_Multiple(ARPPACKET & packet,int ip3)
    {
    packet.Targ_Prot_Addr[3]=ip3;
    if(!pcap_sendpacket(m_fp, (UCHAR*)&packet, 60))
    {
    return false;
    }
    return true;
    }UINT WorkProc_Send(LPVOID lpParam)
    {
    CSendARP* pTalk=(CSendARP*)lpParam;
    ARPPACKET packet; memset(&packet.DestMAC,0xff,6);
    memcpy(&packet.SourMAC,pTalk->m_pData->mac,6);
    packet.EthType[0]=0x08;
    packet.EthType[1]=0x06;
    packet.HW_Type=htons(1);
    packet.Prot_Type=htons(0x0800);
    packet.HW_Addr_Len=0x06;
    packet.Prot_Addr_Len=0x04;
    packet.Opcode=htons(1);
    memcpy(&packet.Send_HW_Addr,pTalk->m_pData->mac,6);
    memcpy(&packet.Send_Prot_Addr,pTalk->m_pData->ip,4);
    memset(&packet.Targ_HW_Addr,0,6);
    memcpy(&packet.Targ_Prot_Addr,pTalk->m_pData->ip,4);

    memset(&packet.padding,0,18); for(pTalk->__i=1;pTalk->__i<255;pTalk->__i++)
    {
    if(pTalk->__i != pTalk->m_pData->ip[3] && 
    ((pTalk->m_pData->ip[3] & pTalk->m_pData->Mask[3]) 
    == (pTalk->__i & pTalk->m_pData->Mask[3]))) pTalk->SendARP_Multiple(packet,pTalk->__i);
    Sleep(20);
    }
    return 0;
    }UINT WorkProc_Recv(LPVOID lpParam)
    {

    CSendARP* pTalk=(CSendARP*)lpParam;
    pTalk->nCount=1;
    pTalk->Continue=1;
    struct pcap_pkthdr *header;
    const u_char *pkt_data;
    int res;
    DWORD dwTick, dwOldTick;
    dwTick = dwOldTick = ::GetTickCount();
    while(((res = pcap_next_ex( pTalk->m_fp, &header, &pkt_data)) >= 0) && pTalk->Continue)
    {
    if(res==0)
    {
    dwTick = ::GetTickCount();
    if( pTalk->__i==255 && dwTick - dwOldTick > 3000)
    break;   //超时了,说明没有回应了
    }
    if(res>0)
    {
    dwTick = dwOldTick = ::GetTickCount();
    PARPPACKET pbuf = (PARPPACKET)pkt_data;
    CString str;
    pTalk->nCount++;
    ::PostMessage(pTalk->m_hDlg,WM_MY_MSG1,2,(LPARAM)pbuf);
    }
    }
    ::SendMessage(pTalk->m_hDlg,WM_MY_MSG1,3,NULL);
    return 0;
    }void CSendARP::Init(const USERDATA* pUserData)
    {
    m_pData=pUserData;
    }BOOL CSendARP::Start()
    {
    if(OpenAdapter())
    { Thread_Recv=AfxBeginThread(WorkProc_Recv,this);
    Thread_Send=AfxBeginThread(WorkProc_Send,this);
    return TRUE;
    }
    return FALSE;
    }

    void CSendARP::Close()
    {
    Continue=0;
    if(m_fp != NULL) 
    pcap_close(m_fp); //关闭网卡
    CString str;
    str.Format("网段内当前共有活动主机%d台!",nCount);
    ::SendDlgItemMessage(m_hDlg,IDC_MSG_HOST,WM_SETTEXT,0,(LPARAM)(LPCTSTR)str);
    }
    #include <afxwin.h>
    #include "global.h"
    #include"include/pcap.h"#pragma pack(push)
    #pragma pack(1)typedef struct tagARPFrame                      
    {
        u_char8 DestMAC[6];
    u_char8 SourMAC[6];
    u_char8 EthType[2];
    unsigned short         HW_Type;           /* hardware address */
        unsigned short         Prot_Type;             /* protocol address */
        unsigned char      HW_Addr_Len;       /* length of hardware address */
        unsigned char      Prot_Addr_Len;         /* length of protocol address */
        unsigned short         Opcode;                /* ARP/RARP */
     
        unsigned char      Send_HW_Addr[6];     /* sender hardware address */
        unsigned char      Send_Prot_Addr[4];      /* sender protocol address */
        unsigned char      Targ_HW_Addr[6];     /* target hardware address */
        unsigned char      Targ_Prot_Addr[4];      /* target protocol address */
        unsigned char      padding[18];
    } ARPPACKET, *PARPPACKET;
    #pragma pack(pop)class CSendARP
    {
    public:
    CSendARP(const HWND hDlg);
    ~CSendARP(void);
    BOOL Start();
    void Init(const USERDATA* pUserData);
    void Close();
    private:
    const USERDATA* m_pData;
    pcap_t* m_fp;
    pcap_t* m_fp2;

    bool SendARP_Multiple(ARPPACKET & packet,int ip3);
    bool OpenAdapter();
    friend UINT WorkProc_Send(LPVOID lpParam);
    friend UINT WorkProc_Recv(LPVOID lpParam);

    protected:
    HWND m_hDlg;
    CWinThread* Thread_Send;
    CWinThread* Thread_Recv;
    int Continue;
    int nCount;
    UCHAR mac[6];
    int d_ip3;
    int __i;

    };//////////////////////////////////////////////#include "StdAfx.h"
    #include "SendARP.h"
    #include "resource.h"CSendARP::CSendARP(const HWND hDlg) : m_hDlg(hDlg)
    {
    m_fp=NULL;
    m_fp2=NULL;
    }CSendARP::~CSendARP(void)
    {}bool CSendARP::OpenAdapter()
    {
    bpf_u_int32 netmask = 0;              
    char pcap_filter[100];              //filter space
    struct bpf_program pcap_fp;         //hold the compiled filter.
    char errbuf[PCAP_ERRBUF_SIZE] = "";
    //打开网卡
    char* str=new char[sizeof(m_pData->nic)+sizeof("\\Device\\NPF_")];
    strcpy(str,"\\Device\\NPF_");
    strcat(str,m_pData->nic);

    if(!(m_fp = pcap_open_live(str,// name of the device
    256, // portion of the packet to capture, max 65536
    0, // promiscuous mode closed
    10, // read timeout
    errbuf))) // error buffer
    {
    ::SendMessage(m_hDlg, IDC_LIST_MSG, -1, (long)errbuf);
    delete[] str;
    return false;
    }
    //设置过滤器
    delete[] str;
    sprintf_s(pcap_filter, "ether dst %x:%x:%x:%x:%x:%x and ether proto 0x0806",
          m_pData->mac[0],m_pData->mac[1],m_pData->mac[2],
      m_pData->mac[3],m_pData->mac[4],m_pData->mac[5]); if (pcap_compile(m_fp, &pcap_fp, pcap_filter, 0, netmask) == -1)
    return false; if (pcap_setfilter(m_fp, &pcap_fp) == -1)
    return false;

    return true;
    }
      

  4.   


    bool CSendARP::SendARP_Multiple(ARPPACKET & packet,int ip3)
    {
    packet.Targ_Prot_Addr[3]=ip3;
    if(!pcap_sendpacket(m_fp, (UCHAR*)&packet, 60))
    {
    return false;
    }
    return true;
    }UINT WorkProc_Send(LPVOID lpParam)
    {
    CSendARP* pTalk=(CSendARP*)lpParam;
    ARPPACKET packet; memset(&packet.DestMAC,0xff,6);
    memcpy(&packet.SourMAC,pTalk->m_pData->mac,6);
    packet.EthType[0]=0x08;
    packet.EthType[1]=0x06;
    packet.HW_Type=htons(1);
    packet.Prot_Type=htons(0x0800);
    packet.HW_Addr_Len=0x06;
    packet.Prot_Addr_Len=0x04;
    packet.Opcode=htons(1);
    memcpy(&packet.Send_HW_Addr,pTalk->m_pData->mac,6);
    memcpy(&packet.Send_Prot_Addr,pTalk->m_pData->ip,4);
    memset(&packet.Targ_HW_Addr,0,6);
    memcpy(&packet.Targ_Prot_Addr,pTalk->m_pData->ip,4);

    memset(&packet.padding,0,18); for(pTalk->__i=1;pTalk->__i<255;pTalk->__i++)
    {
    if(pTalk->__i != pTalk->m_pData->ip[3] && 
    ((pTalk->m_pData->ip[3] & pTalk->m_pData->Mask[3]) 
    == (pTalk->__i & pTalk->m_pData->Mask[3]))) pTalk->SendARP_Multiple(packet,pTalk->__i);
    Sleep(20);
    }
    return 0;
    }UINT WorkProc_Recv(LPVOID lpParam)
    {

    CSendARP* pTalk=(CSendARP*)lpParam;
    pTalk->nCount=1;
    pTalk->Continue=1;
    struct pcap_pkthdr *header;
    const u_char *pkt_data;
    int res;
    DWORD dwTick, dwOldTick;
    dwTick = dwOldTick = ::GetTickCount();
    while(((res = pcap_next_ex( pTalk->m_fp, &header, &pkt_data)) >= 0) && pTalk->Continue)
    {
    if(res==0)
    {
    dwTick = ::GetTickCount();
    if( pTalk->__i==255 && dwTick - dwOldTick > 3000)
    break;   //超时了,说明没有回应了
    }
    if(res>0)
    {
    dwTick = dwOldTick = ::GetTickCount();
    PARPPACKET pbuf = (PARPPACKET)pkt_data;
    CString str;
    pTalk->nCount++;
    ::PostMessage(pTalk->m_hDlg,WM_MY_MSG1,2,(LPARAM)pbuf);
    }
    }
    ::SendMessage(pTalk->m_hDlg,WM_MY_MSG1,3,NULL);
    return 0;
    }void CSendARP::Init(const USERDATA* pUserData)
    {
    m_pData=pUserData;
    }BOOL CSendARP::Start()
    {
    if(OpenAdapter())
    { Thread_Recv=AfxBeginThread(WorkProc_Recv,this);
    Thread_Send=AfxBeginThread(WorkProc_Send,this);
    return TRUE;
    }
    return FALSE;
    }

    void CSendARP::Close()
    {
    Continue=0;
    if(m_fp != NULL) 
    pcap_close(m_fp); //关闭网卡
    CString str;
    str.Format("网段内当前共有活动主机%d台!",nCount);
    ::SendDlgItemMessage(m_hDlg,IDC_MSG_HOST,WM_SETTEXT,0,(LPARAM)(LPCTSTR)str);
    }
      

  5.   

    解析LRESULT CDlgArp::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    { if(message == WM_MY_MSG1 )
    {
    switch((int)wParam)
    {

    case 2:
    PARPPACKET pbuf = (PARPPACKET)(LPVOID)lParam;
    CString str1,str2;
    str1.Format("%d.%d.%d.%d",pbuf->Send_Prot_Addr[0],
    pbuf->Send_Prot_Addr[1],
    pbuf->Send_Prot_Addr[2],
    pbuf->Send_Prot_Addr[3]);
    str2.Format("%02X-%02X-%02X-%02X-%02X-%02X", pbuf->Send_HW_Addr[0],
    pbuf->Send_HW_Addr[1],
    pbuf->Send_HW_Addr[2],
    pbuf->Send_HW_Addr[3],
    pbuf->Send_HW_Addr[4],
    pbuf->Send_HW_Addr[5]); m_ListCtrl.InsertItem(count,str1);
    m_ListCtrl.SetItemText(count,1,str2);
    count++;
    break; }
    }
    return CDialog::WindowProc(message, wParam, lParam);
    }
      

  6.   

    取MAC:
              
        ncb   ncb;     
        uchar   uretcode;   
        int   num   =   0;   
        lana_enum   lana_enum;     
        memset(&ncb,   0,   sizeof(ncb)   );     
        ncb.ncb_command   =   ncbenum;     
        ncb.ncb_buffer   =   (unsigned   char   *)&lana_enum;     
        ncb.ncb_length   =   sizeof(lana_enum);     
        //向网卡发送ncbenum命令,以获取当前机器的网卡信息,如有多少个网卡   
        //每张网卡的编号等     
        uretcode   =   netbios(&ncb);   
        if   (uretcode   ==   0)     
        {   
          num   =   lana_enum.length;   
      //对每一张网卡,以其网卡编号为输入编号,获取其mac地址     
          for   (int   i   =   0;   i   <   num;   i++)   
          {   
            astat   adapter;   
            if(getaddressbyindex(lana_enum.lana[i],adapter)   ==   0)   
            {   
              pmacaddr[i].b1   =   adapter.adapt.adapter_address[0];   
              pmacaddr[i].b2   =   adapter.adapt.adapter_address[1];   
              pmacaddr[i].b3   =   adapter.adapt.adapter_address[2];   
              pmacaddr[i].b4   =   adapter.adapt.adapter_address[3];   
              pmacaddr[i].b5   =   adapter.adapt.adapter_address[4];   
              pmacaddr[i].b6   =   adapter.adapt.adapter_address[5];   
            }   
          }   
        }