Winsock注册I/O需要什么内容?
问题描述:
Winsock注册I/O需要什么? 我使用的是Windows 10和Visual Studio 2015年社区UPDATE3Winsock注册I/O需要什么内容?
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功能:在2012年
RIOCreateCompletionQueue()
RIOCreateRequestQueue()
//and etc are undefined..
从我的理解开始与Windows 8.1回这些函数随Windows SDK一起提供?
答
从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扩展函数的指针。在Ws2def.h
头文件中定义了SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL
。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");
}
}
...
我现在明白了,非常感谢你+1 – KKlouzal