基于MFC+WinpCap构造ARP请求发送包

  1. 构造数据包格式

    //14字节以太网首部
    struct EthernetHeader
    {
        u_char DestMAC[6];    //目的MAC地址 6字节
        u_char SourMAC[6];   //源MAC地址 6字节
        u_short EthType;         //上一层协议类型,如0x0800代表上一层是IP协议,0x0806为arp  2字节
    };
    //28字节ARP帧结构
    struct ArpHeader
    {
        unsigned short hdType;   //硬件类型
        unsigned short proType;   //协议类型
        unsigned char hdSize;   //硬件地址长度
        unsigned char proSize;   //协议地址长度
        unsigned short op;   //操作类型,ARP请求(1),ARP应答(2),RARP请求(3),RARP应答(4)。
        u_char smac[6];   //源MAC地址
        u_char sip[4];   //源IP地址
        u_char dmac[6];   //目的MAC地址
        u_char dip[4];   //目的IP地址
    };
    //定义整个arp报文包,总长度42字节
    struct ArpPacket {
        EthernetHeader ed;
        ArpHeader ah;
    };
  2. MFC界面如下
    基于MFC+WinpCap构造ARP请求发送包_第1张图片

  3. 程序步骤

1.在MFC初始化的时候获得机器的网卡列表并打印出来,并选择一些初始化的设置

/* 获取本机设备列表 */
    if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
    {
        m_comboNic.AddString(_T("Error in pcap_findalldevs!"));
        exit(1);
    }

    /* 打印列表 */
    for (d = alldevs; d; d = d->next)
    {
        ++i;
        if (d->description)
            m_comboNic.AddString(LPCTSTR(CString(d->name)));
        else
            m_comboNic.AddString(_T("(No description available)"));
    }

    if (i == 0)
    {
        m_comboNic.AddString(_T("No interfaces found! Make sure WinPcap is installed."));
        return -1;
    }
    // 默认选择第一项
    m_comboNic.SetCurSel(0);
    //目的MAC地址编辑框中默认显示"00-00-00-00-00-00"
    SetDlgItemText(IDC_EDIT1, _T("00-00-00-00-00-00"));
 2,获得选择的网卡并打开网卡设备
inum = m_comboNic.GetCurSel();
    /* 跳转到选中的适配器 */
    for (d = alldevs, i = 0; i<= inum - 1; d = d->next, i++);
    /* 打开设备 */
    if ((adhandle = pcap_open(d->name,          // 设备名
        65536,            // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
        PCAP_OPENFLAG_PROMISCUOUS,    // 混杂模式
        1000,             // 读取超时时间
        NULL,             // 远程机器验证
        errbuf            // 错误缓冲池
        )) == NULL)
    {
        m_editResult.SetWindowText(_T("Unable to open the adapter. \rIt is not supported by WinPcap"));
        /* 释放设备列表 */
        pcap_freealldevs(alldevs);
        exit(-1);
    }

3.构造ARP数据包

4.发送数据包

if (pcap_sendpacket(adhandle, sendbuf, 42) == 0) {
        m_editResult.SetWindowText(_T("\nPacketSend succeed\n"));
    }
    else {
        m_editResult.SetWindowText(_T("\nPacketSendPacket in getmine Error\n"));
    }
  1. 利用Ethereal抓包验证发送是否成功
    基于MFC+WinpCap构造ARP请求发送包_第2张图片

标亮的是刚刚构造的数据包,说明ARP请求数据包构造完毕。

你可能感兴趣的:(C++学习之路,网络编程)