コード例 #1
0
//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;
}