没有线程的I / O完成端口

时间:2017-03-03 12:39:41

标签: sockets io-completion-ports

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

这可能还是有另一种方法来实现这一目标?

0 个答案:

没有答案