c++ - Windows 注册 I/O Win 8.1 RioCreateRequestQueue 错误 10045

标签 c++ windows sockets

使用 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");

根据我阅读的文献,Registered I/O 适用于 Windows 8 及更高版本以及 Windows Server 2012 及更高版本。

任何人都可以通过示例向我解释如何让它在 Win8.1 上运行吗?时间差

最佳答案

10045WSAEOPNOTSUPP,其描述是 “不支持操作。 引用的对象类型不支持尝试的操作。这通常发生在不支持此操作的套接字的套接字描述符试图接受数据报套接字上的连接时。”

所以实际上我们需要查看的代码很可能实际上就是您创建套接字的地方。

您的套接字创建代码应如下所示:

   socket = ::WSASocket(
      AF_INET,
      SOCK_DGRAM,
      IPPROTO_UDP,
      NULL,
      0,
      WSA_FLAG_REGISTERED_IO);

我有一些示例文章(包括一整套 RIO、UDP 服务器设计和完整的源代码)here ,所有这些都可以在 RIO 支持的所有操作系统上运行。

关于c++ - Windows 注册 I/O Win 8.1 RioCreateRequestQueue 错误 10045,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25788382/

相关文章:

c++ - 用 O(log(n+m)) 最坏情况合并两个排序数组

C++ 异常处理

c++ - 当同一个信号可以来自多个地方时使用 Qt 的信号和槽

c++ - Windows 7 如何在任务栏中显示应用程序的缩略图?

php - 如何在 Windows 中无需用户名和密码即可将 Laravel 应用程序与 MySQL 连接

c++ - C++ DLL def 文件中的重载函数

windows - 在文件中查找一行并替换下一行

java - 套接字编程中int数组的读写,java

sockets - 停止 Akka HTTP 服务器

sockets - UDP 服务器发现 - 客户端应该发送多播以查找服务器还是服务器应该发送常规信标?