//thread for monitor the client number unsigned int ServerSocket::addClientMonitorThread(LPVOID lpParam) { ServerSocket* pServer = (ServerSocket*)lpParam; HANDLE hList[2]; hList[0] = pServer->m_addClientEvent; hList[1] = pServer->m_monitorEndEvent; DWORD dwRet; while(1) { dwRet = WaitForMultipleObjects(2, hList, FALSE, 5000); if(dwRet == WAIT_OBJECT_0) { pServer->postEvent(OP_ADDCLIENT); } else if(dwRet == WAIT_OBJECT_0+1) { return 0; } else if(dwRet == WAIT_TIMEOUT) { pServer->postEvent(OP_MAINTENANCE); } } while(1) { ClientConnect clientConnect; int clientAddrLen = sizeof(clientConnect.clientSockAddr); clientConnect.m_socket = accept(pServer->m_socket, (sockaddr*)&clientConnect.clientSockAddr, &clientAddrLen); if(clientConnect.m_socket < 0) printf("accept() failed\n"); else { printf("Client(IP:%s) connected\n", inet_ntoa(clientConnect.clientSockAddr.sin_addr)); //把客户端连接保存起来 int idx = g_clientConnectManager->addClient(clientConnect); ClientConnect* pClientConnect = g_clientConnectManager->getClient(idx); CreateIoCompletionPort((HANDLE)(pClientConnect ->m_socket), pServer->m_completionPort, (ULONG_PTR)pClientConnect, 0); // 开始在接受套接字上处理I/O使用重叠I/O机制 // 在新建的套接字上投递一个或多个异步 // WSARecv或WSASend请求,这些I/O请求完成后,工作者线程会为I/O请求提供服务 // 单I/O操作数据(I/O重叠) OVERLAPPED_PLUS* ov = new OVERLAPPED_PLUS; ZeroMemory(&(ov->overlapped), sizeof(OVERLAPPED)); ov->WsaBuf.len = MAX_TCPBUFFER_SIZE; ov->WsaBuf.buf = ov->buffer; DWORD RecvBytes; DWORD Flags = 0; WSARecv(pClientConnect->m_socket, &(ov->WsaBuf), 1, &RecvBytes, &Flags, &(ov->overlapped), NULL); } } return 0; }