網路編程–closesocket(s)與shutdown(s,type)的區別

來源:互聯網
上載者:User

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函數就會出錯。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.