正常關機、揮之不去的選項和套接字關閉
下列材料會做為關閉關閉套接字連線關閉套接字的主體的釐清。 請務必區分關閉套接字連線和關閉套接字之間的差異。
關閉套接字連線牽涉到兩個端點之間的通訊協定訊息交換,之後稱為關機順序。 定義了兩個關機序列的一般類別:正常和中止(也稱為硬式)。 在正常關機順序中,任何已排入佇列但尚未傳輸的數據,都可以在連線關閉之前傳送。 在中止關機中,任何未傳送的數據都將遺失。 關機順序的發生(正常或中止)也可以用來提供FD_CLOSE指示給相關聯的應用程式,表示關機正在進行中。
另一方面,關閉套接字會導致套接字句柄解除分配,讓應用程式無法再以任何方式參考或使用套接字。
在 Windows Sockets 中,關機 函式,以及 WSASendDisconnect 函式都可以用來起始關機順序,而 closesocket 函式則用來解除分配套接字句柄,並釋放任何相關聯的資源。 不過,由於 closesocket 函式隱含地造成關機順序,如果尚未發生,就會產生一些混淆。 事實上,它已成為依賴這項功能的相當常見的程序設計做法,並使用 closesocket 來起始關機順序並解除分配套接字句柄。
為了方便使用此用法,套接字介面會透過允許程式設計人員指出隱含關機順序是否應正常運作或中止的套接字選項機制,以及 closesocket 函式是否應該揮之不去(未立即完成),以允許正常關機順序完成的時間。 這些重要的區別和使用 封閉式 的影響仍然不廣泛理解。
藉由為套接字選項SO_LINGER和SO_DONTLINGER建立適當的值,可以使用 closesocket函式來取得下列類型的行為:
- 中止關機順序,從 closesocket 立即傳回。
- 正常關機,延遲傳回,直到關機順序完成或指定的時間間隔經過為止。 如果時間間隔在正常關機順序完成之前到期,就會發生中止關機順序,並 closesocket 傳回。
- 正常關機,立即傳回-允許關機順序在背景中完成。 雖然這是預設行為,但應用程式無法知道何時(或)正常關機順序實際上完成。
SO_LINGER和SO_DONTLINGER套接字選項的使用,以及相關聯的 揮之 結構,會更詳細地討論 SOL_SOCKET 套接字選項 和 揮之 結構的參考小節。
一種可用來將連線卸除期間發生問題機率降到最低的技術是避免依賴 closesocket起始的隱含關機。 請改用兩個明確的關機函式之一,關機 或 WSASendDisconnect。 這又會導致對等應用程式收到FD_CLOSE指示,指出已收到所有暫止的數據。 為了說明這一點,下表顯示應用程式用戶端和伺服器元件所叫用的函式,其中用戶端負責起始正常關機。
用戶端 | 伺服器端 |
---|---|
(1) 叫用 關機(s,SD_SEND),以發出會話結束訊號,且客戶端沒有其他數據要傳送。 | |
(2) 接收FD_CLOSE,表示進行中正常關機,並已收到所有數據。 | |
(3) 傳送任何剩餘的響應數據。 | |
(僅限當地時間意義)取得FD_READ並呼叫 recv,以取得伺服器 所傳送的任何響應數據。 | (4) 叫用 關機(s, SD_SEND) 表示伺服器沒有其他資料要傳送。 |
(五)收到FD_CLOSE指示。 | (僅限當地時間意義)叫用 closesocket 。 |
(6) 叫用 關閉。 |