0
因此,想象一下客戶端從套接字讀取並讀取返回0的情況。這意味着EOF或服務器已關閉連接。當服務器關閉連接時,客戶端是否還需要調用關閉
客戶端是否也應該關閉此文件描述符?如果客戶端不調用close,會導致某些文件描述符泄漏?
因此,想象一下客戶端從套接字讀取並讀取返回0的情況。這意味着EOF或服務器已關閉連接。當服務器關閉連接時,客戶端是否還需要調用關閉
客戶端是否也應該關閉此文件描述符?如果客戶端不調用close,會導致某些文件描述符泄漏?
是的,你仍然需要關閉它。即使遠程主機已關閉連接,您的機器上仍存在句柄。
您仍然可以參考插座(調用各種方法,它包括read()
即使連接本身是封閉的。你叫close()
手柄已完全消失後,所以調用方法更容易造成分段錯誤不是簡單地返回0。
要清楚。調用close()
具有兩個動作。
因此,即使遠程主機關閉了套接字,您仍然需要接近清理內存。
因此,當服務器關閉連接時,內核中仍有一些狀態仍然存在於客戶端中。那麼,當客戶端調用close時,FIN是否發送給服務器?如果是,那麼即使服務器需要爲該tcp連接保留一些狀態,直到客戶端調用關閉。 – 0xhacker 2013-05-01 15:33:02
是的,如果套接字在遠程主機關閉連接時被破壞,則後續調用會向操作系統請求不存在的東西,並且會使應用程序崩潰。因此,即使連接消失,「套接字」也必須存在,直到本地應用程序調用close()。連接一直存在,直到本地應用程序或遠程應用程序調用close()或其他超時發生。 – 2013-05-01 15:41:41
使用封閉的套接字*返回一個錯誤代碼。*它不會導致分段違規或程序崩潰。 – EJP 2013-05-01 22:51:02