我对 IO Completion Port 以及 winsock2 中的 AcceptEx 有一些疑问
如果我错了,请纠正我。
AcceptEx 是一种接受请求或连接的重叠方式。但是,正如该站点上的多个帖子所指出的那样,
AcceptEx
如果 AcceptEx 期待数据但不是由连接的客户端发送,则很容易受到 DOS 攻击。那么,是否可以通过将 0 放入 来解决dwReceiveDataLength
?此外,在接受相应连接时能够从客户端接收数据而不是稍后使用接收数据有什么优势
AcceptEx
?在接受来自对端端点的连接并将其与 IO 完成端口相关联后,请求作为完成数据包在 IO 完成端口中排队,这些完成数据包与它们各自的句柄相关联。
NumberOfConcurrentThreads
阻塞在完成端口上的工作线程将根据服务请求而被唤醒。那么,完成端口中的线程是IO 线程吗?那么,我应该在socket服务器的哪里实现业务逻辑或操作呢?例如,来自客户端的请求将数字发送到服务器进行处理,而服务器就像计算器一样通过回显计算的输出来响应。那么,这个逻辑可以在 IO Completion Port 中实现吗?
如果逻辑在 IO 完成端口中实现(当IO 完成端口中处于活动状态的 IO 线程(假设)正在执行
WSARecv
时WSASend
),IO 线程是否会在等待计算完成时阻塞,从而无法接受连接如果积压的东西都被拿走了?
编辑:
- 例如,在接受客户端套接字并在 IO 完成端口(main_cpl_port)中排队/关联之后,阻塞在此main_cpl_port上的线程调用
GetQueuedCompletionStatus
将完成数据包出列,随后将数据读入分配的缓冲区。在将任何响应写回客户端之前,缓冲区会被处理/解析为“命令”(例如:GoToCalculator、GoToRecorder)。 - 例如,GoToCalculator 负责其他计算相关的命令。
- 在这种情况下,GoToCalculator 实际上是另一个 IO 完成端口,可以满足所有与计算相关的请求。假设完成端口被命名为calc_completion_port。
- 因此,来自 main_cpl_port 的完成数据包是否有可能从当前与main_cpl_port关联的客户端套接字发布到calc_completion_port以供将来的 IO(发送和接收) 。这是用来干什么的?
PostQueuedCompletionStatus
- 发布到calc_completion_port后从客户端发送的消息是否可以被阻塞在此完成端口上的线程接收?换句话说,如何将连接从另一个重定向到另一个完成端口?