大多数使用套接字和I / O完成端口的服务器框架/示例以一种我无法完全弄清楚目的的方式发出通知。
读取数据包后,通常会对它们进行重新排序,以避免在IOCP确保FIFO队列时无序处理数据包的线程调度问题。
问题是套接字正常关闭或出错。我在两种情况下都看到了,并且在o.s.在线程调度程序中,关闭通知可以在“之前”引用的数据通知之前发送到应用程序(即使用框架的http服务器)。
我认为关闭通知应该以这种方式排队,以便应用程序在之前的读取后收到它。
在我看到的大多数代码中是否有任何预期用途,或者我的行为可能是正确的,具体取决于具体情况?
答案 0 :(得分:1)
你的建议是有道理的,我会想象任何处理优雅关闭的代码(读取返回0字节)都会通过在任何正在进行的成功读取之后处理它来实现。来自GetQueuedCompletionStatus()的错误(例如连接重置错误等)更难集成到接收流中,因为就接收数据而言,它们在带外发生。您的问题有点模糊,并且非常依赖于您正在使用的代码以及您(或编写该代码的人)如何处理这些问题。没有一种正确的方法,恕我直言。