正常關機、移轉選項和通訊端關閉

提供下列材質,以厘清關閉關閉通訊端連線關閉通訊端的主體。 請務必區分關閉通訊端連線和關閉通訊端之間的差異。

關閉通訊端連線牽涉到兩個端點之間的通訊協定訊息交換,之後稱為關機順序。 已定義兩個關機序列的一般類別:正常和中止的 (也稱為硬式) 。 在正常關機順序中,任何已排入佇列但尚未傳輸的資料,都可以在關閉連線之前傳送。 在中止關機中,任何未傳送的資料都將遺失。 關機順序 (正常或中止) 也可以用來提供FD_CLOSE指示給相關聯的應用程式,表示關機正在進行中。

另一方面,關閉通訊端會導致通訊端控制碼解除配置,讓應用程式無法再參考或使用通訊端。

在 Windows Sockets 中, 關機 函式和 WSASendDisconnect 函式都可以用來起始關機順序,而 closesocket 函式則用來解除配置通訊端控制碼,並釋放任何相關聯的資源。 不過,由於 closesocket 函式隱含地導致關閉順序尚未發生,就會發生一些混淆。 事實上,它已成為依賴這項功能的常見程式設計做法,並使用 closesocket 來起始關機順序並解除配置通訊端控制碼。

為了方便使用此用法,通訊端介面會透過允許程式設計人員指出隱含關機順序是否應正常或中止的通訊端選項機制來提供控制項,以及 closesocket 函式是否應該在未立即完成) (,以允許正常關機順序完成的時間。 以這種方式使用 closesocket 的這些重要區別和影響仍然不廣泛瞭解。

藉由建立通訊端選項SO_LINGER和SO_DONTLINGER的適當值,可以使用 closesocket 函式取得下列類型的行為:

  • 中止關機順序,立即從 closesocket傳回。
  • 正常關機,延遲傳回直到關機順序完成或經過指定的時間間隔為止。 如果時間間隔在正常關機順序完成之前到期,就會發生中止關機順序,並 傳回 closesocket
  • 正常關機,立即傳回—允許在背景中完成關機順序。 雖然這是預設行為,但應用程式無法知道何時 (或) 正常關機順序是否實際完成。

SO_LINGER和SO_DONTLINGER通訊端選項和相關聯的 linger 結構用法會在 SOL_SOCKET 通訊端選項linger 結構的參考小節中更詳細地討論。

一種技術可用來將連線終止期間發生的問題機率降到最低,就是避免依賴 closesocket起始的隱含關機。 請改用兩個明確關機函式之一 :shutdownWSASendDisconnect。 如此一來,對等應用程式就會收到FD_CLOSE指示,指出已收到所有擱置的資料。 為了說明這一點,下表顯示應用程式用戶端和伺服器元件所叫用的函式,其中用戶端負責起始正常關機。

用戶端 伺服器端
(1) 叫用 關機 (s,SD_SEND) 以發出會話結束訊號,且用戶端沒有其他要傳送的資料。
(2) 接收FD_CLOSE,指出進行中的正常關機,並已收到所有資料。
(3) 傳送任何剩餘的回應資料。
(本機計時重要性,) 取得FD_READ,並呼叫 recv 以取得伺服器 所傳送的任何回應資料。 (4) 叫用 關機 (s,SD_SEND) 表示伺服器沒有要傳送的資料。
(5) 接收FD_CLOSE指示。 (本機計時重要性僅) 叫用 closesocket
(6) Invokes closesocket