Winsock Registered I / O需要包含哪些内容

时间:2016-07-23 02:21:52

标签: include winsock2

Winsock Registered I / O需要哪些内容? 我使用的是Windows 10和Visual Studio Community 2015 Update3

MSDN Winsock Include Files是我唯一能找到的东西,而且非常含糊不清。

这是我能找到的唯一的Winsock2包含:

#include <WinSock2.h>
#include <WS2tcpip.h>
#include <MSWSock.h>
#include <WS2spi.h>
#include <WS2atm.h>
#include <ws2def.h>
#include <ws2ipdef.h>

不幸的是,它们似乎都没有定义任何RIO功能:

RIOCreateCompletionQueue()
RIOCreateRequestQueue()
//and etc are undefined..

据我所知,从2012年开始使用Windows 8.1,这些功能随Windows SDK一起提供?

1 个答案:

答案 0 :(得分:3)

从MSDN引用:

RIOCreateCompletionQueue function

  

指向RIOCreateCompletionQueue函数的函数指针   必须通过调用WSAIoctl函数在运行时获取   指定了SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER操作码。   传递给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头文件。

另请查看this question。该问题的链接引用this RIO implementation,其中包含以下示例(摘录):

...

inline void CreateRIOSocket()
{
   g_s = CreateSocket(WSA_FLAG_REGISTERED_IO);

   Bind(g_s, PORT);

   InitialiseRIO(g_s);
}

inline SOCKET CreateSocket(
   const DWORD flags = 0)
{
   g_s = ::WSASocket(
      AF_INET,
      SOCK_DGRAM,
      IPPROTO_UDP,
      NULL,
      0,
      flags);

   if (g_s == INVALID_SOCKET)
   {
      ErrorExit("WSASocket");
   }

   return g_s;
}

inline void InitialiseRIO(
   SOCKET s)
{
   GUID functionTableId = WSAID_MULTIPLE_RIO;

   DWORD dwBytes = 0;

   bool ok = true;

   if (0 != WSAIoctl(
      s,
      SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER,
      &functionTableId,
      sizeof(GUID),
      (void**)&g_rio,
      sizeof(g_rio),
      &dwBytes,
      0,
      0))
   {
      ErrorExit("WSAIoctl");
   }
}

...