共用方式為


shutdown 函式 (winsock2.h)

關機函式會停用通訊端上的傳送或接收。

語法

int WSAAPI shutdown(
  [in] SOCKET s,
  [in] int    how
);

參數

[in] s

識別通訊端的描述項。

[in] how

描述不再允許何種類型的作業的旗標。 此旗標的可能值列在 Winsock2.h 標頭檔中。

意義
SD_RECEIVE
0
關機接收作業。
SD_SEND
1
關機傳送作業。
SD_BOTH
2
關閉傳送和接收作業。

傳回值

如果沒有發生錯誤, 關機 會傳回零。 否則,會傳回SOCKET_ERROR的值,而且可以呼叫 WSAGetLastError來擷取特定的錯誤碼。

錯誤碼 意義
WSAECONNABORTED
此虛擬電路由於逾時或其他錯誤而終止。 此通訊端無法再使用,應用程式應予以關閉。

此錯誤僅適用于連線導向通訊端。

WSAECONNRESET
執行硬式或失敗關閉的遠端部分已重設此虛擬電路。 此通訊端無法再使用,應用程式應予以關閉。

此錯誤僅適用于連線導向通訊端。

WSAEINPROGRESS
封鎖的 Windows Sockets 1.1 呼叫正在進行中,或者服務提供者仍在處理回呼函式。
WSAEINVAL
參數無效的方式,或與通訊端類型不一致。 例如,SD_SEND與UNI_RECV通訊端類型搭配使用。
WSAENETDOWN
網路子系統失敗。
WSAENOTCONN
未連接此通訊端。 此錯誤僅適用于連線導向通訊端。
WSAENOTSOCK
注意 描述項不是通訊端。
 
WSANOTINITIALISED
使用此函式之前,必須先進行成功的 WSAStartup 呼叫。

備註

關機函式用於所有類型的通訊端,以停用接收、傳輸或兩者。

如果 參數如何 SD_RECEIVE,則不允許對通訊端上 recv 函式的後續呼叫。 這不會影響較低的通訊協定層。 針對 TCP 通訊端,如果通訊端上仍有資料排入佇列等候接收,或資料後續送達,則會重設連線,因為無法將資料傳遞給使用者。 針對 UDP 通訊端,會接受並排入傳入的資料包。 在此情況下,不會產生 ICMP 錯誤封包。

如果 參數如何 SD_SEND,則不允許對 send 函式的後續呼叫。 針對 TCP 通訊端,在接收者傳送和認可所有資料之後,將會傳送 FIN。

設定 如何 SD_BOTH停用傳送和接收,如上所述。

關機函式不會關閉通訊端。 在叫用 closesocket 之前,將不會釋放任何附加至通訊端的資源。

為了確保在關閉之前,所有資料都會在連線的通訊端上傳送和接收,應用程式應該先使用 關機 來關閉連線,再呼叫 closesocket。 一個等候遠端端已傳送所有資料並起始正常中斷連線的通知的方法,請使用 WSAEventSelect 函式,如下所示:

  1. 呼叫 WSAEventSelect 以註冊FD_CLOSE通知。
  2. 使用how=SD_SEND 呼叫關機
  3. 收到FD_CLOSE時,請呼叫 recvWSARecv ,直到函式完成並指出已收到零個位元組為止。 如果傳回SOCKET_ERROR,則無法正常中斷連線。
  4. 呼叫 closesocket
另一個等候遠端端已傳送所有資料並起始正常中斷連線的通知的方法,使用重迭的接收呼叫如下:
  1. 使用how=SD_SEND 呼叫關機
  2. 呼叫 recvWSARecv ,直到函式成功完成,並指出已收到零個位元組。 如果傳回SOCKET_ERROR,則無法正常中斷連線。
  3. 呼叫 closesocket
注意 不論通訊端上的SO_LINGER設定為何, 關機 函式都不會封鎖。
 

如需詳細資訊,請參閱 正常關機、Linger 選項和通訊端關閉一節。

呼叫 關機 函式以停用傳送、接收或兩者之後,就沒有方法可以重新啟用現有通訊端連線的傳送或接收。

應用程式不應該依賴在關閉通訊端之後重複使用通訊端。 特別是,Windows Sockets 提供者不需要支援在已關閉的通訊端上使用 連線

如果應用程式想要重複使用通訊端,則應該使用dwFlags參數設定為TF_REUSE_SOCKET來呼叫DisconnectEx函式,以關閉通訊端上的連線,並準備要重複使用的通訊端控制碼。 當 DisconnectEx要求完成時,通訊端控制碼可以傳遞至AcceptExConnectEx函式。

如果應用程式想要重複使用通訊端,可以使用設定為 TF_DISCONNECTdwFlags參數來呼叫TransmitFileTransmitPackets函式,並在所有資料排入佇列以供傳輸後TF_REUSE_SOCKET中斷連線,並準備要重複使用的通訊端控制碼。 當 TransmitFile要求完成時,通訊端控制碼可以傳遞至先前用來建立連接的函式呼叫,例如AcceptExConnectEx當 TransmitPackets函式完成時,通訊端控制碼可以傳遞至AcceptEx函式。

注意 通訊端層級中斷連線受限於基礎傳輸的行為。 例如,TCP 通訊端可能受限於 TCP TIME_WAIT狀態,導致 DisconnectExTransmitFileTransmitPackets 呼叫延遲。
 
注意 發出封鎖的 Winsock 呼叫,例如 關機時,Winsock 可能需要等候網路事件,才能完成呼叫。 Winsock 會在這種情況中執行可警示的等候,而非同步程序呼叫 (APC) 排程在同一個執行緒上,可能會中斷。 在 APC 內發出另一個封鎖 Winsock 呼叫,中斷相同執行緒上持續封鎖 Winsock 呼叫會導致未定義的行為,而且永遠不會由 Winsock 用戶端嘗試。
 

ATM 的注意事項

使用非同步傳輸模式 (ATM) 和 Windows 通訊端 2 時,連線終止有一個重要問題。 如需這些重要考慮的詳細資訊,請參閱 closesocket 函式參考一節中標題為 ATM 的附注一節。

Windows Phone 8:Windows Phone 8 和更新版本Windows Phone市集應用程式支援此函式。

Windows 8.1Windows Server 2012 R2:Windows 市集應用程式支援此功能,Windows 8.1、Windows Server 2012 R2 及更新版本。

規格需求

   
最低支援的用戶端 Windows 8.1、Windows Vista [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2003 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 winsock2.h (包含 Winsock2.h、Webhost.h)
程式庫 Ws2_32.lib
Dll Ws2_32.dll

另請參閱

AcceptEx

ConnectEx

DisconnectEx

TransmitFile

TransmitPackets

WSAEventSelect

Winsock 函式

Winsock 參考

connect

socket