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一起提供?
答案 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");
}
}
...