Поделиться через


функция обратного вызова 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:

Код возврата Описание
STATUS_SUCCESS
Входящее подключение успешно принято. IRP будет завершен с состоянием успешного выполнения.
STATUS_PENDING
IRP помещен в очередь подсистемой WSK, которая ожидает входящего подключения к сокету прослушивания.
STATUS_FILE_FORCED_CLOSED
Сокет больше не работает. 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 содержит указатель на объект сокета для принятого сокета.
Если функция обратного вызова событий WskAcceptEvent приложения WSK включена в прослушиваемом сокете и приложение имеет ожидающий вызов функции WskAccept в том же сокете прослушивания, то при поступлении входящего подключения ожидающий вызов WskAccept имеет приоритет над функцией обратного вызова события WskAcceptEvent . Подсистема WSK вызывает функцию обратного вызова события WskAcceptEvent приложения только в том случае, если из ожидающих вызовов WskAccept не помещаются в очередь irP. Однако приложение WSK не должно предполагать, что подсистема WSK не будет вызывать функцию обратного вызова события WskAcceptEvent приложения для прослушивающего сокета, который имеет ожидающий вызов функции WskAccept . Существуют условия гонки, в которых подсистема WSK может по-прежнему вызывать функцию обратного вызова события WskAcceptEvent приложения WSK для сокета. Единственный способ для приложения WSK убедиться, что подсистема WSK не будет вызывать функцию обратного вызова события WskAcceptEvent приложения для прослушивающего сокета, заключается в отключении функции обратного вызова событий WskAcceptEvent приложения в сокете.

Если функция 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

См. также раздел

SOCKADDR

WSK_CLIENT_CONNECTION_DISPATCH

WSK_PROVIDER_LISTEN_DISPATCH

WSK_PROVIDER_STREAM_DISPATCH

WSK_SOCKET

WskAcceptEvent

WskBind

WskCloseSocket

WskSocket