你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
自定义ARP
 
相信各位都玩过SOCKET编程,用CSocket进行网络通讯非常方便,但有时想搞点底层点东西却非常麻烦,用windows的API最低也只能SOCK_RAW,顶多能看到IP层数据,如果想处理数据链路层的数据就无从下手了,幸好某天发现了winpcap东西。用了它处理底层的东西就非常方便。

  winpcap主要有两个dll供程序员直接调用,pcap.dll和packet.dll,本程序主要使用pcap.dll,至于packet.dll的使用在21期TOo2y 的《 详谈调用winpcap驱动写arp多功能工具 》作了详细的介绍

  一、本程序主要用了下面几个函数

  1 . int pcap_findalldevs ( pcap_if_t ** alldevsp, char * errbuf )

  用于得到所有网络适配器信息放在 alldevsp

  2 . pcap_t* pcap_open_live ( const char * device, int snaplen, int promisc, int to_ms, char * ebuf )

  用于打开网络适配器,并设置其捕获参数

  3 . int pcap_sendpacket (pcap_t *p, u_char *buf, int size)

  发数据包

  4 . void pcap_freealldevs (pcap_if_t *alldevsp)

  释放所以网络适配器

  5 . void pcap_close (pcap_t *p)

  关闭网络适配器

  二、类说明

  CHex ,主要用于处理十六进制数据

  CYGPcap ,主要用于对 PCAP 的那几个函数进行封装

  CYGEdit, 主要用重载几个操作符,方便使用

  CResize ,主要用于窗口变化时,子窗口的变化

  三、ARP 协议格式如下:

  数据链路层

  目的 MAC 地址

  6 Byte

  源 MAC 地址

  6 Byte

  类型

  2 Byte

  ARP 层包报文

  硬件类型

  2 Byte

  协议类型

  2 Byte

  硬件地址长度

  1Byte

  协议地址长度

  1Byte

  操作类型

  2 Byte

  发送方 MAC

  6 Byte

  发送方 IP

  4 Byte

  目的 MAC

  6 Byte

  目的 IP

  4 Byte

  四、主要代码

//发送ARP包
void CNetArpDlg::OnBtnSendarp()
{
if (!UpdateData()) return ;
static int nPacketNum=0;
CHex bPacket(64);
CString strDestMac;
DWORD dwAddress;
m_edDest>>strDestMac;
//最终报文大概的样子
//FFFFFFFFFFFF000AE43D867408060001080006040001000AE43D8674C0A80101000000000000C0A801B5
m_edShow.SetSpace(m_IsSpace);
try
{
if (strDestMac.GetLength()!=12||m_strSrc.GetLength()!=12) throw "MAC地址有错,应该是6个字节";
//数据链路层
bPacket<<strDestMac; //Destination MAC
bPacket<<m_strSrc; //Source MAC
bPacket.AddTwoByte(0x0806); //type=arp
//arp层
bPacket.AddTwoByte(0x0001); //Harware type
bPacket.AddTwoByte(0x0800); //protocol type
bPacket.AddOneByte(0x6); //hardware size
bPacket.AddOneByte(0x4); //protocol size
bPacket.AddTwoByte(m_nArpType+1); //code type
bPacket<<m_strSrc; //sender mac address
m_IPSend.GetAddress(dwAddress);
bPacket.AddUINT(dwAddress); //sender ip address
bPacket.Add((void *)"x0x0x0x0x0x0",6);//target mac address
m_IPTarget.GetAddress(dwAddress);
bPacket.AddUINT(dwAddress); //target ip address
// bPacket.Trace("内容");
if (1==m_nArpType) //如果是响应
bPacket.Add((void *)"x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0",18);
m_pcap.SendPacket(bPacket);
m_edShow<<"发送第"<<++nPacketNum<<"包"<<endl<<bPacket<<endl<<endl;
}
catch(char *szErr){AfxMessageBox(szErr);}
}

  五、结束

  详细请看代码,本人也是刚接触WinPcap,所以一不定有一些错漏的地方,请各位大蝦不要见笑。

  如果程序有编译不过去的地方,请务必先按装winPcap库,更新VC6的PlatformSDK

(编辑:aniston)

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089