假设我发布了以下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个字节)?
答案 0 :(得分:2)
正如我之前所说,在回答您的其他一个非常相似的问题时,唯一可能失败的时间是资源不足(非页面缓冲池或锁定页面限制问题最有可能发生)可能会获得部分完成和ENOBUFS的错误返回。再说一次,正如我之前所说,在10年的IOCP开发工作中,我从来没有把这看作是生产中的问题,只有在我们对系统进行压力测试以致死亡的情况下(有时候非常有问题)游泳池耗尽有时可能会导致行为不端的司机蓝屏框。)
我建议你只需添加一些代码来记录失败,关闭套接字,就是这样,你已经处理了失败的可能性并且可以继续。如果您的故障处理代码被执行,我会感到惊讶。但是你可以确信你会知道它是否存在,一旦你可以重现这个问题,你就可以花更多的时间思考你是否真的需要更好地处理它。
答案 1 :(得分:0)
由于WSASend
是执行重叠套接字IO的首选方式,如果它在不完整时完成则没有任何意义 - 完成通知/例程/事件是应用程序清理/回收的唯一方法使用过的结构。
另外:不,这是不可能的,单个WSASend
调用仍然是单个IO调用,无论使用何种缓冲区。