這個問題困擾過我幾次,都沒有來得及研究,今天研究一下。
- 首先寫一個最簡易的socket tcp程序,連接成功后再關閉服務器然后再用客戶端各種操作看是什么情況
測試表明
(1)客戶端已經連接,當服務端關閉程序時,客戶端調用send函數發送失敗,WSAGetLastError() 返回10054(遠程主機強迫關閉了一個現有的連接)
(2)客戶端已經連接,當客戶端關閉程序時,服務端調用recv函數接收失敗,WSAGetLastError() 返回10054(遠程主機強迫關閉了一個現有的連接) ,這時對這個客戶端的socket調用select函數時,會立即返回可讀。
(3)客戶端已經連接,當服務端關閉程序時,客戶端調用recv函數接收失敗,WSAGetLastError() 返回10054
(4)WSAAsyncSelect模式的服務端,當客戶端軟件關閉時,服務器收到的消息為FD_CLOSE,錯誤代碼為10053(您的主機中的軟件中止了一個已建立的連接)
- 關於客戶端斷線重連
粗略的做法是,當客戶端調用send或recv失敗,然后WSAGetLastError()判斷錯誤編號,然后關閉socket。再創建一個socket。然后進行connect操作。
下面附上我寫的一個基於socket流式套接字的源碼服務端支持一對多聊天。socket相關通信都是用windows api。用於新手學習之用。