1. 程式人生 > >Socket之shutdown()用法

Socket之shutdown()用法

超出 線程 出現 shutdown ket 如果 函數 嘗試 通信

通常來說,socket是雙向的,即數據是雙向通信的。但有些時候,你會想在socket上實現單向的socket,即數據往一個方向傳輸。

單向的socket便稱為半開放Socket。要實現半開放式,需要用到shutdown()函數。

一般來說,半開放socket適用於以下場合:

(1)當你想要確保所有寫好的數據已經發送成功時。如果在發送數據的過程中,網絡意外斷開或者出現異常,系統不一定會返回異常,這是你可能以為對端已經接收到數據了。這時需要用shutdown()來確定數據是否發送成功,因為調用shutdown()時只有在緩存中的數據全部發送成功後才會返回。

(2)想用一種方法來捕獲程序潛在的錯誤,這錯誤可能是因為往一個不能寫的socket上寫數據,也有可能是在一個不該讀操作的socket上讀數據。當程序嘗試這樣做時,將會捕獲到一個異常,捕獲異常對於程序排錯來說是相對簡單和省勁的。

(3)當您的程序使用了fork()或者使用多線程時,你想防止其他線程或進程訪問到該資源,又或者你想立刻關閉這個socket,那麽可以用shutdown()來實現。

另外說一下,如果調用了Close()函數,程序中只是確保了對於某個特定的進程或線程來說,該連接是關閉的;但socket只有在所有的進程調用了Close()或者socket超出了工作範圍時,才會真正的被關閉或刪除。而如果想立刻關閉socket,那麽可以通過shutdown()來實現。

shutdown()的調用是需要一個參數:0代表禁止下次的數據讀取;1代表禁止下次的數據寫入;2代表禁止下次的數據讀取和寫入。

同時,shutdown()的效果是累計的,不可逆轉的。既如果關閉了一個方向數據傳輸,那麽這個方向將會被關閉直至完全被關閉或刪除,而不能重新被打開。如果第一次調用了shutdown(0),第二次調用了shutdown(1),那麽這時的效果就相當於shutdown(2),也就是雙向關閉socket。

Socket之shutdown()用法