PFN_WSK_ACCEPT_EVENT回呼函式 (wsk.h)
WskAcceptEvent 事件回呼函式會通知 WSK 應用程式已接受接聽套接字上的連入連線。
語法
PFN_WSK_ACCEPT_EVENT PfnWskAcceptEvent;
NTSTATUS PfnWskAcceptEvent(
[in, optional] PVOID SocketContext,
[in] ULONG Flags,
[in] PSOCKADDR LocalAddress,
[in] PSOCKADDR RemoteAddress,
[in, optional] PWSK_SOCKET AcceptSocket,
[out] PVOID *AcceptSocketContext,
[out] const WSK_CLIENT_CONNECTION_DISPATCH **AcceptSocketDispatch
)
{...}
參數
[in, optional] SocketContext
接聽套接字內容的指標,此接聽套接字已接受連入連線。 WSK 應用程式在呼叫 WskSocket 函式來建立接聽套接字時,會提供 WSK 子系統的這個指標。
[in] Flags
包含下列旗標或零的 ULONG 值:
WSK_FLAG_AT_DISPATCH_LEVEL
在 IRQL = DISPATCH_LEVEL,名為 WskAcceptEvent 事件回呼函式的 WSK 子系統。 如果未設定此旗標,WSK 子系統可能會在任何 IRQL = DISPATCH_LEVEL呼叫 < 事件回呼函式。
[in] LocalAddress
緩衝區的指標,其中包含傳入連線到達的本機傳輸位址。 緩衝區包含特定的SOCKADDR結構類型,其對應至WSK應用程式在建立接聽套接字時所指定的位址系列。
[in] RemoteAddress
緩衝區的指標,其中包含傳入連線的來源遠端傳輸位址。 緩衝區包含特定的SOCKADDR結構類型,其對應至WSK應用程式在建立接聽套接字時所指定的位址系列。
[in, optional] AcceptSocket
WSK_SOCKET 結構的指標,該結構是接受之套接字的套接字物件。 如果此指標 NULL,則接聽套接字已不再運作,且 WSK 應用程式必須呼叫 WskCloseSocket 函式,以儘快關閉接聽套接字。
[out] AcceptSocketContext
接收所接受套接字之 WSK 應用程式所提供內容的指標之變數指標。 WSK 子系統會將這個指標傳遞至已接受套接字的事件回呼函式。 內容資訊對 WSK 子系統不透明,而且必須儲存在非分頁記憶體中。 如果 WSK 應用程式不會在接受的套接字上啟用任何事件回呼函式,應用程式應該將 AcceptSocketContext 參數所指向的變數設定為 NULL。
[out] AcceptSocketDispatch
接收常數指標之變數的指標 WSK_CLIENT_CONNECTION_DISPATCH 結構。 這個結構是一個分派數據表,其中包含所接受套接字之事件回呼函式的指標。 如果 WSK 應用程式不會針對接受的套接字啟用所有事件回呼函式,應用程式應該將分派數據表中的指標設定為 NULL 未啟用的事件回呼函式。 如果 WSK 應用程式不會在接受的套接字上啟用任何事件回呼函式,它應該將 AcceptSocketDispatch 參數所指向的變數設定為 NULL。
傳回值
WSK 應用程式的 WskAcceptEvent 事件回呼函式可以傳回下列其中一個 NTSTATUS 程式代碼:
傳回碼 | 描述 |
---|---|
|
WSK 應用程式已接受連入連線。 |
|
WSK 應用程式拒絕連入連線。 如果傳回此值,WSK 子系統會代表 WSK 應用程式關閉接受的套接字。 |
言論
只有在先前使用 SO_WSK_EVENT_CALLBACK 套接字選項啟用事件回呼函式時,WSK 子系統才會在接聽套接字上接受傳入連線時,呼叫 WSK 應用程式的 WskAcceptEvent 事件回呼函式。 如需啟用套接字事件回呼函式的詳細資訊,請參閱 啟用和停用事件回呼函式。
如果在接聽套接字上啟用 WSK 應用程式的 WskAcceptEvent 事件回呼函式,而且應用程式對相同接聽套接字上的 WskAccept 函式有擱置呼叫, 然後,當連入聯機到達時,WskAccept 的暫止呼叫優先於 WskAcceptEvent 事件回呼函式。 WSK 子系統只會在 WskAccept 函式的暫止 呼叫中沒有佇列的 IRP 時,才會呼叫應用程式的 WskAcceptEvent 事件回呼函式。 不過,WSK 應用程式不應該假設 WSK 子系統不會呼叫應用程式的 WskAcceptEvent 事件回呼函式,而接聽套接字具有 WskAccept 函式的暫止呼叫。 WSK 子系統仍可呼叫 WSK 應用程式的 WskAcceptEvent 套接字事件回呼函式的競爭條件。 WSK 應用程式確保 WSK 子系統不會呼叫應用程式的 WskAcceptEvent 接聽套接字事件回呼函式的唯一方式,就是停用應用程式在套接字上的 WskAcceptEvent 事件回呼函式。
當 WSK 子系統呼叫 WSK 應用程式的 WskAcceptEvent 事件回呼函式時,預設會停用接受套接字上的所有事件回呼函式。 如果 WSK 應用程式在接聽套接字上啟用任何連線導向套接字事件回呼函式,則接聽套接字上接受的所有連接導向套接字預設都會啟用這些事件回呼函式。 如需開啟任何已接受套接字事件回呼函式的詳細資訊,請參閱 啟用和停用事件回呼函式。
LocalAddress 和 RemoteAddress 參數所指向的 SOCKADDR 結構,只有在呼叫 WskAcceptEvent 事件回呼函式期間才有效。 如果 WSK 應用程式稍後需要這些傳輸位址,可以在從 WskAcceptEvent 事件回呼函式傳回之前,將這些結構的內容複製到自己的 SOCKADDR 結構,或稍後可以在接受的套接字上呼叫 WskGetLocalAddress 和 WskGetRemoteAddress 函式。
WSK 子系統會代表 WSK 應用程式,為接受的連接配置套接字對象結構的記憶體(WSK_SOCKET)。 WSK 子系統會在套接字關閉時解除分配此記憶體。
WSK 子系統會在 IRQL = DISPATCH_LEVEL 呼叫 WSK 應用程式的 < 事件回呼函式。
WSK 應用程式的 WskAcceptEvent 事件回呼函式不得等候 WSK 完成或事件回呼函式內容中的其他 WSK 要求完成。 回呼可以起始其他 WSK 要求(假設它不會花太多時間在DISPATCH_LEVEL),但即使在 IRQL = PASSIVE_LEVEL 呼叫回呼,也不得等待完成。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | 可在 Windows Vista 和更新版本的 Windows作系統中使用。 |
目標平臺 | 窗戶 |
標頭 | wsk.h (包括 Wsk.h) |
IRQL | <= DISPATCH_LEVEL |