我正在实现一个客户端/服务器对,通过 TCP/IP 套接字进行通信,在 Windows 中使用重叠 IO 和完成例程。使用两个 VirtualBox 虚拟机(一个客户端,另一个服务器)进行调试。CPU是四核的。
客户端上的操作顺序基本上是:
- 发出 WSARecv 调用(目前尚未完成)。
- 使用数据包发出 WSASend 调用。服务器将通过同一个套接字发送回复。
- 一旦执行了 WSASend 调用的完成例程,数据包就会被放入等待回复队列中。
- 一旦 WSARecv 调用的完成例程执行(收到来自服务器的回复),代码就会尝试在队列中定位与此回复相关的数据包。
- 发出 WSARecv 调用(目前尚未完成)。
- 从第二步开始重复。
服务器上的操作顺序基本上是:
- 发出 WSARecv 调用(目前尚未完成)。
- 一旦 WSARecv 调用的完成例程执行(收到来自客户端的数据包),数据包就会在辅助线程中处理。
- 发出 WSARecv 调用(目前尚未完成)。
- 一旦辅助线程完成,就会向客户端发送回复,在主线程上发出 WSASend 调用。
- 从第二步开始重复。
我遇到的问题是有时在客户端收到回复,而等待回复队列中没有相应的数据包。作为调试工作的一部分,我有两个问题:
1) 是否可以想象,在有一个挂起的 WSARecv 调用时,WSARecv 的完成例程被安排在相应 WSASend 的完成例程之前执行(发送服务器回复的数据包的那个)?
2) 如果 WSASend 调用立即完成,完成例程是否仍计划执行?
我正在使用 WSAWaitForMultipleEvents 调用作为警报等待函数。