调试网络收发不通问题
今天在做之前一個(gè)項(xiàng)目重構(gòu)的事情,需要把之前的代碼重新做功能,我們有兩個(gè)設(shè)備,他們通過網(wǎng)線連接,用UDP來傳輸數(shù)據(jù)。很多人都懷疑UDP丟包什么,不及時(shí)什么之類的,如果想把事情做得足夠快,最好還是在UDP上做一些事情,對(duì)于丟包是有很多處理方式的。
然后,我在新代碼的調(diào)試下,發(fā)現(xiàn)問題,A設(shè)備發(fā)送廣播包給B設(shè)備發(fā)送不成功。簡(jiǎn)單的代碼定位如下
#include?<errno.h> printf("%s(),LINE=%d,[%s]\n", __FUNCTION__, __LINE__, strerror(errno));執(zhí)行后看到輸出
我剛開始以為是端口的原因,然后檢查了一下才發(fā)現(xiàn),是因?yàn)槲覜]有設(shè)置默認(rèn)網(wǎng)關(guān),我從網(wǎng)上看到這個(gè)圖的。
講道理,我們的兩個(gè)設(shè)備都不需要連接外網(wǎng),所以是沒有必要配置網(wǎng)關(guān)的,問題是出在,我的網(wǎng)絡(luò)廣播包發(fā)送的的是 "255.255.255.255"。
在配置系統(tǒng)里面默認(rèn)網(wǎng)關(guān)的目的,是告訴系統(tǒng),當(dāng)有些數(shù)據(jù)包不匹配路由表中其他任意路由,不知道怎么選路的時(shí)候,就把這個(gè)數(shù)據(jù)包丟給默認(rèn)網(wǎng)關(guān)讓它幫你轉(zhuǎn),所以,網(wǎng)關(guān)可以認(rèn)為是網(wǎng)絡(luò)的管家,當(dāng)有人不知道做什么的時(shí)候,就需要網(wǎng)關(guān)來告訴他要做什么,要到哪里去。
?在把網(wǎng)關(guān)配置正常后,設(shè)備可以正常收發(fā)數(shù)據(jù)。
但是我不想每次都配置一次網(wǎng)關(guān),所以我就需要換一個(gè)廣播地址,把廣播的地址修改成"192.168.9.255"。
嗯,這樣之后,發(fā)送就不會(huì)再提示有問題了。
但是接收數(shù)據(jù)沒有看到有數(shù)據(jù),崩潰~~~~
這個(gè)時(shí)候單播和兩個(gè)設(shè)備互ping都是沒有問題的。
然后檢查兩個(gè)設(shè)備的網(wǎng)絡(luò)情況,如下
發(fā)現(xiàn)兩個(gè)設(shè)備不在同一個(gè)網(wǎng)段下,so,我就懷疑我的服務(wù)可能寫的有問題。
正常情況下,A設(shè)備通過DHCP從B設(shè)備獲取IP,那B設(shè)備的DHCP服務(wù)配置就可能是很大的問題了,因?yàn)槊看螆?zhí)行獲取IP的命令后就發(fā)現(xiàn)我的子網(wǎng)掩碼被修改了,那應(yīng)該是DHCP服務(wù)搞的鬼。
然后去看DHCP服務(wù)的配置文件,發(fā)現(xiàn)配置文件寫的有問題,配置文件沒有讓設(shè)備處在同一個(gè)子網(wǎng)掩碼下。
錯(cuò)誤的配置文件如下
需要把opt subnet 配置成和IP地址同一個(gè)網(wǎng)段的地址。opt subnet 是子網(wǎng)掩碼的計(jì)算工具,子網(wǎng)掩碼就是通過這個(gè)計(jì)算出來的,我們子網(wǎng)掩碼不正確也就是這個(gè)原因了。
最后,修改固件的配置文件重新燒錄后驗(yàn)證正常。
網(wǎng)絡(luò)是個(gè)很復(fù)雜的東西,搞網(wǎng)絡(luò)的時(shí)候,我總是搞不懂MAC層是什么,PHY層是什么,為什么有了MAC層又多出來一個(gè)PHY層。
說白了,這兩個(gè)層都是硬件層,我們還可能遇到一些Switch加兩個(gè)PHY,Switch可能很多人還不知道是什么東西,這無(wú)非就是高速開關(guān),有多高速我也說不清楚,反正因?yàn)楦咚偾袚Q產(chǎn)生的溫度是非常高的。
好了,就這樣。感謝發(fā)哥又跟我調(diào)試了一天~謝謝發(fā)哥~
總結(jié)
以上是生活随笔為你收集整理的调试网络收发不通问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 麒麟系统stty测试串口
- 下一篇: 什么是MCU里应尽量遵循的寄存器谨慎赋值