IOCP 服务器并使用单个 wsasend 发送数据
Posted
技术标签:
【中文标题】IOCP 服务器并使用单个 wsasend 发送数据【英文标题】:IOCP server and send data with single wsasend 【发布时间】:2013-12-22 12:10:55 【问题描述】:我在 Windows 中使用 IOCP 服务器。我必须将缓冲区发送到所有连接的套接字。 缓冲区大小很小 - 最多 10 个字节。当我在 GetQueuedCompletionStatus 中收到每个 wsasend 的通知时,是否保证缓冲区是由单个 wsasend 一次性发送的?或者我应该添加额外的代码,检查是否发送了所有 10 个字节,并在必要时发布另一个 wsasend?
【问题讨论】:
【参考方案1】:无法保证,但小于单个操作系统页面大小的发送极不可能部分失败。
如果您发送的缓冲区长度超过单个操作系统页面大小,并且如果您没有主动管理您有多少未完成的操作以及您的系统在用完之前可以支持多少操作,则失败的可能性更大“非分页池”或点击“I/O page lock limit”
只有当您在该连接上没有任何其他待处理的发送时,才有可能从部分故障中恢复。
我倾向于检查完成处理程序中的值是否符合预期,如果不是,则中止与 RST 的连接。我从来没有在生产环境中执行过这段代码,而且我已经构建了许多不同类型的基于 IOCP 的客户端和服务器系统超过 10 年了。
【讨论】:
以上是关于IOCP 服务器并使用单个 wsasend 发送数据的主要内容,如果未能解决你的问题,请参考以下文章
如果在 IOCP 模型中指定了 WSASend 的 lpCompletionRoutine 怎么办?
在重叠模式下使用 WSASend 时,我应该何时释放缓冲区?
WSASend 是不是将所有 WSABUF 缓冲区作为单个数据包发送?
io 完成端口问题,每个 GetQueuedCompletionStatus 调用多个 wsarecv 或 wsasend