共用方式為


LPWSPCLOSESOCKET 回呼函式 (ws2spi.h)

LPWSPCloseSocket 函式會關閉套接字。

語法

LPWSPCLOSESOCKET Lpwspclosesocket;

int Lpwspclosesocket(
  [in]  SOCKET s,
  [out] LPINT lpErrno
)
{...}

參數

[in] s

識別套接字的描述項。

[out] lpErrno

錯誤碼的指標。

傳回值

如果沒有發生錯誤, LPWSPCloseSocket 會傳回零。 否則,會傳回SOCKET_ERROR值,而且 lpErrno 中提供特定的錯誤碼。

錯誤碼 意義
WSAENETDOWN
網路子系統失敗。
WSAEINPROGRESS
封鎖 Windows Sockets 呼叫正在進行中,或者服務提供者仍在處理回呼函式。
WSAENOTSOCK
描述項不是套接字。
WSAEWOULDBLOCK
套接字標示為非封鎖,SO_LINGER設定為非零逾時值。

備註

此函式會關閉套接字。 更精確地說,它會釋放套接字描述元 s,因此 對 s 的進一步參考應該會失敗,並出現 WSAENOTSOCK 錯誤。 如果這是基礎套接字的最後一個參考,則會捨棄相關聯的命名資訊和佇列數據。 此進程中任何線程所發出之 (套接字上擱置的封鎖或異步呼叫) 都會取消,而不會張貼任何通知訊息。 此進程中任何線程所發出的任何擱置重迭作業也會取消。 針對這些重疊作業所指定的完成動作, (例如事件、完成例程或完成埠) 。 在這裡情況下,擱置的重疊作業失敗,錯誤狀態 WSA_OPERATION_ABORTED 。 呼叫 LPWSPCloseSocket 之後,將不會張貼FD_CLOSE。

LPWSPCloseSocket 行為摘要如下:

  • 如果啟用SO_DONTLINGER (預設設定 ) ,LPWSPCloseSocket 會立即傳回,並在背景正常關閉連線。

  • 如果已啟用零逾時 SO_LINGER,LPWSPCloseSocket 會立即傳回,且連線已重設/終止。

  • 如果使用封鎖套接字的非零逾時啟用SO_LINGER, 則 LPWSPCloseSocket 會封鎖所有數據,直到傳送所有數據或逾時到期為止。

  • 如果使用非零的套接字啟用SO_LINGER, 則 LPWSPCloseSocket 會立即傳回,因此表示失敗。

LPWSPCloseSocket 的語意會受到套接字選項SO_LINGER和SO_DONTLINGER的影響,如下所示。

選項 間隔 關閉的類型 等候關閉嗎?
SO_DONTLINGER 不小心 非失誤性 No
SO_LINGER 零個 實心 No
SO_LINGER 非失誤性 Yes

 

 

如果SO_LINGER設定為 (,即使尚未傳送或認可佇列數據,LPWSPCloseSocket 仍不會封鎖延遲結構的l_onoff成員為非零) ,而逾時間隔l_linger為零。即使尚未傳送或認可佇列數據,仍不會封鎖 LPWSPCloseSocket。 這稱為硬式或中止關閉,因為套接字的虛擬線路會立即重設,而且任何未傳送的數據都會遺失。 線路遠端的任何 LPWSPRecv 呼叫都會因為 WSAECONNRESET 而失敗。

如果SO_LINGER在封鎖套接字上使用非零的逾時間隔進行設定, 則 LPWSPCloseSocket 呼叫會封鎖套接字上的區塊,直到剩餘的數據傳送或逾時到期為止。 這稱為正常中斷連線。 如果逾時在傳送所有數據之前到期,服務提供者應該在 LPWSPCloseSocket 傳回之前終止連線。

不建議在非封鎖套接字上啟用具有非零逾時間隔的SO_LINGER。 在此情況下,如果無法立即完成關閉作業, 對 LPWSPCloseSocket 的呼叫將會失敗,並出現 WSAEWOULDBLOCK 的錯誤。 如果 LPWSPCloseSocket 因 WSAEWOULDBLOCK 而失敗,套接字句柄仍然有效,且未起始中斷連線。

Winsock SPI 用戶端必須再次呼叫 LPWSPCloseSocket 以關閉套接字,雖然 LPWSPCloseSocket 可以繼續失敗,除非 Winsock SPI 用戶端執行下列其中一項:

  • 停用SO_DONTLINGER。
  • 啟用具有零逾時SO_LINGER。
  • 呼叫 LPWSPShutdown 以起始關閉。

如果在數據流套接字上設定SO_DONTLINGER (,則 linger 結構的l_onoff成員為零 ) 則 LPWSPCloseSocket 呼叫會立即傳回,而且不會取得 WSAEWOULDBLOCK,不論套接字是封鎖還是非封鎖。 不過,如果可能的話,任何排入傳輸佇列的數據都會在基礎套接字關閉之前傳送。 這稱為正常中斷連線,而且是默認行為。

請注意,在此情況下,允許 Winsock 提供者保留與套接字相關聯的任何資源,直到等到正常中斷連線完成,或提供者因為無法在提供者決定的時間時間內完成作業而終止連線。 這可能會影響預期使用所有可用套接字的 Winsock 用戶端。 這是預設行為;默認會設定SO_DONTLINGER。

規格需求

需求
最低支援的用戶端 Windows 2000 專業版 [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限傳統型應用程式]
標頭 ws2spi.h

另請參閱

LPWSPAccept

LPWSPIoctl

WSPSetSockOpt

LPWSPSocket