我在Windows中使用IOCP服务器。我必须将缓冲区发送到所有连接的套接字。 缓冲区大小很小 - 最多10个字节。当我在GetQueuedCompletionStatus中获得每个wsasend的通知时,是否可以保证缓冲区是由单个wsasend一个一个地发送的?或者我应该添加额外的代码,检查是否发送了所有10个字节,并在必要时发布另一个wsasend?
答案 0 :(得分:1)
无法保证,但小于单个操作系统页面大小的发送部分失败的可能性极小。
如果您发送的缓冲区长度超过单个操作系统页面大小,并且您没有主动管理您拥有的未完成操作数以及系统可以支持的数量,那么失败的可能性更大“非分页池”或点击“I/O page lock limit”
如果您在该连接上没有任何其他发送待处理,则只能从部分故障中恢复。
我倾向于检查完成处理程序中的值是否符合预期,如果不是,则中止与RST的连接。我从来没有在生产中执行此代码,而且我已经构建了许多不同类型的基于IOCP的客户端和服务器系统已经超过10年了。