closesocket 函式 (winsock2.h)
closesocket函式會關閉現有的通訊端。
語法
int WSAAPI closesocket(
[in] SOCKET s
);
參數
[in] s
描述項,識別要關閉的通訊端。
傳回值
如果沒有發生錯誤, closesocket 會傳回零。 否則,會傳回 SOCKET_ERROR 的值,並呼叫 WSAGetLastError來擷取特定的錯誤碼。
錯誤碼 | 意義 |
---|---|
使用這個函式之前,必須先進行成功的 WSAStartup 呼叫。 | |
網路子系統失敗。 | |
描述項不是通訊端。 | |
封鎖的 Windows Sockets 1.1 呼叫正在進行中,或服務提供者仍在處理回呼函式。 | |
(封鎖) Windows Socket 1.1 呼叫已透過 WSACancelBlockingCall取消。 | |
通訊端標示為非封鎖,但linger結構的l_onoff成員會設定為非零值,而linger結構的l_linger成員會設定為非零逾時值。 |
備註
closesocket函式會關閉通訊端。 使用它來釋放在 s 參數中傳遞的通訊端描述元。 請注意,在發出closesocket函式時,系統可能會立即重複使用傳入s參數的通訊端描述項。 因此,預期傳入 s 參數之通訊端描述元的進一步參考無法失敗,並出現錯誤 WSAENOTSOCK。 Winsock 用戶端絕對不能在與另一個 Winsock 函數調用同時發出closesocket。
( WSASend/ WSASendTo/ WSARecv WSARecvWSARecvFrom/ 的任何擱置重迭傳送和接收作業,也會取消此進程中任何執行緒所發出的重迭通訊端) 。 會執行針對這些重迭作業指定的任何事件、完成常式或完成埠動作。 擱置的重迭作業失敗,錯誤狀態 WSA_OPERATION_ABORTED。
應用程式不應該假設通訊端上任何未完成的 I/O 作業都會保證會在 closesocket 傳回時完成。 closesocket函式會在未處理的 I/O 作業上起始取消,但這並不表示應用程式會在關閉ocket函式傳回時收到這些 I/O 作業的 I/O 完成。 因此,應用程式不應該清除 WSAOVERLAPPED 結構 (任何資源,例如) 未處理 I/O 要求所參考,直到 I/O 要求確實完成為止。
應用程式應該一律有一個相符的呼叫,可讓每個成功呼叫通訊端的closesocket,將任何通訊端資源傳回系統。
linger結構會維護特定通訊端的相關資訊,指定當資料排入佇列傳送時該通訊端的行為,並在通訊端上呼叫closesocket函式。
linger結構的l_onoff成員會決定通訊端是否應該在closesocket函式呼叫之後保留開啟指定的時間,以便傳送佇列資料。 此成員可以透過兩種方式修改:
- 呼叫 setsockopt 函式,並將 optname 參數設定為 SO_DONTLINGER。 optval參數會決定l_onoff成員的修改方式。
- 呼叫 setsockopt 函式,並將 optname 參數設定為 SO_LINGER。 optval參數會指定如何修改l_onoff和l_linger成員。
linger結構的l_linger成員決定通訊端應該保持開啟的時間量,以秒為單位。 只有當linger結構的l_onoff成員為非零時,才適用這個成員。
通訊端的預設參數是linger結構的l_onoff成員為零,表示通訊端不應保持開啟狀態。 linger結構l_linger成員的預設值為零,但當l_onoff成員設定為零時,會忽略此值。
若要讓通訊端保持開啟狀態,應用程式應將 l_onoff 成員設定為非零值,並將 l_linger 成員設定為所需的逾時,以秒為單位。 若要停用剩餘開啟的通訊端,應用程式只需要將延遲結構l_onoff成員設定為零。
如果應用程式呼叫 setockopt 函式,並將 optname 參數設定為 SO_DONTLINGER 以將 l_onoff 成員設定為非零值,則不會指定 l_linger 成員的值。 在此情況下,使用的逾時取決於實作。 如果先前呼叫 setockopt 函式且optname參數設定為SO_LINGER) 的setockopt函式,已為通訊端 (建立先前逾時,服務提供者應恢復此逾時值。
closesocket函式的語意會受到設定linger結構成員的通訊端選項所影響。
l_onoff | l_linger | 關閉的類型 | 等候關閉嗎? |
---|---|---|---|
零 | 不小心 | 正常關閉 | 否 |
零 | 零 | 實心 | 否 |
零 | 零 |
如果所有資料在 l_linger 成員中指定的逾時值內傳送,則為正常。
如果所有資料無法在 l_linger 成員中指定的逾時值內傳送,則為困難。 |
Yes |
如果LINGER結構的l_onoff成員在資料流程通訊端上為零,closesocket呼叫會立即傳回,而且不會接收WSAEWOULDBLOCK,不論通訊端是封鎖還是非封鎖。 不過,在基礎通訊端關閉之前,會盡可能傳送任何排入佇列進行傳輸的資料。 這也稱為正常中斷連線或關閉。 在此情況下,Windows Sockets 提供者無法釋放通訊端和其他資源一段任意期間,因而影響預期使用所有可用通訊端的應用程式。 這是通訊端的預設行為。
如果linger結構的l_onoff成員為非零,且l_linger成員為零,即使尚未傳送或認可佇列資料,也不會封鎖closesocket。 這稱為硬式或中止關閉,因為通訊端的虛擬線路會立即重設,而且任何未傳送的資料都會遺失。 在 Windows 上,線路遠端端的任何 recv 呼叫都會因為 WSAECONNRESET而失敗。
如果linger結構的l_onoff成員設定為非零,且l_linger成員在封鎖通訊端上設定為非零逾時,則 closesocket呼叫會封鎖,直到傳送剩餘的資料或逾時到期為止。 如果在 l_linger 成員中指定的逾時值內傳送所有資料,這稱為正常中斷連線或關閉。 如果逾時在傳送所有資料之前到期,Windows Sockets 實作會在 closesocket 傳回之前終止連線,這稱為硬式或中止關閉。
不建議在非封鎖通訊端上將linger結構的l_onoff成員設定為非零,而且不建議使用非零逾時間隔的l_linger成員。 在此情況下,如果關閉作業無法立即完成, 對 closesocket 的呼叫將會失敗,並出現 WSAEWOULDBLOCK 錯誤。 如果 closesocket 因 WSAEWOULDBLOCK 而失敗,通訊端控制碼仍然有效,而且不會起始中斷連線。 應用程式必須再次呼叫 closesocket ,才能關閉通訊端。
如果linger結構的l_onoff成員為非零,且l_linger成員是封鎖通訊端的非零逾時間隔,則closesocket函式的結果無法用來判斷所有資料是否已傳送至對等。 如果在 l_linger 成員中指定的逾時之前傳送資料,或連接已中止, closesocket 函式將不會傳回錯誤碼, (closesocket 函式的傳回值是零) 。
closesocket呼叫只會封鎖,直到所有資料傳遞至對等或逾時到期為止。 如果連線因為逾時過期而重設,通訊端就不會進入TIME_WAIT狀態。 如果在逾時期間內傳送所有資料,通訊端就可以進入TIME_WAIT狀態。
如果延遲結構l_onoff成員為非零,且l_linger成員為封鎖通訊端的零逾時間隔,則closesocket的呼叫將會重設連線。 通訊端不會進入TIME_WAIT狀態。
您可以使用optname參數設定為SO_LINGER來呼叫getsockopt函式,以擷取與通訊端相關聯之 linger結構的目前值。
以下是 closesocket 行為的摘要:
- 如果LINGER結構的l_onoff成員為零, (通訊端) 的預設值,closesocket會立即傳回,且連接會在背景正常關閉。
- 如果linger結構的l_onoff成員設定為非零,且l_linger成員設定為零, (沒有逾時) closesocket會立即傳回,且連接已重設或終止。
- 如果linger結構的l_onoff成員設定為非零,且l_linger成員設定為非零逾時:– 對於封鎖通訊端,closesocket會封鎖直到傳送所有資料或逾時到期為止。
– 針對非封鎖通訊端, closesocket 會立即傳回指出失敗。
如需詳細資訊,請參閱 正常關機、Linger 選項和通訊端關閉 以取得詳細資訊。
IrDA 通訊端注意事項
請記住下列要點:
- 必須明確包含 Af_irda.h 標頭檔。
- 支援標準 linger 選項。
- 雖然 IrDA 未提供正常關閉,但 IrDA 會延遲關閉,直到清除接收佇列為止。 因此,應用程式可以傳送資料並立即呼叫 通訊端 函式,並確信接收者會在接收FD_CLOSE訊息之前先複製資料。
ATM 的注意事項
以下是使用非同步傳輸模式 (ATM) 和 Windows Sockets 2 時,與連線終止相關的重要問題:
- 使用 closesocket 或 shutdown 函式搭配SD_SEND或SD_BOTH會導致在控制通道上傳送 RELEASE 訊號。 由於 ATM 使用個別的訊號和資料通道,RELEASE 訊號可能會在最後一個資料到達目的地之前觸達遠端端,因而造成該資料遺失。 其中一個可能的解決方案是在傳送的最後一個資料與 ATM 通訊端的 closesocket 或 shutdown 函式呼叫之間,設計足夠的延遲。
- ATM 不支援半關閉。
- 中止和正常中斷連線會導致 RELEASE 訊號以相同的原因欄位送出。 不論是哪一種情況,在通訊端的遠端端接收的資料仍會傳遞至應用程式。 如需詳細資訊 ,請參閱正常關機、Linger 選項和通訊端關閉 。
Windows Phone 8:Windows Phone Windows Phone 8 和更新版本上的市集應用程式支援此函式。
Windows 8.1和Windows 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) |
程式庫 | Ws2_32.lib |
Dll | Ws2_32.dll |