- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个 IOCP 服务器。基本上,我让它接受新连接。出于测试目的,我正在运行并连接到 127.0.0.1。
我在调用 AcceptEx() 之前创建伪套接字。一旦连接被接受,新的伪套接字将用于通信。这个新的套接字与一个 io 完成端口 [CreateIoCompletionPort] 相关联,然后我给它分配了几个选项,[SO_EXCLUSIVEADDRUSE] 和 [SO_CONDITIONAL_ACCEPT],然后我调用 WSARecv() 来接受传入的数据。
问题是,一旦我的远程连接连接到服务器,它就会发送数据,但永远不会收到该数据。我想知道是否有人可以提供一些关于为什么它不接收数据的想法?也许我的逻辑有问题?我多次检查我的代码。没有记录错误。
编辑:修正了措辞。我在调用 AcceptEx() 之前创建套接字。
我的代码中的基本逻辑:
// Create socket, associate with IOCP
WSASocket(af, type, proto, lpProtoInfo, g, dwFlags);
HANDLE hIOCP = GetPool()->GetQueueHandle();
CreateIoCompletionPort(hSource, hIOCP, 0, 0) != NULL;
// Server bind and listen
bind(m_shSocket, pAddr, nAddrLen);
listen(m_shSocket, nBacklog);
// Creation of the pseudo socket
SOCKET s = ::WSASocket(m_iSocketAf, m_iSocketType, m_iSocketProto, m_pWpi, m_SocketGroup, m_dwSocketFlags);
DWORD dwBytes;
BOOL bRet = m_fnAcceptEx(m_shSocket, s, chOutput, 0, sizeof(SOCKADDR_STORAGE) + 16, sizeof(SOCKADDR_STORAGE) + 16, &dwBytes, m_pcbAccept);
// ... New Connection comes in, it's accepted ...
// Associate new pseudo socket with IOCP
HANDLE hNewIOCP = GetPool()->GetQueueHandle();
CreateIoCompletionPort((HANDLE) s, hNewIOCP , 0, 0) != NULL;
// ... Remote socket sends ...
// ... Remote socket and Pseudo socket call WSARecv ...
// ... Pseudo socket does not receive ...
注意:我尝试从伪套接字发送到远程套接字,与以相反方式发送数据的问题相同。
最佳答案
您需要发布一些代码,但您的描述没有意义。这不是基于 AcceptEx()
的服务器的运行方式。
使用基于AcceptEx()
的服务器,您可以在发送AcceptEx()
之前创建您接受的套接字。然后,您将 AcceptEx()
与监听套接字和新套接字以及一个缓冲区一起发布,该缓冲区允许您接收远程地址和可选的数据。
因此,如果您在原始问题中描述了您的代码,那么您的代码是错误的,或者您没有使用 AcceptEx()
。我目前忽略了您放入组合中的“少数选项”,因为它们目前只会进一步混淆事物,而无需分析任何代码。
您可能有兴趣下载我的 free IOCP based server framework ,其中包括有效的 AcceptEx()
和传统的基于 Accept()
的服务器代码。你可以从这里得到它:http://www.serverframework.com/products---the-free-framework.html
关于c++ - TCP IOCP 在 acceptex 之后收不到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4504623/
我正在设计客户端-服务器应用程序。我的服务器将使用 C++ 并使用 IOCP 进行 TCP/IP 通信。 尚未决定用于客户端开发的技术。所以我对 IOCP 与将来要开发的客户端的兼容性有几个问题(我需
我有经典的 IOCP 回调,它以这种方式使 i/o 挂起的请求出列、处理它们并释放它们: struct MyIoRequest { OVERLAPPED o; /* ... other params
我有 IOCP 应用程序,每个套接字上下文存储 64kb 缓冲区。它使用大量 RAM,同时处理数千个套接字。相反,我想切换到每个 iocp 线程上下文有 64kb 缓冲区的模型(就像我可以在 epol
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
正在学习IOCP,根据这个article : To begin using completion ports we need to create a Completion Port which in
我一直在脑海中传递一些关于如何在保持 KISS 的同时使用 IO 类型的架构实际包含大量连接的想法。通过网络上的示例,似乎大多数人都使用带有 CONTAINING_RECORD 的双/单链表。而且,作
我想了解为什么使用 IOCP。我可以想到两个原因: 因为 WSARecv() 不会阻塞,所以我可以处理 1000 个客户端,而不必为每个客户端创建一个新线程(另外,您可以创建的线程数量是有限制的,因此
我最近在 windows 平台上遇到了一个叫做 IOCP 的东西,更准确地说:输入/输出控制端口。这似乎是最有效的编写服务器软件代码的方式,因为它需要同时容纳数千名用户。(如果我错了请纠正我,但是每个
到目前为止,我发现的所有示例要么只能读取或写入,要么是 10000 行的巨兽,我什至不知道从哪里开始了解它们的工作原理。 为了测试我的代码,我将浏览器指向我的服务器并发送了一个简单的 http 请求。
我应该读取前 9 个字节,其中应包括数据包的协议(protocol)和传入大小。 当完成端口返回 9 个字节时哪个更好? (性能/良好实践或美学方面) 在套接字上发送另一个重叠读取,这次使用数据包的大
据我了解Windows Server 2003/2008和C++编程下的IOCP,它们或多或少是服务多个套接字(而不是选择)或将多个线程 bundle 在一起以服务那些请求的最高性能方式。 但是,如果
我正在构建 IOCP/RIO Winsock 服务器,并且当客户端触发我的 AcceptEx() 调用时,一直在努力从完成端口获取正确的通知要求。 当我在发送客户端请求后调用 GetQueuedCom
因此,我构建了一个高度多线程的并发应用程序,它管理自己的工作线程(因为它们在整个应用程序生命周期内运行)。现在我使用 SocketAsyncEventArgs 进行网络连接,它在后台使用 I/O 完成
当我调用 BeginExecuteReader (SQL) 时,它是否使用 IO 完成端口?是什么让它成为异步的?我应该从 Begin[Operation]() 还是从 IAsyncResult 构造
这是Microsoft Windows 网络编程 的代码片段: ... // Determine how many processors are on the system. GetSystemInf
如果 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 未启用,那么即使操作立即成功完成,我仍然会在完成端口上收到完成通知。我想知道如果它也立即完成并出现错误,是否属于这种情况
我正在创建一个客户端程序,它与通过 LAN 连接到我的 PC 的设备进行通信。 我的程序和设备之间典型的通信如下: Program -> Device 1616000D 08 02 00 00
我读到传递给 CreateIoCompletionPort() 函数的 NumberOfConcurrentThreads 参数的理想数字是 0,它将转换为核心数。 但是,我实际应该创建多少个等待完成
我正在为从桌面客户端到浏览器的视频流编写 IOCP 服务器。双方都使用 WebSocket 协议(protocol)来统一服务器的架构(并且因为浏览器没有其他方式可以执行全双工交换)。 工作线程是这样
我可以找到大量关于启动 IOCP 服务器的文章,但没有一篇是关于正确关闭它的 =/ 完成后关闭服务器的正确方法是什么?更具体地说,我已经使用 PostQueuedCompletionStatus()
我是一名优秀的程序员,十分优秀!