2016-07-23 43 views
1

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一起提供?

回答

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扩展函数的指针。在 Ws2def.h头文件中定义了 SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTLWSAID_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

我现在明白了,非常感谢你+1 – KKlouzal