遊戲測試過程當中發現某些socket錯誤常常出現,如下是測試遊戲服務器時一般考慮的case.
服務器端:
1.
Case:客戶端程序正常運行的狀況下,拔掉網線,殺掉客戶端程序
目的:模擬客戶端死機、系統忽然重啓、網線鬆動或網絡不通等狀況
結論:這種狀況下服務器程序沒有檢測到任何異常,並最後等待「超時」才斷開TCP鏈接服務器
2.
Case:客戶端程序發送不少數據包後正常關閉Socket並exit進程(或不退出進程)
目的:模擬客戶端發送完消息後正常退出的狀況
結論:這種狀況下服務器程序可以成功接收完全部消息,並最後收到「對端關閉」(Recv返回零)消息網絡
3.
Case:客戶端程序發送不少數據包後不關閉Socket直接exit進程
目的:模擬客戶端程序退出而忘記關閉Socket的狀況(好比經過Windows窗口的關閉圖標退出進程,而沒有捕獲相應關閉事件作正常退出處理等)
結論:這種狀況下服務器程序可以收到部分TCP消息,而後收到「104: Connection reset by peer」(Linux下)或「10054: An existing connection was forcibly closed by the remote host」(Windows下)錯誤socket
4.
Case:客戶端程序發送不少數據包的過程當中直接Kill進程
目的:模擬客戶端程序崩潰或非正常方式結束進程(好比Linux下」kill -9″或Windows的任務管理器殺死進程)的狀況
結論:這種狀況下服務器程序很快收到「104: Connection reset by peer」(Linux下)或「10054: An existing connection was forcibly closed by the remote host」(Windows下)錯誤測試
5.
Case:客戶端程序發送不少數據包後正常關閉Socket並exit進程(或不退出進程)
目的:模擬客戶端正常關閉Socket後,服務器端在檢查到TCP對端關閉前向客戶端發送消息的狀況
結論:這種狀況下服務器程序接收和發送部分TCP消息後,在Send消息時產生「32: Broken pipe」(Linux下)或「10053: An established connection was aborted by the software in your host machine」(Windows下)錯誤遊戲
總結:
當TCP鏈接的進程在忘記關閉Socket而退出、程序崩潰、或非正常方式結束進程的狀況下(Windows客戶端),會致使TCP鏈接的對端進程產生「104: Connection reset by peer」(Linux下)或「10054: An existing connection was forcibly closed by the remote host」(Windows下)錯誤進程
當TCP鏈接的進程機器發生死機、系統忽然重啓、網線鬆動或網絡不通等狀況下,鏈接的對端進程可能檢測不到任何異常,並最後等待「超時」才斷開TCP鏈接事件
當TCP鏈接的進程正常關閉Socket時,對端進程在檢查到TCP關閉事件以前仍然向TCP發送消息,則在Send消息時會產生「32: Broken pipe」(Linux下)或「10053: An established connection was aborted by the software in your host machine」(Windows下)錯誤ip
客戶端
1.
服務器端已經close了Socket,客戶端再發送數據
目的:測試在TCP對端進程已經關閉Socket時,本端進程還未檢測到鏈接關閉的狀況下繼續向對端發送消息
結論:第一包能夠發送成功,但第二包發送失敗,錯誤碼爲「10053: An established connection was aborted by the software in your host machine」(Windows下)或「32: Broken pipe,同時收到SIGPIPE信號」(Linux下)錯誤ci
2.
服務器端發送數據到TCP後close了Socket,客戶端再發送一包數據,而後接收消息
目的:測試在TCP對端進程發送數據後關閉Socket,本端進程還未檢測到鏈接關閉的狀況下發送一包消息,並接着接收消息
結論:客戶端可以成功發送第一包數據(這會致使服務器端發送一個RST包 <已抓包驗證>),客戶端再去Recv時,對於Windows和Linux程序有以下不一樣的表現:
Windows客戶端程序:Recv失敗,錯誤碼爲「10053: An established connection was aborted by the software in your host machine」
Linux客戶端程序:能正常接收完全部消息包,最後收到正常的對端關閉消息(這一點與Window下不同)rem
3.
服務器端在TCP的接收緩衝區中還有未接收數據的狀況下close了Socket,客戶端再收包
目的:測試在TCP的接收緩衝區中還有未接收數據的狀況下關閉Socket時,對端進程是否正常
結論:這種狀況服務器端就會向對端發送RST包,而不是正常的FIN包(已經抓包證實),這就會致使客戶端提早(RST包比正常數據包先被收到)收到「10054: An existing connection was forcibly closed by the remote host」(Windows下)或「104: Connection reset by peer」(Linux下)錯誤
總結:
當TCP鏈接的對端進程已經關閉了Socket的狀況下,本端進程再發送數據時,第一包能夠發送成功(但會致使對端發送一個RST包過來):
以後若是再繼續發送數據會失敗,錯誤碼爲「10053: An established connection was aborted by the software in your host machine」(Windows下)或「32: Broken pipe,同時收到SIGPIPE信號」(Linux下)錯誤;
以後若是接收數據,則Windows下會報10053的錯誤,而Linux下則收到正常關閉消息
TCP鏈接的本端接收緩衝區中還有未接收數據的狀況下close了Socket,則本端TCP會向對端發送RST包,而不是正常的FIN包,這就會致使對端進程提早(RST包比正常數據包先被收到)收到「10054: An existing connection was forcibly closed by the remote host」(Windows下)或「104: Connection reset by peer」(Linux下)錯誤