функция обратного вызова 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 предоставило этот указатель на подсистему WSK при вызове функции WskSocket для создания сокета прослушивания.
[in] Flags
Значение ULONG, содержащее следующий флаг или ноль:
WSK_FLAG_AT_DISPATCH_LEVEL
Подсистема WSK называется функцией обратного вызова событий WskAcceptEvent WskAcceptEvent в IRQL = DISPATCH_LEVEL. Если этот флаг не задан, подсистема WSK может вызвать функцию обратного вызова событий WSKAcceptEvent WskAcceptEvent на любой <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 приложения WSK WskAcceptEvent может вернуть один из следующих кодов NTSTATUS:
Возвращаемый код | Описание |
---|---|
|
Приложение WSK приняло входящее подключение. |
|
Приложение WSK отклонило входящее подключение. Если это значение возвращается, подсистема WSK закроет принятый сокет от имени приложения WSK. |
Замечания
Подсистема WSK вызывает функцию обратного вызова событий WSK приложения WSK WskAcceptEvent, если входящее подключение принимается в сокет прослушивания, только если функция обратного вызова события была включена с параметром сокета SO_WSK_EVENT_CALLBACK. Дополнительные сведения о включении функций обратного вызова событий сокета см. в разделе Включение и отключение функций обратного вызова событий.
Если функция обратного вызова событий WSK приложения WSK WskAcceptEvent включена в сокет прослушивания, а приложение имеет ожидающий вызов функции WskAccept на том же сокете прослушивания, Затем при поступлении входящего подключения ожидающий вызов WskAccept имеет приоритет над функцией обратного вызова событий WskAcceptEvent WskAcceptEvent. Подсистема WSK вызывает приложения WskAcceptEvent функцию обратного вызова событий только в том случае, если от ожидающих вызовов WskAccept нет очереди irPs. Однако приложение WSK не должно предполагать, что подсистема WSK не вызывает WskAcceptEvent функцию обратного вызова событий для прослушивающего сокета, имеющего ожидающий вызов функции WskAccept. Условия гонки существуют, где подсистема WSK по-прежнему может вызывать приложения WskAcceptEvent функцию обратного вызова событий для сокета. Единственный способ для приложения WSK, чтобы убедиться, что подсистема WSK не будет вызывать приложения WskAcceptEvent функцию обратного вызова событий для прослушивающего сокета заключается в отключении функции обратного вызова событий wskAcceptEvent приложения функции обратного вызова событий в сокете.
Когда подсистема WSK вызывает функцию обратного вызова событий WSK приложения WSK WskAcceptEvent, все функции обратного вызова событий в принятом сокете по умолчанию отключены. Если приложение WSK включает любую из функций обратного вызова событий, ориентированных на подключение, в сокете прослушивания эти функции обратного вызова событий будут включены по умолчанию для всех сокетов, ориентированных на подключение, которые принимаются в этом сокете прослушивания. Дополнительные сведения о включении любой из функций обратного вызова событий принятого сокета см. в разделе Включение и отключение функций обратного вызова событий.
Структуры SOCKADDR, на которые указывает localAddress и RemoteAddress, допустимы только в течение времени вызова функции обратного вызова WskAcceptEvent. Если приложению WSK требуются эти адреса транспорта позже, он может скопировать содержимое этих структур в собственные структуры SOCKADDR перед возвратом из функции обратного вызова событий WskAcceptEvent или позже вызвать WskGetLocalAddress и WskGetRemoteAddress функции на принятом сокете.
Подсистема WSK выделяет память для структуры объектов сокета (WSK_SOCKET) для принятого подключения от имени приложения WSK. Подсистема WSK освобождает эту память при закрытии сокета.
Подсистема WSK вызывает функцию обратного вызова событий WSK приложения WSK WskAcceptEvent обратного вызова событий в IRQL <= DISPATCH_LEVEL.
Функция обратного вызова событий приложения WSK WskAcceptEvent не должна ждать завершения других запросов WSK в контексте функций завершения или обратного вызова событий WSK. Обратный вызов может инициировать другие запросы WSK (если он не тратит слишком много времени на DISPATCH_LEVEL), но он не должен ждать завершения даже при вызове обратного вызова в IRQL = PASSIVE_LEVEL.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Доступно в Windows Vista и более поздних версиях операционных систем Windows. |
целевая платформа | Виндоус |
заголовка | wsk.h (include Wsk.h) |
IRQL | <= DISPATCH_LEVEL |