带有多个缓冲区的WSASend()可能完成不完整?

时间:2010-06-16 22:01:38

标签: network-programming winsock iocp

假设我发布了以下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个字节)?

2 个答案:

答案 0 :(得分:2)

正如我之前所说,在回答您的其他一个非常相似的问题时,唯一可能失败的时间是资源不足(非页面缓冲池或锁定页面限制问题最有可能发生)可能会获得部分完成和ENOBUFS的错误返回。再说一次,正如我之前所说,在10年的IOCP开发工作中,我从来没有把这看作是生产中的问题,只有在我们对系统进行压力测试以致死亡的情况下(有时候非常有问题)游泳池耗尽有时可能会导致行为不端的司机蓝屏框。)

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

答案 1 :(得分:0)

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

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