昨天集群動態Ip顯示出錯了,與路由器上的ip不符,說來也巧,剛好五個Ip,對了三個錯了兩個,事情的來龍去脈是這樣的:下午14:19分實驗室突然停電了,過了三分鐘以后來電了,動態ip發生了變化,于是我連接了ip1和ip4,還是可以正常使用,但是又過了五分鐘,我兩個設備同時顯示“VPN failed to start”,但是我切換成ip2和ip5還是可以正常使用,
本來以為相安無事,結果師兄告訴我是動態Ip獲取錯誤了,錯的兩個剛好是ip1和ip4…馬薩卡!
于是就要找出代碼哪里出錯了…考慮到我太菜了師兄安排了大佬指導我qvq

記錄我們的一些嘗試和掙扎:
1 尋找動態Ip的代碼寫在哪里了
因為師兄只告訴我們去解決問題qvq并沒說相關代碼在哪里,于是我們從節點機上開始找,并沒有搜到“動態ip”四個字,說明節點機不包含這部分代碼,于是我們用權限進入管理機,進入以后直接ls,我看到有一個叫做“Codes”的檔案夾,但是看了看還是不對,大佬最后發現代碼放在/opt/login-station目錄,
.
2 把代碼從管理機scp到我的虛擬機上便于除錯
我最后是直接在管理機上運行scp代碼的:
scp -r -P 22223 /opt/login-station/ root@192.168.xxx.xxx:/home/Desktop/login-station/
在scp進行傳輸時輸入的密碼是@后面的密碼,
這里需要埠號的原因是因為虛擬機有埠映射,埠映射是跟虛擬機系結的,
但是從管理機到節點是不需要埠映射的,而虛擬機在節點的內部,
如果要從管理機傳到主機,就不用加埠號了,因為默認22號埠,傳輸對應的ip地址一般應該是10.1.0.××,想查看ip地址的話命令是:ifconfig -a
但是大佬建議不要把工程檔案傳到主機,本地機器是沒有連到路由器,可能不太好檢測,所以就在docker里除錯比較好,于是最后我們把工程檔案弄到我的51號虛擬機上進行除錯,
.
3 ip_detector_server.py與ip_detector_client.py
ip_detector_server.py下定義了一個get_new_ip()的函式,get_new_ip()中又涉及到ip_detector_client.py,
ip_detector_client.py功能是創建了client,負責回圈發送0-50的資料,get_new_ip()中負責接收這個資訊,資訊發送程序中走的是網路線路,那就會經過路由器,所以它能獲得路由器的ip地址,因為有五個路由器而我們不能重復獲得相同的Ip地址因為沒有意義,于是就讓客戶端一直發資訊直接我們讀取到了全部的五個ip地址,這樣我們就有了五個動態ip,
功能了解了以后,就要找出哪里有問題了,
.
4 復制工程檔案到管理機的另一個目錄下進行除錯并解決bind問題
我們把/opt/login-station/工程檔案復制到了/home/xxxx/test/login-station/檔案中打算進行測驗,相關代碼路徑需要由/opt/批量修改為/home/xxxx/test/,修改完以后運行:python3 ip_detector_server.py
發現執行到get_new_ip()的時候,卡在了bind這里:server.bind((‘0.0.0.0’, 9999)),于是又搜索相關解決方案,輸入netstat -nap 進行分析,發現好像9999埠號已經有程式在使用了,
于是我們將9999改為9998,相應的ip_detector_client.py中的9999也要改為9998,再次運行,發現bind這一行可以運行通過了,
.
5 發現根本問題
解決bind問題以后,我們又遇到了新的問題:
再次python3 ip_detector_server.py以后我們發現程式一直在運行但是也沒報錯,也沒更新新的ip,為了發現到底問題出在哪里,我們在代碼里面加了幾個print,看看到底運行到了哪里沒有輸出,
最后問題在這里:
get_new_ip()中有這樣的代碼:
上面在執行ip_detector_client.py,執行完了回到這一步,
while True:
print("執行到這里啦!")
data, client_addr = server.recvfrom(BUFSIZE)
print("我在這里!")
if iplist.get(client_addr[0]) is None:
iplist[client_addr[0]] = 1
if len(iplist) == 5:
break
通過除錯,我們發現問題在“data, client_addr = server.recvfrom(BUFSIZE)”這一步代碼,這個代碼執行了以后并沒有向下執行了,所以導致ip沒有更新,
.
6 發現問題后做的一些掙扎
因為在實際呼叫時ip_detector_client.py執行的是在s0節點機上的ip_detector_client.py函式,由于發現get_new_ip()中的“data, client_addr = server.recvfrom(BUFSIZE)”一直在執行且沒出現報錯資訊,于是我們把“data, client_addr = server.recvfrom(BUFSIZE)”這行代碼移到了ip_detector_client.py的最后面,并重新運行python3 ip_detector_server.py
這下出現了報錯:bad file descriptor
一言難盡
大佬覺得是兩端沒有發生通信,但是這就很奇怪了,為什么通信不了呢,而且是可以ping通的,
后來我們又用網上找到的代碼小修了一下重新模擬發送和接收:
代碼鏈接在這里:https://segmentfault.com/a/1190000016606777
我們讓客戶端發送,服務端接收,但是測驗時客戶端一直在發送,服務端卻接收不了,,所以根本問題就是通信沒有進行,,,
為了解決這個問題,我們還試了重新啟動s0機器,并且去實地檢查了設備是否正常在運作,但是還是沒找到問題出在哪里,,,到底什么導致無法通信呢,,,
.
7 后續
我們告訴師兄沒有解決成功,期待未來能知道到底哪里出了問題,,如果知道了我會再更新的!
不過這次經歷受益匪淺,感謝大佬科普我計算機網路的知識,
.
.
.
上文內容寫于2021.4.10
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274726.html
標籤:其他
