在Windows I / O完成端口上,假设我这样做:
void function()
{
WSASend("1111"); // A
WSASend("2222"); // B
WSASend("3333"); // C
}
如果我得到一个“写完成”,表示发送了3个字节的WSASend()A,那么有可能在那之后我会得到一个“写完成”,告诉我B的部分或全部&安培;发送了C,或者TCP会保留它们,直到我用A的其余数据重新发出WSASend()调用?或者TCP会自动完成吗?
答案 0 :(得分:4)
我用IOCP开发客户端和服务器系统已有10多年了,我从未在正常使用中看到过部分写入完成。你可以得到它们,但如果你这样做,那么你的服务器很可能会被冲洗掉;您可能会因ENOBUFS错误而获得写入完成,这意味着您已用尽非页面缓冲池或超出锁定页面限制。
恕我直言,您应该管理您的资源,以免您达到这些操作系统限制。
如果写入完成返回的次数少于您认为应该写入的字节数,那么如果有更多写入待处理,则无法恢复。在您的问题示例中,如果A失败,那么您只能真正关闭连接,因为B和C可能会成功。在实践中,您不必担心更多。
如果您知道在该连接上没有任何待处理的写入,那么您可以发出另一个写入以写入后续数据。
TCP完全不会涉及到这一点。