网络环境下设备发现是一种比较常见的应用,比如查找打印机与WiFi。那么我们应该如何通过编程实现对网络中的特定设备进行查找呢?
常用的方式有:IP广播与多播,以及基于这两种方式所实现的第三方协议,较著名的有Onvif协议。
1局域网广播
1.1 定义
广播是一种一对所有的通信模式。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。
广播不用进行网络路径选择,不能穿越路由器。这是为了防止广播数据影响大面积的主机,引起广播灾难。
1.2 优缺点
1.2.1 优点
- 网络设备简单,维护简单,布网成本低廉。
- 由于服务器不用向每个客户机单独发送数据,所以服务器流量负载极低。
1.2.2 缺点
- 无法针对每个客户的要求和时间及时提供个性化服务。
- 网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。例如有线电视的客户端的线路支持100个频道(如果采用数字压缩技术,理论上可以提供 500个频道),即使服务商有更大的财力配置更多的发送设备、改成光纤主干,也无法超过此极限。
- 不能在广域网上传播,这是为了防止广播风暴。
1.3 广播地址
每一个网段都有一个广播地址,其格式为 xxx.xxx.xxx.255 的形式。计算方式如下:
网络地址 = IP地址 & 子网掩码
广播地址 = 网络地址 | (~子网掩码)
代码:
/* * 通过ip地址与子网掩码计算广播地址 * 算法流程:1. ip地址与子网掩码获得网络地址; * 2. 网络地址主机位全置1后得到广播地址
* @param[out] bc_addr 广播地址 * @param[in] ip 主机IPv4地址 * @param[in] mask 子网掩码 * @param[in] len IPv4地址长度(16) * @return 返回广播地址 */ char* cal_bc_addr(char* bc_addr, const char* ip, const char* mask) { uint8_t bc[4] = {0}; int ret = 0; printf("ip: %s ", ip); printf("mask: %s ", mask); ip[3] = '