ARP 协议编程问题. 急呀! 高分求救呀1

addylee 2004-06-08 12:15:01
在局域网中,总是IP冲突(没有DHCP)。在设IP的时候用sniffer分析后,发现当时的ARP包是这样的。
1。我当前没有一个可用的IP。这时我把IP设为202.203.37.1时,我的机子会发出一个ARP广播。其ARP结构是这样的:
以太网目的地址: FFFFFFFFFFFFFFFF (广播地址)
以太源地址: 我的物理地址
帧类型: 0x806
硬件类型: 1 (以太网地址)
协议类型: 0x0800(IP protocol)
硬件地址长度: 6 bytes
协议地址长度: 4 bytes
Opcode: 1 (ARP 请求)
发送端以太网地址:我的物理地址
发送端IP地址: 202.203.37.1
目的端以在网地址 00000000000000000000
目的端IP地址: 202.203.37.1
如果当前我的网断上有机子使用202.203.37.1这个IP的话。它就会发给我一个ARP Reply
其中
发送端IP地址: 202.203.37.1
目的端IP地址: 202.203.37.1
同时它还会发一个ARP广播。告诉该网断中的机子它的IP 和 它的物理地址。
我想根据这个原理写一个程序。在我没有可用的IP时,自己构造一个ARP广播包。
其中发送端IP地址 为202.203.37.1 - 202.203.37.253 穷举所有IP。然后等待所有网卡上收到的ARP包。判断每一个包的发送端IP,如果是在202.203.37.1-202.203.37.253 中的一个的话,就说明这个IP已经被占用了,这样就可以把当前我的网段上所有可用的IP列举出来了。现在:ARP包的构造和发送我已经知道了(我利用了WinPcap 运行库)。可是我的问题是:
当我的网卡收到ARP包时,我要自己处理这个原始包,而不让操作系统处理。利用WinPcap 运行库 可以吗?还是有什么其它的好方法呀?希望有知道的人告诉我一下。谢谢。我的QQ:22517257
...全文
174 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdy119 2004-09-22
  • 打赏
  • 举报
回复
我有篇文章不错讲解ARP的,email?
月吻长河 2004-09-21
  • 打赏
  • 举报
回复
UP
极深研几 2004-09-21
  • 打赏
  • 举报
回复
"ping不能穿越天网防火墙吧,在xp里面观察到的,可能是因为在tcp/ip协议栈中设置这个策略"
更正一下
在防火墙软件中可以设置icmp响应的策略。
当然ping的时候,首先检查缓冲区,如果没有还是会调用
arp协议来获得对应的mac地址,这些方法最后都是用的arp,呵呵,没有问题。
极深研几 2004-09-21
  • 打赏
  • 举报
回复
"ping不能穿越天网防火墙吧,在xp里面观察到的,可能是因为在tcp/ip协议栈中设置这个策略"
更正一下
在防火墙软件中可以设置icmp响应的策略。
当然ping的时候,首先检查缓冲区,如果没有还是会调用
arp协议来获得对应的mac地址,这些方法最后都是用的arp,呵呵,没有问题。
极深研几 2004-09-21
  • 打赏
  • 举报
回复
"ping不能穿越天网防火墙吧,在xp里面观察到的,可能是因为在tcp/ip协议栈中设置这个策略"
更正一下
在防火墙软件中可以设置icmp响应的策略。
当然ping的时候,首先检查缓冲区,如果没有还是会调用
arp协议来获得对应的mac地址,这些方法最后都是用的arp,呵呵,没有问题。
syl5005 2004-09-19
  • 打赏
  • 举报
回复
iorikingdom 2004-09-19
  • 打赏
  • 举报
回复
:-)
iorikingdom 2004-09-19
  • 打赏
  • 举报
回复
“ping不能穿越天网防火墙吧,在xp里面观察到的,可能是因为在tcp/ip协议栈中设置这个策略”这句话我不大理解你的意思。

Icmp协议可以用NDIS中间层,或者NDIS HOOK的技术来截获,天网好像就是用NDIS 协议HOOK的技术来处理的,其实TDI还是可以截获ICMP的,但是微软不提供接口。所以在TDI传输层和SPI会话层都不可以截获ICMP,而不是因为什么策略。防火墙的原理和协议栈驱动希望楼上
能够温习温习。

不好意思,今天心情有点不好,得罪之处万望见谅。
iorikingdom 2004-09-19
  • 打赏
  • 举报
回复
楼上的兄弟,你可能没有了解到数据包的发送过程,icmp协议又怎么样?
不一样要发送arp请求获取目标MAC,才能够填充icmp的帧头,除非本地的ARP映射表已经有了这个值供你数据包的查询,防火墙是能够截获icmp但是arp请求在这个时候已经成功,
已经更新了系统的ARP表,所以你返不返回icmp不重要,重要是更新了ARP表,
事实胜于雄辩,你应该自己试试。
我这个方法是有点冗余,但是简单,起码你不用解包截包,不过说起来用winpcap不是很难,
看各人爱好吧,反正偶懒人一个。
极深研几 2004-09-19
  • 打赏
  • 举报
回复
ping采用的是icmp协议,《windows网络编程技术》13章讲解如何使用原始套接字来ping.
ping不能穿越天网防火墙吧,在xp里面观察到的,可能是因为在tcp/ip协议栈中设置这个策略。但arp协议可以准确的查出ip到mac的映射!优化大师里有群集ping,用的就是多线程。

to XmagicX(与code无缘)
我还头次听说面试靠arp的,不知是那家公司,考的这么底层的东西。
oyljerry 2004-09-18
  • 打赏
  • 举报
回复
可以用多线程ping
XmagicX 2004-09-18
  • 打赏
  • 举报
回复
郁闷,面试就是一道arp得
iorikingdom 2004-09-18
  • 打赏
  • 举报
回复
没有现成的代码,我一般都是用别人的程序遍历ping一把,然后
在命令提示符里面输入arp -a 这个就是懒人的做法,呵呵
极深研几 2004-09-18
  • 打赏
  • 举报
回复
to iorikingdom(iori)
“2.ping就可以了,如果对方存在防火墙的话,虽然不会返回icmp包,但是我这个时候就可以读取本地ARP缓冲表,用IP Helper里面的一个xx函数(偶不记得那个了,好像是GetIpNetTable),ping可以用系统的ping,用CreateProcess来循环调用,或者用IPHelper里面的IcmpSendEcho。

这样就不要这么费周章了,比较winpcap是驱动级的,要安装。”
这个方法有实现的代码没有?我很想知道其中的细节。有的话能不能发过来,liuxk99@sina.com。
不过通常用线程来发送和接受网络包,CreateProcess有点费资源吧!
iorikingdom 2004-09-18
  • 打赏
  • 举报
回复
纠正错误:

可以不用ARP协议的
改为
可以不用winpcap的
iorikingdom 2004-09-18
  • 打赏
  • 举报
回复
可以不用ARP协议的,
方法有2
1。用SendARP(IP Helper里面的东西,但是仅仅支持win2000/xp)
2.ping就可以了,如果对方存在防火墙的话,虽然不会返回icmp包,但是我这个时候就可以读取本地ARP缓冲表,用IP Helper里面的一个xx函数(偶不记得那个了,好像是GetIpNetTable),ping可以用系统的ping,用CreateProcess来循环调用,或者用IPHelper里面的IcmpSendEcho。

这样就不要这么费周章了,比较winpcap是驱动级的,要安装。
极深研几 2004-09-17
  • 打赏
  • 举报
回复
正好最近作过这个方面的针对性研究。
http://blog.csdn.net/liuxk99/archive/2004/09/17/108084.aspx
需要代码可以发给你
liuxk99@sina.com

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧