这是从网上找到的一段代码 稍作修改  编译通过了  但是我用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);
}

解决方案 »

  1.   

    另外我是用vc6.0 sp6  以及sdk 2003
      

  2.   

    刚才在论坛里找到一片关于使用winpcap的帖子 上面说
     在你的程序中加入#include <pcap.h>, #include <remote-ext.h>.然后在工程的setting中加入预定义宏:WPCAP,HAVE_REMOTE.导入wpcap.lib库请问怎么预定义宏:WPCAP,HAVE_REMOTE.导入wpcap.lib库  请写的详细点 我市菜鸟
    谢谢
      

  3.   

    PacketSendPacket(lpAdapter, lpPacket, true);     // Send !!!!! ^_^看看返回值,有没有发送成功,另外可以使用sniffer看看包有没有发出,或是到达了对方
      

  4.   

    回nuaawenlin(飘人),是没有发出去 祥见
    http://community.csdn.net/Expert/topic/5069/5069482.xml?temp=.6782038