这是从网上找到的一段代码 稍作修改 编译通过了 但是我用iris查看 没有发现发出去 不知道为什么.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;// ARP Frame
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;.CPP
#include "packet32.h"
#include "ntddndis.h"
#pragma comment(lib, "wpcap.lib")
#pragma comment(lib, "Packet.lib")
#pragma comment(lib, "ws2_32.lib")ARPPACKET ARPPacket;
char arpType;
void formatStrToMAC(const LPSTR lpHWAddrStr, unsigned char *HWAddr)
{
unsigned int i, index = 0, value, temp;
unsigned char c;
_strlwr(lpHWAddrStr); // 转换成小写
for (i = 0; i < strlen(lpHWAddrStr); i++)
{
c = *(lpHWAddrStr + 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' + 0xa; // 字母
if ( (index % 2) == 1 )
{
value = value*0x10 + temp;
HWAddr[index/2] = value;
}
else value = temp;
index++;
}
if (index == 12) break;
}
}
void CWinpcap2Dlg::OnButton1()
{
SetTimer(1,500,NULL);
}
void CWinpcap2Dlg::OnTimer(UINT nIDEvent)
{
LPTSTR srcIP="192.168.0.1";
LPTSTR desIP="192.168.0.2";
arpType=2;//1为请求2为应答 我要应答
memset(&ARPPacket, 0, sizeof(ARPPACKET)); // 数据包初始化
formatStrToMAC("aaaaaaaaaaaa",ARPPacket.dlcHeader.SrcMAC);//DLC帧头
formatStrToMAC("bbbbbbbbbbbb",ARPPacket.dlcHeader.DesMAC);
formatStrToMAC("aaaaaaaaaaaa",ARPPacket.arpFrame.Send_HW_Addr); // 源MAC
ARPPacket.arpFrame.Send_Prot_Addr = inet_addr(srcIP); // 源IP
formatStrToMAC("bbbbbbbbbbbb",ARPPacket.arpFrame.Targ_HW_Addr); // 目的MAC
ARPPacket.arpFrame.Targ_Prot_Addr = inet_addr(desIP); // 目的IP
ARPPacket.arpFrame.Opcode = htons((unsigned short)arpType); // 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();
CDialog::OnTimer(nIDEvent);
}void CWinpcap2Dlg::SendARPPacket()
{
// char *AdapterDeviceName =GetCurAdapterName(); // 首先获得获得网卡名字
char pStr[8192];
ULONG adapterlength;
BOOLEAN bb=PacketGetAdapterNames((char *)pStr,&adapterlength);
_ADAPTER * lpAdapter = PacketOpenAdapter(pStr/*AdapterDeviceName*/); // 根据网卡名字打开网卡
LPPACKET lpPacket = PacketAllocatePacket(); // 给PACKET结构指针分配内存
PacketInitPacket(lpPacket, &ARPPacket, sizeof(ARPPacket)); //初始化PACKET结构指针
// 其中的ARPPacket就是我们先前填充的ARP包
PacketSetNumWrites(lpAdapter, 1); // 每次只发送一个包
PacketSendPacket(lpAdapter, lpPacket, true); // Send !!!!! ^_^
PacketFreePacket(lpPacket); // 释放资源
PacketCloseAdapter(lpAdapter);
}
typedef struct tagDLCHeader
{
unsigned char DesMAC[6]; /* destination HW addrress */
unsigned char SrcMAC[6]; /* source HW addresss */
unsigned short Ethertype; /* ethernet type */
} DLCHEADER, *PDLCHEADER;// ARP Frame
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;.CPP
#include "packet32.h"
#include "ntddndis.h"
#pragma comment(lib, "wpcap.lib")
#pragma comment(lib, "Packet.lib")
#pragma comment(lib, "ws2_32.lib")ARPPACKET ARPPacket;
char arpType;
void formatStrToMAC(const LPSTR lpHWAddrStr, unsigned char *HWAddr)
{
unsigned int i, index = 0, value, temp;
unsigned char c;
_strlwr(lpHWAddrStr); // 转换成小写
for (i = 0; i < strlen(lpHWAddrStr); i++)
{
c = *(lpHWAddrStr + 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' + 0xa; // 字母
if ( (index % 2) == 1 )
{
value = value*0x10 + temp;
HWAddr[index/2] = value;
}
else value = temp;
index++;
}
if (index == 12) break;
}
}
void CWinpcap2Dlg::OnButton1()
{
SetTimer(1,500,NULL);
}
void CWinpcap2Dlg::OnTimer(UINT nIDEvent)
{
LPTSTR srcIP="192.168.0.1";
LPTSTR desIP="192.168.0.2";
arpType=2;//1为请求2为应答 我要应答
memset(&ARPPacket, 0, sizeof(ARPPACKET)); // 数据包初始化
formatStrToMAC("aaaaaaaaaaaa",ARPPacket.dlcHeader.SrcMAC);//DLC帧头
formatStrToMAC("bbbbbbbbbbbb",ARPPacket.dlcHeader.DesMAC);
formatStrToMAC("aaaaaaaaaaaa",ARPPacket.arpFrame.Send_HW_Addr); // 源MAC
ARPPacket.arpFrame.Send_Prot_Addr = inet_addr(srcIP); // 源IP
formatStrToMAC("bbbbbbbbbbbb",ARPPacket.arpFrame.Targ_HW_Addr); // 目的MAC
ARPPacket.arpFrame.Targ_Prot_Addr = inet_addr(desIP); // 目的IP
ARPPacket.arpFrame.Opcode = htons((unsigned short)arpType); // 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();
CDialog::OnTimer(nIDEvent);
}void CWinpcap2Dlg::SendARPPacket()
{
// char *AdapterDeviceName =GetCurAdapterName(); // 首先获得获得网卡名字
char pStr[8192];
ULONG adapterlength;
BOOLEAN bb=PacketGetAdapterNames((char *)pStr,&adapterlength);
_ADAPTER * lpAdapter = PacketOpenAdapter(pStr/*AdapterDeviceName*/); // 根据网卡名字打开网卡
LPPACKET lpPacket = PacketAllocatePacket(); // 给PACKET结构指针分配内存
PacketInitPacket(lpPacket, &ARPPacket, sizeof(ARPPacket)); //初始化PACKET结构指针
// 其中的ARPPacket就是我们先前填充的ARP包
PacketSetNumWrites(lpAdapter, 1); // 每次只发送一个包
PacketSendPacket(lpAdapter, lpPacket, true); // Send !!!!! ^_^
PacketFreePacket(lpPacket); // 释放资源
PacketCloseAdapter(lpAdapter);
}
在你的程序中加入#include <pcap.h>, #include <remote-ext.h>.然后在工程的setting中加入预定义宏:WPCAP,HAVE_REMOTE.导入wpcap.lib库请问怎么预定义宏:WPCAP,HAVE_REMOTE.导入wpcap.lib库 请写的详细点 我市菜鸟
谢谢
http://community.csdn.net/Expert/topic/5069/5069482.xml?temp=.6782038