LPFN_RIOCREATEREQUESTQUEUE回调函数 (mswsock.h)

RIOCreateRequestQueue 函数使用指定的套接字和 I/O 完成队列创建注册的 I/O 套接字描述符,以便与 Winsock 注册的 I/O 扩展一起使用。

语法

LPFN_RIOCREATEREQUESTQUEUE LpfnRiocreaterequestqueue;

RIO_RQ LpfnRiocreaterequestqueue(
  SOCKET Socket,
  ULONG MaxOutstandingReceive,
  ULONG MaxReceiveDataBuffers,
  ULONG MaxOutstandingSend,
  ULONG MaxSendDataBuffers,
  RIO_CQ ReceiveCQ,
  RIO_CQ SendCQ,
  PVOID SocketContext
)
{...}

参数

Socket

标识套接字的描述符。

MaxOutstandingReceive

套接字上允许的最大未完成接收数。

对于大多数应用程序,此参数通常是一个较小的数字。

MaxReceiveDataBuffers

套接字上接收数据缓冲区的最大数目。

注意

对于 Windows 8 和 Windows Server 2012 ,此参数必须为 1

MaxOutstandingSend

套接字上允许的最大未完成发送数。

MaxSendDataBuffers

套接字上发送数据缓冲区的最大数目。

注意

对于 Windows 8 和 Windows Server 2012 ,此参数必须为 1

ReceiveCQ

标识要用于接收请求完成的 I/O 完成队列的描述符。

SendCQ

标识要用于发送请求完成的 I/O 完成队列的描述符。

此参数的值可能与 ReceiveCQ 参数相同。

SocketContext

要与此请求队列关联的套接字上下文。

返回值

如果未发生错误, RIOCreateRequestQueue 函数将返回引用新请求队列的描述符。 否则,将返回 值 RIO_INVALID_RQ ,并且可以通过调用 WSAGetLastError 函数来检索特定的错误代码。

返回代码 说明
WSAEINVAL
向该函数传递了无效参数。
如果 ReceiveCQSendCQ 参数包含 RIO_INVALID_CQ,则返回此错误。 如果 MaxOutstandingReceiveMaxOutstandingSend 参数均为零,则返回此错误。 如果在 Socket 参数中传递的套接字正在初始化或关闭过程中,也会返回此错误。
WSAENOBUFS
无法分配足够的内存。 如果内存不足,无法根据参数分配请求队列,则返回此错误。 如果超出网络会话限制,也会返回此错误。
WSAENOTSOCK
:描述符不是套接字。 如果 Socket 参数不是有效的套接字,则返回此错误。
WSAEOPNOTSUPP
所引用对象的类型不支持尝试的操作。 对于不受支持的套接字类型 (SOCK_RAW的 Socket 参数中的 套接字返回此错误,例如,)

注解

RIOCreateRequestQueue 函数使用指定的套接字和 I/O 完成队列创建已注册的 I/O 套接字描述符。 应用程序必须调用 RIOCreateRequestQueue 以获取 Winsock 套接字 的RIO_RQ ,然后应用程序才能使用 RIOSendRIOSendExRIOReceiveRIOReceiveEx 函数。 为了获取RIO_RQ,Winsock 套接字必须与发送和接收的完成队列相关联,尽管两者都可以使用相同的完成队列。

由于完成队列的大小有限,如果套接字保证不超过排队完成总数的容量,则只能与发送和接收操作的完成队列关联。 因此,通过调用 RIOCreateRequestQueue 函数来建立特定于套接字的限制。 这些限制在 RIOCreateRequestQueue 调用期间用于验证完成队列中有足够的空间来容纳套接字请求,并在请求启动期间使用,以确保请求不会导致套接字超出其限制。

发送和接收队列可以与多个套接字相关联。 发送和接收队列的大小必须大于或等于所有附加套接字的发送和接收大小。 由于请求队列通过使用 closesocket 函数关闭套接字而关闭,这些槽将被释放供其他套接字使用。

注意

为了提高效率,对完成队列的访问 (RIO_CQ 结构) 和请求队列 (RIO_RQ 结构) 不受同步基元的保护。 如果需要从多个线程访问完成队列或请求队列,应通过关键部分、精简读取器写入锁或类似机制协调访问。 单个线程访问不需要此锁定。 不同的线程可以在没有锁的情况下访问单独的请求/完成队列。 仅当多个线程尝试访问同一队列时,才需要同步。 如果多个线程在同一套接字上发出发送和接收,则还需要同步,因为发送和接收操作使用套接字的请求队列。

 

当应用程序使用 完RIO_RQ后,应用程序应调用 closesocket 函数以关闭套接字并释放关联的资源。

注意

必须在运行时通过调用 WSAIoctl 函数并指定SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER操作码来获取指向 RIOCreateRequestQueue 函数的函数指针。 传递给 WSAIoctl 函数的输入缓冲区必须包含 WSAID_MULTIPLE_RIO,这是一个全局唯一标识符, (GUID) 其值标识 Winsock 注册的 I/O 扩展函数。 成功后, WSAIoctl 函数返回的输出包含指向 RIO_EXTENSION_FUNCTION_TABLE 结构的指针,该结构包含指向 Winsock 注册的 I/O 扩展函数的指针。 SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL 在 Ws2def.h 头文件中定义。 WSAID_MULTIPLE_RIO GUID 在 Mswsock.h 头文件中定义。

 

Windows Phone 8:Windows Phone 8 及更高版本上的 Windows Phone 应用商店应用支持此函数。

Windows 8.1Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。

要求

要求
Header mswsock.h