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


функция обратного вызова PFN_WSK_GET_LOCAL_ADDRESS (wsk.h)

Функция WskGetLocalAddress извлекает локальный адрес транспорта сокета.

Синтаксис

PFN_WSK_GET_LOCAL_ADDRESS PfnWskGetLocalAddress;

NTSTATUS PfnWskGetLocalAddress(
  [in]      PWSK_SOCKET Socket,
  [out]     PSOCKADDR LocalAddress,
  [in, out] PIRP Irp
)
{...}

Параметры

[in] Socket

Указатель на структуру WSK_SOCKET , указывающую объект сокета для запрашиваемого сокета.

[out] LocalAddress

Указатель на буфер, выделенный вызывающим объектом, который получает локальный адрес транспорта для сокета. Буфер должен находиться в нестраничной памяти. Буфер также должен быть достаточно большим, чтобы содержать конкретный тип структуры SOCKADDR, соответствующий семейству адресов, которое приложение WSK указало при создании сокета.

Для сокета, ориентированного на подключение, который приложение WSK принимало в прослушивающем сокете, семейство адресов совпадает с семейством адресов, которое приложение WSK указало при создании прослушивающего сокета.

[in, out] Irp

Указатель на выделенный вызывающим объектом IRP, который подсистема WSK использует для асинхронного выполнения операции извлечения. Дополнительные сведения об использовании IRP с функциями WSK см. в разделе Использование IRP с функциями ядра Winsock.

Возвращаемое значение

WskGetLocalAddress возвращает один из следующих кодов NTSTATUS:

Код возврата Описание
STATUS_SUCCESS
Локальный адрес транспорта для сокета успешно получен. IRP будет завершена с состоянием успешного выполнения.
STATUS_PENDING
Подсистеме WSK не удалось немедленно получить локальный адрес транспорта для сокета. Подсистема WSK завершит IRP после получения локального адреса транспорта для сокета. Состояние операции извлечения будет возвращено в поле IoStatus.Status IRP.
STATUS_INVALID_DEVICE_STATE
Сокет не привязан к локальному адресу транспорта. IRP будет завершен с состоянием сбоя.
STATUS_FILE_FORCED_CLOSED
Сокет больше не работает. IRP будет завершен с состоянием сбоя. Приложение WSK должно вызвать функцию WskCloseSocket , чтобы закрыть сокет как можно скорее.
Другие коды состояния
Произошла ошибка. IRP будет завершен с состоянием сбоя.

Комментарии

Приложение WSK может вызывать функцию WskGetLocalAddress только в сокете, привязанном к локальному транспортному адресу.

Прослушивающий, датаграмма или сокет потока привязывается к локальному транспортному адресу, когда приложение WSK вызывает функцию WskBind .

Сокет, ориентированный на подключение, привязан к локальному адресу транспорта одним из следующих способов:

  • Приложение WSK вызывает функцию WskBind .
  • Приложение WSK создает, привязывает и подключает сокет, вызывая функцию WskSocketConnect .
  • Подсистема WSK привязывает сокет, когда приложение WSK принимает входящий запрос на подключение к прослушивателю сокета.
Функция WskGetLocalAddress особенно полезна для определения конкретного локального адреса транспорта, назначенного сокету транспортным протоколом, когда сокет был привязан к локальному адресу с подстановочными знаками. Для сокета, ориентированного на подключение, привязанного к локальному адресу с подстановочными знаками, локальный транспортный адрес может не быть назначен транспортному протоколу, пока сокет не будет подключен к удаленному адресу транспорта. Шаг, на котором локальный адрес транспорта назначается сокету, зависит от протокола транспорта. Для TCP номер порта назначается при привязке сокета, ориентированного на подключение, но IP-адрес не назначается, пока сокет не будет подключен.

Если функция WskGetLocalAddress возвращает STATUS_PENDING, буфер, на который указывает параметр LocalAddress , должен оставаться действительным до завершения IRP. Если приложение WSK выделило буфер с помощью одной из функций ExAllocateXxx , оно не сможет освободить память с помощью соответствующей функции ExFreeXxx до завершения IRP. Если приложение WSK выделило буфер в стеке, оно не может вернуться из функции, вызывающей функцию WskGetLocalAddress , до завершения IRP.

Требования

Требование Значение
Минимальная версия клиента Доступно в Windows Vista и более поздних версиях операционных систем Windows.
Целевая платформа Универсальное
Верхняя часть wsk.h (включая Wsk.h)
IRQL <= DISPATCH_LEVEL

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

SOCKADDR

WSK_PROVIDER_CONNECTION_DISPATCH WSK_PROVIDER_DATAGRAM_DISPATCH

WSK_PROVIDER_LISTEN_DISPATCH

WSK_PROVIDER_STREAM_DISPATCH

WSK_SOCKET

WskAccept

WskAcceptEvent

WskBind

WskCloseSocket

WskConnect

WskGetRemoteAddress

WskSocketConnect