WSACleanup 函式 (winsock.h)

WSACleanup 函式會終止使用 Winsock 2 DLL (Ws2_32.dll) 。

Syntax

int WSACleanup();

傳回值

如果作業成功,則傳回值為零。 否則,會傳回SOCKET_ERROR值,而且可以呼叫 WSAGetLastError 來擷取特定的錯誤號碼。

在多線程環境中, WSACleanup 會終止所有線程的 Windows Sockets 作業。

錯誤碼 意義
WSANOTINITIALISED
使用此函式之前,必須先進行成功的 WSAStartup 呼叫。
WSAENETDOWN
網路子系統失敗。
WSAEINPROGRESS
封鎖的 Windows Sockets 1.1 呼叫正在進行中,或者服務提供者仍在處理回呼函式。

備註

必須先執行成功的 WSAStartup 呼叫,才能使用 Windows Sockets 服務的應用程式或 DLL。 當它完成 Windows Sockets 的使用時,應用程式或 DLL 必須呼叫 WSACleanup 以從 Windows Sockets 實作取消註冊本身,並允許實作釋放代表應用程式或 DLL 配置的任何資源。

呼叫 WSACleanup 時,此進程中任何線程所發出的任何擱置封鎖或異步 Windows Sockets 呼叫都會取消,而不會張貼任何通知訊息,也不會發出任何事件物件的訊號。 任何擱置重疊的傳送或接收作業, (WSASendWSASendToWSARecvWSARecvFrom 搭配重疊套接字,例如,如果指定了,任何線程所發出的) 也會取消,而不需設定事件物件或叫用完成例程。 在此情況下,擱置的重迭作業失敗,錯誤狀態 WSA_OPERATION_ABORTED

呼叫 WSACleanup 時開啟的套接字會重設,並自動解除分配,就像呼叫 closesocket 一樣。 已使用 closesocket 關閉但仍然要傳送暫止數據的套接字,在呼叫 WSACleanup 時可能會受到影響。 在此情況下,如果應用程式結束時,從記憶體卸除 WS2_32.DLL,暫止的數據可能會遺失。 為了確保傳送所有擱置的數據,應用程式應該使用 關機 來關閉連線,然後等到關閉完成,再呼叫 closesocketWSACleanup。 所有資源和內部狀態,例如已排入佇列的未張貼或張貼的訊息,都必須解除分配,才能供下一位使用者使用。

每個成功呼叫 WSAStartup 時,都必須呼叫 WSACleanup 只有最終 的 WSACleanup 函式呼叫會執行實際的清除。 上述呼叫只會遞減 WS2_32.DLL 中的內部參考計數。

注意WSACleanup 不會將名稱取消註冊 (對等名稱,例如) 可能已向 Windows Sockets 命名空間提供者註冊,例如對等名稱解析通訊協定 (PNRP) 命名空間提供者。
 
在 Windows Sockets 1.1 中,嘗試從封鎖攔截內呼叫 WSACleanup ,然後無法檢查傳回碼是常見的程式設計錯誤。 如果 Winsock 1.1 應用程式必須在封鎖呼叫未完成時結束,應用程式必須先取消 WSACancelBlockingCall 的封鎖呼叫,然後在控件傳回應用程式之後發出 WSACleanup 呼叫。 在 Windows Sockets 2 中,此問題不存在,且已移除 WSACancelBlockingCall 函式

WSACleanup 函式通常會導致卸除通訊協定特定的協助程式 DLL。 因此,不應該從應用程式 DLL 中的 DllMain 函式呼叫 WSACleanup 函式。 這可能會造成死結。 如需詳細資訊,請參閱 DLL Main 函式

Windows Phone 8:Windows Phone 8 和更新版本 Windows Phone 上的 Windows Phone Store 應用程式支援此函式。

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
標頭 winsock.h (包含 Winsock2.h)
程式庫 Ws2_32.lib
Dll Ws2_32.dll

另請參閱

PNRP 命名空間提供者 API

WSAStartup

Winsock 函式

Winsock 參考

closesocket

shutdown