функция обратного вызова PFN_WSK_ACCEPT (wsk.h)
Функция WskAccept принимает входящее подключение в сокете прослушивания.
Синтаксис
PFN_WSK_ACCEPT PfnWskAccept;
NTSTATUS PfnWskAccept(
[in] PWSK_SOCKET ListenSocket,
ULONG Flags,
[in, optional] PVOID AcceptSocketContext,
[in, optional] const WSK_CLIENT_CONNECTION_DISPATCH *AcceptSocketDispatch,
[out, optional] PSOCKADDR LocalAddress,
[out, optional] PSOCKADDR RemoteAddress,
[in, out] PIRP Irp
)
{...}
Параметры
[in] ListenSocket
Указатель на структуру WSK_SOCKET , указывающую объект сокета для прослушивающего или потокового сокета, проверяемого на наличие входящего подключения.
Flags
Этот параметр зарезервирован для системного использования. Приложение WSK должно задать для этого параметра нулевое значение.
[in, optional] AcceptSocketContext
Указатель на предоставленный вызывающим контекстом для принимаемого сокета. Подсистема WSK передает этот указатель на функции обратного вызова событий принятого сокета. Сведения о контексте непрозрачны для подсистемы WSK. Сведения о контексте должны храниться в памяти без страниц. Если приложение WSK не будет включать функции обратного вызова событий в принятом сокете, оно должно задать для этого указателя значение NULL.
[in, optional] AcceptSocketDispatch
Указатель на константу структура WSK_CLIENT_CONNECTION_DISPATCH . Эта структура представляет собой таблицу диспетчеризации, содержащую указатели на функции обратного вызова событий для принятого сокета. Если приложение WSK не будет включать все функции обратного вызова событий для принятого сокета, оно должно задать указателям в таблице диспетчеризации значение NULL для тех функций обратного вызова событий, которые оно не включает. Если приложение WSK не будет включать функции обратного вызова событий в принятом сокете, оно должно задать для этого указателя значение NULL.
[out, optional] LocalAddress
Указатель на буфер, выделенный вызывающим объектом, который получает адрес локального транспорта, по которому поступило входящее подключение. Буфер должен находиться в нестраничной памяти. Буфер также должен быть достаточно большим, чтобы содержать конкретный тип структуры SOCKADDR, соответствующий семейству адресов, которое приложение WSK указало при создании сокета прослушивания. Этот указатель является необязательным и может иметь значение NULL.
[out, optional] RemoteAddress
Указатель на буфер, выделенный вызывающим объектом, который получает адрес удаленного транспорта, из которого возникло входящее подключение. Буфер должен находиться в нестраничной памяти. Буфер также должен быть достаточно большим, чтобы содержать конкретный тип структуры SOCKADDR, соответствующий семейству адресов, которое приложение WSK указало при создании сокета прослушивания. Этот указатель является необязательным и может иметь значение NULL.
[in, out] Irp
Указатель на выделенный вызывающим методом IRP, который подсистема WSK использует для асинхронного завершения операции принятия. Дополнительные сведения об использовании IRP с функциями WSK см. в статье Использование irPs с функциями ядра Winsock.
Возвращаемое значение
WskAccept возвращает один из следующих кодов NTSTATUS:
Код возврата | Описание |
---|---|
|
Входящее подключение успешно принято. IRP будет завершен с состоянием успешного выполнения. |
|
IRP помещен в очередь подсистемой WSK, которая ожидает входящего подключения к сокету прослушивания. |
|
Сокет больше не работает. IRP будет завершен с состоянием сбоя. Приложение WSK должно вызвать функцию WskCloseSocket , чтобы как можно скорее закрыть сокет. |
|
Произошла ошибка. IRP будет завершен с состоянием сбоя. |
Комментарии
Приложение WSK может вызывать функцию WskAccept для прослушивающего сокета или сокета потока, ранее привязанного к локальному транспортному адресу, путем вызова функции WskBind .
Поведение функции WskAccept зависит от того, ожидает ли входящее подключение в сокете прослушивания:
- Если входящее подключение уже поступило в сокет прослушивания и ожидает принятия, функция WskAccept возвращает STATUS_SUCCESS. В этом случае IRP завершается с состоянием успешного выполнения, а поле IoStatus.Information IRP содержит указатель на объект сокета для принятого сокета.
- Если входящее подключение не ожидает принятия в сокете прослушивания, WskAccept возвращает STATUS_PENDING и подсистема WSK помещает IRP в очередь до получения входящего подключения. При получении входящего подключения подсистема WSK асинхронно завершает IRP с состоянием успешного выполнения. В этом случае поле IoStatus.Information IRP содержит указатель на объект сокета для принятого сокета.
Если функция WskAccept успешно принимает входящее подключение, все функции обратного вызова событий в принятом сокете по умолчанию отключены. Дополнительные сведения о включении любой из функций обратного вызова событий принятого сокета см. в разделе Включение и отключение функций обратного вызова событий.
Если приложение WSK указывает указатель, отличный от NULL , в параметре LocalAddress , в параметре RemoteAddress или в обоих параметрах и если WskAccept возвращает STATUS_PENDING, буферы, на которые указывают эти параметры, должны оставаться действительными до завершения IRP. Если приложение WSK выделило буферы с помощью одной из функций ExAllocateXxx , оно не сможет освободить память с помощью соответствующей функции ExFreeXxx до завершения IRP. Если приложение WSK выделило буферы в стеке, оно не может вернуться из функции, вызывающей функцию WskAccept , до завершения IRP.
Подсистема WSK выделяет память для структуры объекта сокета ( WSK_SOCKET) для принятого подключения от имени приложения WSK. Подсистема WSK освобождает эту память при закрытии сокета.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Доступно в Windows Vista и более поздних версиях операционных систем Windows. |
Целевая платформа | Универсальное |
Верхняя часть | wsk.h (включая Wsk.h) |
IRQL | <= DISPATCH_LEVEL |