调试网络收发不通问题
今天在做之前一个项目重构的事情,需要把之前的代码重新做功能,我们有两个设备,他们通过网线连接,用UDP来传输数据。很多人都怀疑UDP丢包什么,不及时什么之类的,如果想把事情做得足够快,最好还是在UDP上做一些事情,对于丢包是有很多处理方式的。
然后,我在新代码的调试下,发现问题,A设备发送广播包给B设备发送不成功。简单的代码定位如下
#include
printf("%s(),LINE=%d,[%s]\n", __FUNCTION__, __LINE__, strerror(errno));
执行后看到输出
我刚开始以为是端口的原因,然后检查了一下才发现,是因为我没有设置默认网关,我从网上看到这个图的。
讲道理,我们的两个设备都不需要连接外网,所以是没有必要配置网关的,问题是出在,我的网络广播包发送的的是 "255.255.255.255"。
在配置系统里面默认网关的目的,是告诉系统,当有些数据包不匹配路由表中其他任意路由,不知道怎么选路的时候,就把这个数据包丢给默认网关让它帮你转,所以,网关可以认为是网络的管家,当有人不知道做什么的时候,就需要网关来告诉他要做什么,要到哪里去。
在把网关配置正常后,设备可以正常收发数据。
但是我不想每次都配置一次网关,所以我就需要换一个广播地址,把广播的地址修改成"192.168.9.255"。
嗯,这样之后,发送就不会再提示有问题了。
但是接收数据没有看到有数据,崩溃~~~~
这个时候单播和两个设备互ping都是没有问题的。
然后检查两个设备的网络情况,如下
发现两个设备不在同一个网段下,so,我就怀疑我的服务可能写的有问题。
正常情况下,A设备通过DHCP从B设备获取IP,那B设备的DHCP服务配置就可能是很大的问题了,因为每次执行获取IP的命令后就发现我的子网掩码被修改了,那应该是DHCP服务搞的鬼。
然后去看DHCP服务的配置文件,发现配置文件写的有问题,配置文件没有让设备处在同一个子网掩码下。
错误的配置文件如下
需要把opt subnet 配置成和IP地址同一个网段的地址。opt subnet 是子网掩码的计算工具,子网掩码就是通过这个计算出来的,我们子网掩码不正确也就是这个原因了。
最后,修改固件的配置文件重新烧录后验证正常。
网络是个很复杂的东西,搞网络的时候,我总是搞不懂MAC层是什么,PHY层是什么,为什么有了MAC层又多出来一个PHY层。
说白了,这两个层都是硬件层,我们还可能遇到一些Switch加两个PHY,Switch可能很多人还不知道是什么东西,这无非就是高速开关,有多高速我也说不清楚,反正因为高速切换产生的温度是非常高的。
好了,就这样。感谢发哥又跟我调试了一天~谢谢发哥~