我应该处理 WSASend() 可能不会发送所有数据的事实吗?

Should I handle the fact that WSASend() may not send all data?

我发现WSASend()可能不会发送所有数据,例如我要求它发送800字节,它可能只发送600字节。

现在我的问题是:发生这种情况的情况是否极其罕见,我不应该费心处理这种事件。还是我必须处理它?例如,我不能只向用户显示一条错误消息,表示并非所有数据都已发送,然后中止连接而不是尝试恢复吗?

注意:我正在使用IOCP。

只要接收方比发送方慢,它就可能发生。您必须通过重新安排要写入的剩余数据来处理它。不要将其视为错误。

使用重叠 I/O 和 IOCP 发送时,您不太可能看到部分发送。您更有可能看到发送错误,您希望发送系统页面大小的倍数,但只发送了一个较小的倍数,但即使这样也不太可能(而且我没有强制执行的单元测试我认为这是理论上的情况)。

当通过 TCP 连接通过重叠 I/O 发送时,当您的对等方接收和处理速度比您发送的速度慢时,this 是您更可能遇到的情况,即即,TCP 流量控制启动,您的 WSASend() 调用需要越来越长的时间才能完成。

您实际上不太可能在 WSASend() 调用或后续 GetQueuedCompletionStatus() 调用中看到错误。事情会继续工作,直到他们不...