正常關機,延遲選項和套接字關

提供了以下材料,以闡明關閉套接字連接以關閉套接字的主題。重要的是區分關閉套接字連接和關閉套接字之間的區別。

關閉套接字連接涉及兩個端點之間的協議消息交換,以下稱爲關閉序列。定義了兩種常規的關閉順序類:正常和異常(也稱爲“硬”)。在正常關閉順序中,可以在關閉連接之前發送已排隊但尚未傳輸的任何數據。在異常關閉中,所有未發送的數據都會丟失。關閉序列的出現(正常或異常)也可以用於向關聯的應用程序提供FD_CLOSE指示,表明正在進行關閉。

另一方面,關閉套接字會使套接字句柄釋放,以便應用程序無法再以任何方式引用或使用套接字。

在Windows套接字中,關閉功能和WSASendDisconnect功能都可以用於啓動關閉序列,而closesocket功能用於取消分配套接字句柄並釋放任何關聯的資源。但是,由於closesocket函數隱式導致關閉序列發生(如果尚未發生),因此會引起一定程度的混亂。實際上,依靠該功能並使用closesocket來啓動關閉序列並釋放套接字句柄已經成爲一種相當普遍的編程實踐。

爲了促進這種用法,套接字接口通過套接字選項機制提供了控制,該機制允許程序員指示隱式關閉序列應該是平穩的還是中止的,以及closesocket函數是否應該持續(不是立即完成)以便有時間完成正常的關機程序。這些重要的區別和以這種方式使用closesocket的後果仍未被廣泛理解。

通過爲套接字選項SO_LINGER和SO_DONTLINGER建立適當的值,可以使用closesocket函數獲得以下類型的行爲:

異常關閉順序,立即從closesocket返回。
正常關機,延遲返回直到關機順序完成或經過指定的時間間隔。如果在正常關閉序列完成之前該時間間隔到期,則會發生異常關閉序列,並且closesocket返回。
正常關機,立即返回—允許關機序列在後臺完成。儘管這是默認行爲,但應用程序無法知道正常關閉序列何時(或是否)實際完成。
使用的SO_LINGER和SO_DONTLINGER套接字選項和相關聯的留連結構進行更詳細的在所述參考部分中討論SOL_SOCKET套接字選項和留連結構。

可以用來減少連接斷開期間出現問題的機會的一種技術是避免依賴closesocket啓動隱式關閉。而是使用兩個顯式關閉功能之一shutdown或WSASendDisconnect。這進而導致對等應用程序接收到FD_CLOSE指示,該指示指示已接收到所有未決數據。爲了說明這一點,下表顯示了應用程序的客戶端和服務器組件將調用的功能,其中客戶端負責啓動正常關機。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章