1. 程式人生 > >TCP處理第一次連線斷開,再次連線處理

TCP處理第一次連線斷開,再次連線處理

主要參考這個文章:

http://blog.csdn.net/eric0318/article/details/51087513

盜一個圖:

TCP斷開連線四次握手流程

最近接到個任務:接收機實現自制板卡韌體升級的功能。

據板卡部所說,網口升級的話,需要連線兩次:板卡做伺服器端,接收到changemode會關閉掉現在連線程式,,去啟另一個update程式,這時應當去重新連線。

由於屬於伺服器端close掉TCP連線,那麼本升級程式再去read該連線時,讀取為0。
並且處於CLOSE_WAITE狀態,須呼叫close函式,傳送FIN分節,
確保本程式的該TCP 過程結束。

//因為板卡伺服器端close掉連線後,處於FIN_WAITE狀態
//初步猜測,在伺服器傳送來FIN分節後,client的系統自動傳送了ACK
//則伺服器雖然關閉了,但系統維護的該套接字應當處於FIN_WAITE2的狀態,等待client傳送FIN分節
//如果收到客戶端的FIN,那麼伺服器那個套接字會處於TIME_WAITE狀態,
//這個狀態等待的時間,初步查資料是2MSL,
//而如果伺服器套接字選項沒有選擇一些選項(SO_LINGER或者SO_REUSEDDR)
//那麼伺服器端監聽同一埠在2MSL時間內無法接受新連線

//那麼,如果我的程式能夠先板卡服務端執行close,那麼過程就應當是"優雅"的退出,
//儘管我這邊第一個連線會處於Time_Waite狀態,但是由於客戶端連線時,系統隨機分配埠
//所以不會對第二次連線造成影響。

稍微發些牢騷:

1、接收到任務後,所給材料不全,折騰來折騰去,最終用已有的串列埠工具進行串列埠檢測資料,然後模擬中間過程。

2、由於接收機正常程式佔用了串列埠,要幹掉相應程式,另外編寫升級程式。先利用網頁將檔案推送至cgi程式,CGI啟動升級程式,然後kill相關程式、開始升級過程。

3、利用網口升級,由於接收機底板一個網口與板塊網口直連,需將該兩網口設為同一網段,才能TCP通訊。中間遇到問題,浪費了2天,最終發現是多焊接一個電阻,坑.....