1

问题是关于如何只使用一个循环来处理主程序线程内的所有套接字请求。这可以使用 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
   }
}

这是可能的还是有其他方法可以实现?

4

0 回答 0