① Socket 編程中 close() 和 shutdown() 有什麼區別
一、指代不同
1、shutdown() :是指禁止在一個套介面上進行數據的接收與發送。
2、close():關閉一個套介面。更確切地說,它釋放套介面描述字s,以後對s的訪問均以WSAENOTSOCK錯誤返回。
二、原理不同
1、shutdown() :how參數為0,則該套介面上的後續接收操作將被禁止。這對於低層協議無影響。對於TCP協議,TCP窗口不改變並接收前來的數據(但不確認)直至窗口滿。對於UDP協議,接收並排隊前來的數據。任何情況下都不會產生ICMP錯誤包。
2、close():為對套介面的最後一次訪問,則相應的名字信息及數據隊列都將被釋放。closesocket()的語義受SO_LINGER與SO_DONTLINGER選項影響。
三、特點不同
1、shutdown() :一個應用程序不應依賴於重用一個已被shutdown()禁止的套介面。特別地,一個WINDOWS套介面實現不必支持在這樣的套介面上使用connect()調用。
2、close():如無錯誤發生,則closesocket()返回0。否則的話,返回SOCKET_ERROR錯誤,應用程序可通過WSAGetLastError()獲取相應錯誤代碼。