关于重叠I/O完成例程
在csdn精品图书中下载的《网络编程》原码Chapter08\Callback\callback.cpp中,
DWORD WINAPI WorkerThread(LPVOID lpParameter)
{
...
while(true)
{
WSAWaitForMultipleEvents(1, EventArray, FALSE, WSA_INFINITE, TRUE);
...
WSARecv(SocketInfo->Socket, &(SocketInfo->DataBuf), 1, &RecvBytes,&Flags,&(SocketInfo->Overlapped), WorkerRoutine);
...
}
}
void CALLBACK WorkerRoutine(DWORD Error, DWORD BytesTransferred,
LPWSAOVERLAPPED Overlapped, DWORD InFlags)
{
...
WSASend(SI->Socket, &(SI->DataBuf), 1, &SendBytes,&(SI->Overlapped), WorkerRoutine);
...
}
其中某一客户端connect时触发服务端EventArray后,服务端WSAWaitForMultipleEvents返回,接着执行WSARecv,再回到WSAWaitForMultipleEvents等待;
当客户端send后,服务端干了两件事:
1、使WSAWaitForMultipleEvents再次返回;
2、服务端重叠I/O完成例程WorkerRoutine被执行。
因为WorkerRoutine中调用了WSASend。当WSASend完成后,我认为服务端仍然要干两件事:
1、服务端重叠I/O完成例程WorkerRoutine应该再次被执行,这没错。
2、使WSAWaitForMultipleEvents应该返回,可程序并没这样,为什么?