智能终端定制开发 ad
MTK/瑞芯微/高通-Android,智能模块/智能终端方案商

深度定制各类智能终端和智能硬件产品,提供硬件选型咨询、参考设计、元器件推荐、驱动开发、行业模块集成、操作系统定制与算法集成等软硬件定制服务。
contact.aspx

Android核心板产品覆盖2G、3G、4G通讯,双核、四核、八核CPU,可选的平台有MTK6580、MTK6737、MTK6750等,Android版本有5.1 6.0 7.0等。
contact.aspx

可广泛应用于低端智能POS、安防监控、车载设备、低端智能机器人、智能家居、智能硬件、工业智能手持设备、低端智能对讲设备、低端警务或执法设备、智能穿戴、贩卖机、物流柜、智能门禁系统等行业和设备。
contact.aspx

可提供以太网转串口透传,WIFI转串口透传,蓝牙转串口透传,CAN总线模拟量控制输出模块等。
contact.aspx

带3G或4G通讯功能,运行android系统,有多个串口,可以外挂各种模块:条码扫描、RFID、指纹识别、身份证识别、磁条卡、ID卡、GPS/北斗模块等。
contact.aspx

具有4G通讯功能,多个RS232或RS485接口,以太网接口,USB接口,CAN接口,多个AD输入。基于Android系统智能平台,方便APP应用开发。器件严格选型,运行稳定,质量可靠。
contact.aspx

自定义ARP
[VC 编程] 2008-04-03




作者:谭永光

下载源代码

这么多年来,在VCKBASE上学了不少东西,却没有投过一文半稿,实有愧于心,所以今天......

相信各位都玩过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 *)"\x0\x0\x0\x0\x0\x0",6);//target mac address
m_IPTarget.GetAddress(dwAddress);
bPacket.AddUINT(dwAddress); //target ip address
// bPacket.Trace("内容");
if (1==m_nArpType) //如果是响应
bPacket.Add((void *)"\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0",18);
m_pcap.SendPacket(bPacket);

m_edShow<<"发送第"<<++nPacketNum<<"包"<<endl<<bPacket<<endl<<endl;
}
catch(char *szErr){AfxMessageBox(szErr);}

}

五、结束
详细请看代码,本人也是刚接触WinPcap,所以一不定有一些错漏的地方,请各位大蝦不要见笑。
如果程序有编译不过去的地方,请务必先按装winPcap库,更新VC6的PlatformSDK

如对程序有疑问
QQ:158510972
MAIL:tyongguang@126.com

 
[VC 编程添加评论 | 评论/阅读(0/258)
评论
昵称
主页
内容
递交


Copyright @ 我的开发笔记     2008 - 2017         粤ICP备19155526号-1