問題
今天考察網絡編程的基礎知識。
在基于 TCP? 協議的網絡 【socket 編程】中可能會遇到很多異常,在下面的相關描述中說法正確的有哪幾項呢?
A. 在建立連接被拒絕時,有可能是因為網絡不通或地址錯誤或 server 端對應端口未被監聽;
B. 在對 socket 連接執行讀寫操作時,如果一個數據包沒有被完整讀出或完整寫入,繼續進行讀寫操作即可,除非連接已經斷開;
C. 如果對方關閉了 socket 連接,我們是可以繼續對 socket 進行讀操作的,直至讀完最后一個字節,也可以繼續對 socket 進行寫操作,直至碰到錯誤異常;
D. 當自己關閉了 socket 連接,如果繼續讀或寫時,會發生 “use of closed network connection” 錯誤。
解析
對 TCP Socket 編程過程中遇到的五大類問題總結如下:
一、建立連接問題
? ?(1)連接拒絕:?網絡 ping 不通;ip 或 port 指定錯誤;server 未啟動;?
? ?(2)listen backlog 滿:增大 server 端 listen backlog 隊列;耐心等server端接收;
? ?(3)網絡延遲較大:client 端超時處理;重連。
二、從連接中讀數據問題
? ?(1)無數據可讀:繼續阻塞 read 即可,直到有數據可讀或 socket 連接斷開時發生讀錯誤;
? ?(2)數據不足(沒有讀取到完整的數據包):TCP 是流式數據傳輸協議,繼續讀即可;?
? ?(3)讀超時:會有這種情況嗎?(除非上層業務添加超時參數)
三、向連接寫數據問題
? ?(1)寫阻塞:本地緩沖區或對方緩沖區已滿,繼續阻塞寫即可;
? ?(2)只寫入部分數據:TCP 是流式數據傳輸協議,繼續寫即可 。??
四、線程安全問題
? ?(1)多線程讀一個 socket:有序下車,不能亂(lock),每個線程讀完一個完整的數據包后再走;?
? ?(2)多線程寫一個 socket:有序上車,不要亂(lock),每個線程寫完一個完整的數據包后再走。
五、關閉連接問題
? ?(1)自己關閉 socket 后自己繼續寫數據 ?:use of closed network connection;
? ?(2)自己關閉 socket 后自己繼續讀數據:use of closed network connection;
? ?(3)對方關閉 socket 后自己繼續寫數據:可能寫一部分,然后:An existing connection was forcibly closed by the remote host;
? ?(4)對方關閉 socket 后自己繼續讀數據:緩沖區的數據先全部讀出來,然后:EOF。
這五大類問題,筆者都曾通過Go語言?一 一 驗證過;深入理解常見的TCP Socket 編程問題,可以大大夯實我們的網絡編程能力,能為我們后續學習分布式奠定基礎!
參考答案
ABCD