PFN_WSK_RECEIVE回调函数 (wsk.h)
WskReceive 函数通过面向连接的或流套接字从远程传输地址接收数据。
语法
PFN_WSK_RECEIVE PfnWskReceive;
NTSTATUS PfnWskReceive(
[in] PWSK_SOCKET Socket,
[in] PWSK_BUF Buffer,
[in] ULONG Flags,
[in, out] PIRP Irp
)
{...}
参数
[in] Socket
指向 WSK_SOCKET 结构的指针,该结构指定要从中接收数据的套接字的套接字对象。
[in] Buffer
指向已初始化 WSK_BUF 结构的指针,该结构描述从套接字接收数据的数据缓冲区。
[in] Flags
一个 ULONG 值,该值包含以下标志的组合的按位 OR:
WSK_FLAG_WAITALL
等待数据缓冲区完全填充。 如果指定了此标志,则在发生以下事件之一之前, 不会完成在 Irp 参数中指定的 IRP :
- 由 Buffer 参数指向的 WSK_BUF 结构描述的数据 缓冲区 已完全填充。
- 远程发送方正常断开连接。
- WSK 应用程序或远程发送方中止断开连接。
- 指定的 IRP 已取消。
WSK_FLAG_DRAIN
等到套接字断开连接,放弃在套接字上收到的任何数据。 如果指定了此标志,则在发生以下事件之一之前,指定的 IRP 将不会完成:
- 远程发送方正常断开连接。
- WSK 应用程序或远程发送方中止断开连接。
- 指定的 IRP 已取消。
Microsoft TCP/IP 传输协议支持此标志。 其他传输协议可能不支持此标志。
WSK_FLAG_WAITALL和WSK_FLAG_DRAIN标志互斥。 WSK 应用程序不应同时指定这两个标志。
[in, out] Irp
指向调用方分配的 IRP 的指针,WSK 子系统使用该 IRP 异步完成接收操作。 有关将 IRP 与 WSK 函数配合使用的详细信息,请参阅 将 IRP 与 Winsock 内核函数配合使用。
返回值
WskReceive 返回以下 NTSTATUS 代码之一:
返回代码 | 说明 |
---|---|
|
已成功从套接字接收数据。 IRP 将以成功状态完成。 IRP 的 IoStatus.Information 字段包含收到的字节数。 |
|
WSK 子系统无法立即从套接字接收数据。 WSK 子系统将在从套接字接收数据后完成 IRP。 接收操作的状态将在 IRP 的 IoStatus.Status 字段中返回。 如果操作成功,IRP 的 IoStatus.Information 字段将包含收到的字节数。 |
|
套接字不再正常工作。 IRP 将以失败状态完成。 WSK 应用程序必须调用 WskCloseSocket 函数以尽快关闭套接字。 |
|
基础网络传输不支持指定的标志。 |
|
出现了错误。 IRP 将以失败状态完成。 |
注解
WSK 应用程序只能在以前已连接到远程传输地址的面向连接的或流套接字上调用 WskReceive 函数。 面向连接的套接字通过以下方法之一连接到远程传输地址:
- WSK 应用程序通过调用 WskConnect 函数来连接套接字。
- WSK 应用程序通过调用 WskSocketConnect 函数创建、绑定和连接套接字。
- 当 WSK 应用程序接受侦听套接字上的传入连接请求时,WSK 子系统将连接套接字。
WSK 应用程序可以调用 WskReceive 函数,该函数在由 Buffer 参数指向的 WSK_BUF 结构的 Length 成员中指定的长度为零。 在此成员中指定零长度在以下情况下很有用:
- 在 WskReceiveEvent 事件回调函数之前返回的套接字重新启用 WskReceiveEvent 事件回调函数时,STATUS_DATA_NOT_ACCEPTED
- 指定 WSK_FLAG_DRAIN 标志以放弃在套接字上接收的任何其他数据时
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 在 Windows Vista 和更高版本的 Windows 操作系统中可用。 |
目标平台 | 通用 |
标头 | wsk.h (包括 Wsk.h) |
IRQL | <= DISPATCH_LEVEL |