1

假设我发布了以下 WSASend 调用(没有回调函数的 Windows I/O 完成端口):

void send_data()
{
    WSABUF wsaBuff[2];
    wsaBuff[0].len = 20;
    wsaBuff[1].len = 25;
    WSASend(sock, &wsaBuff[0], 2, ......);
}

当我从完成端口收到“write_done”通知时,是否有可能 wsaBuff[1] 将被完全发送(25 个字节)而 wsaBuff[0] 只会被部分发送(比如 7 个字节)?

4

2 回答 2

2

正如我之前所说,在回答您的其他一个非常相似的问题时,唯一可能失败的情况是在资源不足的情况下(最有可能出现非分页池或锁定页面限制问题),您可能会得到一个部分完成并返回 ENOBUFS 错误。同样,正如我之前所说,在 10 年的 IOCP 开发工作中,我从未将其视为生产中的问题,仅在我们一直在对系统进行压力测试至死的情况下(实际上有时是非分页池耗尽有时会导致行为不端的驱动程序蓝屏框)。

我建议你简单地添加一些代码来记录失败,关闭套接字,就是这样,你已经处理了失败的可能性,可以继续前进。如果您的故障处理代码曾经被执行过,我会感到惊讶。但是您可以确信您会知道它是否存在,并且一旦您可以重现该问题,您就可以花更多时间考虑是否真的需要更好地处理它。

于 2010-06-17T09:43:12.480 回答
0

作为WSASend进行重叠套接字 IO 的首选方式,如果它在不完整的情况下完成是没有任何意义的 - 完成通知/例程/事件是应用程序清理/回收使用的结构的唯一方法。

另外:不,这是不可能的,单个WSASend调用仍然是单个 IO 调用,无论使用的缓冲区如何。

于 2010-06-17T08:19:02.503 回答