从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");
}
}
...
来源
2016-07-23 02:33:07
pah
我现在明白了,非常感谢你+1 – KKlouzal