首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络协议 >

这个ARP包有没有写错?解决方案

2012-02-15 
这个ARP包有没有写错?#define WIN32#define HAVE_REMOTE#include stdio.h#include winsock2.h#include

这个ARP包有没有写错?
#define WIN32
#define HAVE_REMOTE
#include <stdio.h>
#include "winsock2.h"
#include "pcap.h"
#include "Packet32.h"
#pragma comment(lib, "ws2_32.lib")

typedef struct DLCHEADER
{
unsigned char eth_addr_des[6];//以太网目的地址
unsigned char eth_addr_src[6];//以太网源地址
unsigned short frame_type; //帧类型
}DlcHeader;

typedef struct ARPFRAME
{
unsigned short hwtype; //硬件类型
unsigned short protrol_type; //协议类型
unsigned char hw_length; //硬件地址长度
unsigned char pro_length; //协议地址长度 
unsigned short op; //ARP包类型;
unsigned char mac_src[6];//发送端以太网地址
unsigned long ip_src; //发送端IP地址
unsigned char mac_des[6];//目的以太网地址
unsigned long ip_des; //目的IP地址
unsigned char pading[18]; //填充位
}ArpFrame;

typedef struct ARPPACKET
{
DlcHeader arp_header;
ArpFrame arp_frame;
}ArpPacket;

/****************************************************************************
* Name & Params::
* formatStrToMAC
* (
* const LPSTR lpHWAddrStr : 用户输入的MAC地址字符串
* unsigned char *HWAddr : 返回的MAC地址字符串(赋给数据包结构体)
* )
* Purpose:
* 将用户输入的MAC地址字符转成数据包结构体需要的格式
****************************************************************************/
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 GenArpPacket(ArpPacket *APbuf)
{
int i;
memset(APbuf,0,sizeof(*APbuf));
formatStrToMAC("00e0524ca312",APbuf->arp_header.eth_addr_src);
formatStrToMAC("ffffffffffff",APbuf->arp_header.eth_addr_des);
APbuf->arp_header.frame_type=htons((u_short)0x0806);
APbuf->arp_frame.hwtype=htons((u_short)1);//以太网类型
APbuf->arp_frame.protrol_type=htons((u_short)0x0800);
APbuf->arp_frame.hw_length=(u_char)6;
APbuf->arp_frame.pro_length=(u_char)4;
APbuf->arp_frame.op=htons((u_short)0x0001);
formatStrToMAC("00e0524ca312",APbuf->arp_frame.mac_src);
APbuf->arp_frame.ip_src=inet_addr("202.192.165.169");
formatStrToMAC("ffffffffffff",APbuf->arp_frame.mac_des);
APbuf->arp_frame.ip_des=inet_addr("202.192.165.199");
for(i=0;i<18;i++)
APbuf->arp_frame.pading[i]=i;
}






int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
int ret=-1;
int MaxPacketLen=100;
ArpPacket *pbuf;
u_char *pBuf;
   
  /* 获取本机网络设备列表*/
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, 
&alldevs, errbuf) == -1)


  {
  fprintf(stderr,
"Error in pcap_findalldevs: %s\n", errbuf);
  exit(1);
  }
   
  /* 打印网络设备列表*/
  for(d=alldevs; d; d=d->next)
  {
  printf("%d. %s", ++i, d->name);
  if (d->description)
  printf(" (%s)\n", d->description);
  else
  printf(" (No description available)\n");
  }
   
  if(i==0)
  {
  printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
  return -1;
  }

  /*选择网络设备接口*/
  printf("Enter the interface number (1-%d):",i);
  scanf("%d", &inum);
   
  if(inum < 1 || inum > i)
  {
  printf("\nInterface number out of range.\n");
  /* 释放设备列表*/
  pcap_freealldevs(alldevs);
  return -1;
  }
   
  /* 跳转到选中的适配器*/
  for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
   
  /* 打开设备*/
if ( (adhandle= pcap_open(d->name, 65536, 
PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL,errbuf) ) 
== NULL)
  {
  fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
  /* 释放设备列表*/
  pcap_freealldevs(alldevs);
  return -1;
  }

  /*在选中的设备接口上监听数据*/
  printf("\nlistening on %s...\n", d->description);
   

  pbuf=(ArpPacket *)malloc(sizeof(ArpPacket));
GenArpPacket(pbuf);
if ( (ret=pcap_sendpacket(adhandle,pbuf,sizeof(ArpPacket)))
!=0)
{
printf("发送失败\n");
pcap_close(adhandle);
  pcap_freealldevs(alldevs);
  return -1;
}
else
printf("发送成功\n");


/*释放资源*/
free(pbuf);
pcap_close(adhandle);
pcap_freealldevs(alldevs);
   
  getch();
}

请高手们看看有没有错,程序是可以运行的,而且还显示到发送成功,但我用WireShark捕获时却捕获不到,通过指定IP地址和ARP协议为条件进行捕获的,我现在不知道是程序错误还是捕获那方面出错啊!!!!!郁闷

[解决办法]
可以检测到的,检查你的代码有没有错吧

热点排行