TCP有半關閉的情況,如果要全關閉,需要雙方向對端發送Fin報文,然後對對方的Find報文進行響應(Ack)
shutdown表示不再發送資料,但是並沒有發送Fin報文,沒有終止串連,實際上TCP串連仍然存在,這時如果你要重建立立該Socket對(源/目的連接埠,源/目的IP均相同)的話是會失敗的,因為串連還存在,你就不能重複建立
如果closesocket後表明串連已經徹底終止了,可以重新用connect/accept建立串連
closesocket函數用來關閉一個描述符為s通訊端。由於每個進程中都有一個通訊端描述符表,表中的每個通訊端描述符都對應了一個位於作業系統緩衝區中的通訊端資料結構,因此有可能有幾個通訊端描述符指向同一個通訊端資料結構。通訊端資料結構中專門有一個欄位存放該結構的被引用次數,即有多少個通訊端描述符指向該結構。當調用closesocket函數時,作業系統先檢查通訊端資料結構中的該欄位的值,如果為1,就表明只有一個通訊端描述符指向它,因此作業系統就先把s在通訊端描述符表中對應的那條表項清除,並且釋放s對應的通訊端資料結構;如果該欄位大於1,那麼作業系統僅僅清除s在通訊端描述符表中的對應表項,並且把s對應的通訊端資料結構的引用次數減1。
closesocket函數如果執行成功就返回0,否則返回SOCKET_ERROR。
shutdown():停止 Socket 接收/傳送的功能。
格式: int PASCAL FAR shutdown( SOCKET s, int how );
參數: s Socket 的識別碼,how 代表該停止那些動作的標幟
傳回值: 成功 - 0
失敗 - SOCKET_ERROR (呼叫 WSAGetLastError()可得知原因)
說明: 此函式用來停止 Socket 的後續接收或傳送的功能。
若 how 的值為 0,則不再接收資料。
若 how 的值為 1,則不再允許傳送資料。
若 how 的值為 2,則不再接收且不再傳送資料。
shutdown() 函式並沒有將 Socket 關閉,所以該 Socket 所佔用之資源必須在呼叫closesocket() 之後才會釋放。
如果一個通訊端在使用完之後沒有CloseSocket,那麼連接埠等資源沒有斷開,當再利用此連接埠bind通訊端時,bind函數就會出錯。