IO 完成端口中的业务逻辑
Business logic in IO completion Port
我对 IO 完成端口以及 winsock2 中的 AcceptEx 有一些疑问
如果我错了,请纠正我。
-
AcceptEx 是一种接受请求或连接的重叠方式。但是,正如本网站上的多篇帖子所指出的那样,如果AcceptEx需要数据但不是由连接的客户端发送的,则
AcceptEx
容易受到DOS攻击。那么,可以通过将 0 放在dwReceiveDataLength
来解决吗? -
此外,在接受相应连接时能够从客户端接收数据而不是稍后使用
AcceptEx
接收数据有什么优势? -
接受来自相反终结点的连接并将其与 IO 完成端口关联后,请求将在 IO 完成端口中作为与其各自句柄关联的完成数据包排队。在完成端口上阻塞的工作线程将被唤醒,具体取决于为请求提供服务
NumberOfConcurrentThreads
。那么,完成端口中的线程是 IO 线程吗? -
那么,我应该在套接字服务器中的什么位置实现业务逻辑或操作呢?例如,来自客户端的请求将数字发送到服务器进行处理,而服务器的行为类似于计算器,通过回显计算输出进行响应。因此,是否可以在 IO 完成端口中实现此逻辑?
如果逻辑在 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后是否可以被阻止此完成端口的线程接收?换句话说,如何将连接从另一个完成端口重定向到另一个完成端口?
1)避免潜在的AcceptEx DOS攻击很容易,只是不要为数据提供任何空间,一旦建立连接,AcceptEx就会完成。
2) 使用 AcceptEx 意味着您不需要单独的线程来运行接受循环。这会从系统中删除一个线程并减少上下文切换。如果要侦听多个套接字(不同的端口/接口),这尤其有用,因为每个侦听套接字都需要自己的接受线程。
3) 是的,在 IOCP 上调用 GetQueuedCompletionStatus 的工作线程可以被认为是 I/O 线程...
4)视情况而定。我已经构建了具有不同、固定大小的 I/O 线程池的系统,这些线程池从不执行任何阻塞操作,并且设计用于执行阻塞操作的单独扩展线程池。这个想法是,这将防止所有线程被阻塞并阻止I/O...这需要您将工作项传递给其他线程池,这会导致不必要的上下文切换和复杂性,但这意味着您始终有线程来执行 I/O 操作(例如在 AcceptEx 完成时处理新连接)...当 IOCP API 用于取消挂起的操作时,如果发出的线程在操作完成之前退出,这种设计曾经很好地工作。既然操作系统已经更改了规则并且挂起的操作没有被取消,那么您没有真正的理由不拥有一个扩展/收缩的 I/O 线程池并在那里完成所有工作......您只需要跟踪有多少线程可用并创建/销毁线程,因为您需要扩展/收缩池......
5) 见 4.
- Seg Fault Issue C++ (file IO / getline)
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么在读取文件大小时文件IO速度会发生变化
- Agora.io 虚幻引擎插件构建错误
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- ASIO signal_set多个 IO 线程不可靠,具体取决于代码顺序?
- 通过 Tor 服务C++ socket.io 客户端
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 如何读取 google::p rotobuf::io::CodedOutputStream::WriteVarint32
- Conan.io 在编译步骤中或已经在签出时
- C++中真正的异步文件 IO
- 在C++中返回 IO 对象的目的是什么?
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- C++网络 IO、文件处理和网络故障
- Xcode OSX上的C++构建失败,出现多个错误文件IO..不可用:在macOS 10.15中引入
- Android Studio-在现有的旧项目中启用本机C++调试(card.io Android Source)
- 如何检测函数是否执行IO操作
- 如何键入用于const对象的自定义io操纵器
- libevent是否允许在不同的线程中运行timer/io的回调
- IO 完成端口中的业务逻辑