2019独角兽企业重金招聘Python工程师标准>>>
最近一直在研究局域网发现活跃主机的demo,没做之前,感觉水不深,做了之后,差点没淹死。。。。。
需求是这样的:现在要开发一种模块,模块的MAC地址出厂的时候已经写好,但是IP地址可以由客户随便设置。现在的要求是只要模块一接上网线,无聊其IP设置为什么,都可以通过上位机软件通过局域网将其搜索出来。
方式一:采用 p2p方式,编写一个服务端程序和客户端程序,客户端程序自动向服务端报告本机IP和mac地址,由服务端进行服务调度,实现局域网发现;
方式二:采用arp协议,对局域网内活动的主机进行发现,这种方式主要是通过对局域网内的arp捕获,分析处理arp包的内容进行判断,实现局域网发现;
方式三:采用组播的方式,客户端所有主机都自动加入到组播中,在组播中,凡是存在的IP都是活跃折,实现局域网发现。
实际情况:
采用第一种方式的话 ,需要连接到外网,很多时候,并不提供外网,所以第一种方案不可以;采用第二种方案也是有着局限性,因为arp协议是采用广播的方式进行,在没有外面的情况下,不同网段需要路由器转发,但路由器默认过滤广播包,所有,只有最终路由器才知道目的IP的MAC地址,如果进行跨网段通信的话,需要特定支持跨网段通信的路由器。
下面详细来说下udp组播方式如何实现的:
组播(Multicast)传输:在发送者和每一接收者之间实现点对多点网络连接。如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包。它提高了数据传送效率。减少了骨干网络出现拥塞的可能性。
在组播方式中,信息的发送者称为“组播源”,信息接收者称为该信息的“组播组”,支持组播信息传输的所有路由器称为“组播路由器”。加入同一组播组的接收者成员可以广泛分布在网络中的任何地方,即“组播组”没有地域限制。需要注意的是,组播源不一定属于组播组,它向组播组发送数据,自己不一定是接收者。多个组播源可以同时向一个组播组发送报文。
假设只有 Host B、Host D 和Host E 需要信息,采用组播方式时,可以让这些主机加入同一个组播组(Multicast group),组播源向该组播组只需发送一份信息,并由网络中各路由器根据该组播组中各成员的分布情况对该信息进行复制和转发,最后该信息会准确地发送给Host B、Host D 和Host E。
下面附上boost.asio的组播(Multicast)实现:
http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/example/cpp03/multicast/sender.cpp
http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/example/cpp03/multicast/receiver.cpp
ps:udp进行跨网段通信还有一种方法,就是计算网段进行广播。这种方式就有点复杂了,需要进行计算,这样在效率方面可能也会有些损失,具体实现并没有用过,有兴趣的童鞋可以试试。