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

指向调用方分配的缓冲区的指针,该缓冲区接收套接字的本地传输地址。 缓冲区必须位于非分页内存中。 缓冲区必须足够大,才能包含与创建套接字时指定的 WSK 应用程序指定的地址系列对应的特定 SOCKADDR 结构类型。

对于 WSK 应用程序在侦听套接字上接受的连接导向套接字,地址系列与创建侦听套接字时指定的 WSK 应用程序指定的地址系列相同。

[in, out] Irp

指向 WSK 子系统用于异步完成检索作的调用方分配的 IRP 的指针。 有关将 IRP 与 WSK 函数配合使用的详细信息,请参阅 将 IRP 与 Winsock 内核函数配合使用

返回值

WskGetLocalAddress 返回以下 NTSTATUS 代码之一:

返回代码 描述
STATUS_SUCCESS
已成功检索套接字的本地传输地址。 IRP 将以成功状态完成。
STATUS_PENDING
WSK 子系统无法立即检索套接字的本地传输地址。 WSK 子系统在检索套接字的本地传输地址后将完成 IRP。 检索作的状态将在 IRP 的 IoStatus.Status 字段中返回。
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 函数之一分配了缓冲区,则在 IRP 完成后,它才能使用相应的 ExFreeXxx 函数释放内存。 如果 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