一次問題解決Socket問題過程總結

在漫長的軟件開發的過程中,總會遇到這樣或者那樣的問題,問題的出現總是迥然的相似:開始會爲難纏的bug而苦惱,而後會爲找到一些蛛絲馬跡而興奮起來,隨後當假象被推翻的時候,又會回到初始的狀態……但好在最終的結果總是令人喜悅的!

最近就遇到一件棘手的事情,有一些實時數據需要用無線連接器(客戶端Client)通過Socket與服務器建立連接,並將數據發送給服務器,之後斷開連接。這個流程看似沒有問題,實際上服務器和客戶端之間也一直這麼“友好”的合作着,可是因爲機房的一次斷電,出現了一件奇葩的事情:所有客戶端只能跟服務器建立第一次“友好”的合作,兩次以上二者之間就再也無法通信。

總結一下大致的問題:所有客戶端的第一條數據發送成功,隨後所有的客戶端第二條數據全部發送失敗。

猜測原因是客戶端與服務器之間建立socket連接之後沒有斷開導致,於是通過netstat命令查看一下客戶端與服務器之間實時通信情況:

netstat -ano | findstr “6800”   (6800位服務器監聽端口號)

netstat檢測數據

可以看出,服務端檢測出所有的tcp狀態都是ESTABLISHED。

接下來看一下socket建立連接與斷開連接的通信過程:

客戶端與服務端通過3次握手建立連接

客戶端與服務端通過4次揮手斷開連接

通過以上兩張圖可以看出,客戶端與服務端之間僅僅通過3次握手實現了連接,卻沒有斷開,究其原因,是因爲客戶端建立第一次連接之後,沒有跟服務端進行斷開連接通信,直接斷電關機(wify發射器爲了節省電能,每五分鐘定時啓動一次,發送完數據直接斷電)。也就是說客戶端並未通知服務端斷開連接,服務端採用的是被動關閉連接,斷電之後直接發送第二條數據,導致通道被阻塞。

解決方案:

  1. 客戶端建立通信後斷開連接後再斷電。
  2. 服務端採用主動關閉socket

又由於客戶端是集成在硬件設備裏,已經投入使用,所以最理想的方式就是採用方案二。至此,問題總算得以解決!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章