我正在开发一个Windows IOCP服务器,需要准确检测客户端何时进入零窗口状态。具体来说,我想了解服务器在尝试使用 WSASend() 发送数据并使用 GetQueuedCompletionStatus() (GQCS) 处理工作线程中的完成状态时如何识别这种情况。
当我怀疑客户端处于零窗口状态时,我尝试使用 WSASend() 发送数据。我期望收到指示零窗口条件的特定错误代码或完成状态。但是,我不确定检测此状态的确切机制以及我应该在 IOCP 工作线程中查找哪些错误代码或返回值。 我当前的实现包括:
我想可靠地区分真正的零窗口状态和其他网络通信问题。
我期望收到指示零窗口条件的特定错误代码或完成状态。
那么你的期望就错了。 “零窗口状态”不是错误条件,因此不会向您报告该状态的错误/完成。 它由系统内部处理。
但是,我不确定检测此状态的确切机制以及我应该在 IOCP 工作线程中查找哪些错误代码或返回值。
没有。如果客户端的接收缓冲区已满,则发送操作将处于挂起状态,直到客户端清理一些缓冲区空间。在发送操作完全完成之前,您不会收到完成/错误报告,要么是因为某些数据最终交付给客户端(或者至少由内核在本地排队等待最终交付),要么是套接字实际上失败了真实的错误情况。
我想可靠地区分真正的零窗口状态和其他网络通信问题。
你将无法做到这一点。 即使您使用非 IOCP 发送,也永远不会向您报告该状态。 发送的数据在本地内核中排队,一旦内核接受或拒绝数据,代码执行就会返回给您。到对等方的实际传输是在后台完成的。 您无权访问该级别的状态信息。
如果内核接受数据,您将获得带有成功代码的完成。 如果内核出于任何原因拒绝数据,您将获得带有相关错误代码的完成。 在内核做出决定之前,发送操作正在进行中。