有会winpcap的吗
#include "stdafx.h"
#include <packet32.h>
#include <string.h>
#include <wchar.h>
#include <winbase.h>
#include <stdio.h>
typedef struct tagDLCHeader
{
unsigned char DesMAC[6]; /* destination HW addrress */
unsigned char SrcMAC[6]; /* source HW addresss */
unsigned short Ethertype; /* ethernet type */
} DLCHEADER, *PDLCHEADER;
typedef struct tagARPFrame
{
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 long Send_Prot_Addr; /* sender protocol address */
unsigned char Targ_HW_Addr[6]; /* target hardware address */
unsigned long Targ_Prot_Addr; /* target protocol address */
unsigned char padding[18];
} ARPFRAME, *PARPFRAME;
// ARP Packet = DLC header + ARP Frame
typedef struct tagARPPacket
{
DLCHEADER dlcHeader;
ARPFRAME arpFrame;
} ARPPACKET, *PARPPACKET;
void formatStrToMAC(const char *lpstr, unsigned char *HWAddr)
{
unsigned int i, index = 0, value, temp;
unsigned char c;
for (i = 0;i<12;i++)
{
c = *(lpstr+i);
if ((c>='0' && c<='9')||(c>='a'&&c<='f'))
{
if (c>='0'&&c<='9') temp = c - '0'; // 数字
if (c>='a'&&c<='f') temp = c - 'a' + 10; // 字母
if ( (index % 2) == 1 )
{
value = value*10 + temp;
HWAddr[index/2] = value;
}
else value = temp;
index++;
} if (index == 12) break;
}
}
void SendArpPacket(ARPPACKET& ARPPacket)
{
LPADAPTER LpAdapter;
LPPACKET LpPacket;
//根据网卡名打开网卡,网卡名没错
LpAdapter=PacketOpenAdapter("\\Device\\NPF_{B9B76045_55DF_4588_80D5_EA462207108C}");
LpPacket=PacketAllocatePacket();
PacketInitPacket(LpPacket,&ARPPacket,sizeof(ARPPACKET));
PacketSetNumWrites(LpAdapter,5);
PacketSendPacket(LpAdapter,LpPacket,true);
PacketFreePacket(LpPacket);
PacketCloseAdapter(LpAdapter);
}
int main(int argc,char* argv[])
{
ARPPACKET ARPPacket;// 定义ARPPACKET结构体变量
memset(&ARPPacket,0,sizeof(ARPPACKET)); // 数据包初始化
formatStrToMAC("50634c6c0333",ARPPacket.dlcHeader.SrcMAC); // DLC帧头
formatStrToMAC("5063ffa866cd",ARPPacket.dlcHeader.DesMAC);
formatStrToMAC("212121212121",ARPPacket.arpFrame.Send_HW_Addr); // 源MAC
ARPPacket.arpFrame.Send_Prot_Addr = inet_addr("211.87.228.1"); // 源IP
formatStrToMAC("5063ffa866cd",ARPPacket.arpFrame.Targ_HW_Addr); // 目的MAC
ARPPacket.arpFrame.Targ_Prot_Addr = inet_addr("211.87.228.101");// 目的IP
// 自动填充变量
ARPPacket.arpFrame.Opcode = htons((unsigned short)2); // arp包类型
ARPPacket.dlcHeader.Ethertype = htons((unsigned short)0x0806); // DLC Header的以太网类型
ARPPacket.arpFrame.HW_Type = htons((unsigned short)1); // 硬件类型
ARPPacket.arpFrame.Prot_Type = htons((unsigned short)0x0800); // 上层协议类型
ARPPacket.arpFrame.HW_Addr_Len = (unsigned char)6; // MAC地址长度
ARPPacket.arpFrame.Prot_Addr_Len = (unsigned char)4;
SendArpPacket(ARPPacket);
return 0;
}
运行时出现异常"Unhandled exception in cba.exe(WANPACKET.DLL):0xC0000005: Access Violation",请真正做过的高手指点迷津