问题是如何只使用一个循环来处理主程序线程中的所有套接字请求。 这可以使用WSAEventSelect和WSAWaitForMultipleEvents,但我们在这里限制为64个事件。 我也可以使用WSAAsyncSelect,但我需要一个窗口来处理套接字消息。
我没有找到的是如何使侦听套接字与I / O完成异步工作。 GetQueuedCompletionStatus函数似乎用于数据传输,但不处理传入的连接请求。
我的想法如下:
CompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1)
Listen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED)
bind
listen
myData[index]->s = Listen;
CreateIoCompletionPort((HANDLE)Listen, CompletionPort, &myData[index], 1)
index++;
while(TRUE) {
GetQueuedCompletionStatus(CompletionPort, &BytesTransferred, (LPDWORD)&PerHandleData, (LPOVERLAPPED *)&PerIoData, INFINITE)
if(PerHandleData->s == Listen)
AcceptReq = new socket;
myData[index]->s = Listen;
CreateIoCompletionPort((HANDLE)AcceptReq, CompletionPort, &myData[index], 1)
WSARecv(AcceptReq)
index++;
}
else {
// Process received/transmitted data
}
}
这可能还是有另一种方法来实现这一目标?