使用Win8.1和Visual Studio 2013,我测试了我可以找到的每个Windows注册I / O示例(大约5个)。所有这些都导致RioCreateRequestQueue()上的错误10045,如下所示。
c:>rioServerTest.exe
InitialiseRio Start
InitialiseRio End
CreateCompletionQueue Start
CreateCompletionQueue End
CreateRequestQueue start
RIOCreateRequestQueue Error: 10045
相关代码是:
void *pContext = 0;
printf("CreateRequestQueue start\n");
g_requestQueue = g_rio.RIOCreateRequestQueue(
g_socket, // Socket
(ULONG) 10, // MaxOutstandingReceive,
(ULONG) 1, // maxReceiveDataBuffers,
(ULONG) 10, // MaxOutstandingSend,
(ULONG) 1, // MaxSendDataBuffers
g_completionQueue, // ReceiveCQ
g_completionQueue, // SendCQ
pContext); // SocketContect
if (g_requestQueue == RIO_INVALID_RQ) {
printf_s("RIOCreateRequestQueue Error: %d\n", GetLastError());
exit(1);
}
printf("CreateRequestQueue End\n");
根据我所阅读的文献,已注册的I / O适用于Windows 8及更高版本以及Windows Server 2012及更高版本。
任何人都可以通过一个例子向我解释如何让它在Win8.1上运行吗? TIA
答案 0 :(得分:1)
10045为WSAEOPNOTSUPP
,其描述为"不支持操作。
引用的对象类型不支持尝试的操作。通常,当无法支持此操作的套接字的套接字描述符尝试接受数据报套接字上的连接时,会发生这种情况。"
实际上,我们需要看到的代码实际上是您创建套接字的地方。
您的套接字创建代码应如下所示:
socket = ::WSASocket(
AF_INET,
SOCK_DGRAM,
IPPROTO_UDP,
NULL,
0,
WSA_FLAG_REGISTERED_IO);
我有一些示例文章(包括一整套RIO,带有完整源代码的UDP服务器设计)here,所有这些都在RIO支持的所有操作系统上运行。