예제 #1
0
	void CServerSocket::SetActive( bool value )
	{
		if (value)
		{
			if((m_IOCPSOCKET.ip == "")||(m_IOCPSOCKET.port == 0)||(m_IOCPSOCKET.socket !=INVALID_SOCKET))
				return;
			int i = 0;
			for ( i = m_iWorkThreadCount ;i >=0 ;i--)
			{
				if(m_WorkThread[i]!=NULL)
				{
				   m_WorkThread[i]->Terminate();
				   delete m_WorkThread[i];
				   m_WorkThread[i]=NULL;
				}
			}
			m_WorkThread[0]= new CWorkThread(this,true);

		}
		else
		{
			PostQueuedCompletionStatus(m_hIOCP,0,0,LPOVERLAPPED(SHUTDOWN_FLAG));
			int i = 0;
			for ( i = m_iWorkThreadCount-1 ;i >=0 ;i--)
			{
				if(m_WorkThread[i]!=NULL)
				{
				   m_WorkThread[i]->Terminate();
				   delete m_WorkThread[i];
				   m_WorkThread[i]=NULL;
				}
			}
		}
	}
예제 #2
0
void CZQWorkThread::Execute()
{
	DWORD dwBytestransferred;
	HANDLE  hIOCP = (HANDLE)m_parentsocket->m_hCompletionPort;
	SOCKET tsocket = INVALID_SOCKET;
	pBlock block = NULL;

	while (!Terminated())
	{
		DWORD NumberOfBytesRevced = 0;
		DWORD flag = 0;
		CZQCustomClient * client = NULL;

		BOOL ret = GetQueuedCompletionStatus(hIOCP, &dwBytestransferred, (PULONG_PTR)&client, (LPOVERLAPPED*)&block, INFINITE);

		if ((DWORD)block == SHUTDOWN_FLAG)
		{
			Terminate();
		}
		if (Terminated())
		{
			if (client != NULL)
				client->ForceClose();
			break;
		}
		if ((!ret) && dwBytestransferred == 0)
		{
			if (client != NULL)
				client->ForceClose();
			continue;
		}
// 		if ((DWORD)block == DISCONNECT_FLAG)
// 		{
// 			client->ForceClose();
// 			delete(client);
// 		}
		if (((DWORD)block == DISCONNECT_FLAG) && (client != NULL))
		{
			//释放这个客户端
			m_parentsocket->FreeClient(client);
			continue;
		}

		if ((dwBytestransferred != 0) && (ret))
		{
			switch (block->OperatorType)
			{
			case ioRead:
				client->DoRevice(block,dwBytestransferred);
				break;
			case ioWrite:
				client->DoSend(block, dwBytestransferred);
				break;
			default:
				break;
			}
		}
	}

	PostQueuedCompletionStatus(m_parentsocket->m_hCompletionPort, 0, 0, LPOVERLAPPED(SHUTDOWN_FLAG));
}