C++封装select模型

来源:互联网 发布:中农数据食堂采配平台 编辑:程序博客网 时间:2024/06/10 14:34
// SelectModule.h: interface for the CSelectModule class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_SELECTMODULE_H__E53730A1_AC83_4698_8E8A_27D6B3DDC5D9__INCLUDED_)#define AFX_SELECTMODULE_H__E53730A1_AC83_4698_8E8A_27D6B3DDC5D9__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000class CSelectModule  {public:CSelectModule();~CSelectModule();int GetClientCount();SOCKET* GetClientSockAry();BOOL AddSock(SOCKET ClientSock);BOOL DeleteSock(int index);BOOL CreateSelectThread();void SetThreadState(BOOL bFlag);static int m_nAllClientSockCount;  //总的客户端数量static CRITICAL_SECTION m_CRitical_Section;private:SOCKET m_ClientSocketAry[FD_SETSIZE];int m_nClientSockCount;            //当前socket的个数HANDLE m_hThread;BOOL m_bFlag;  };#endif // !defined(AFX_SELECTMODULE_H__E53730A1_AC83_4698_8E8A_27D6B3DDC5D9__INCLUDED_)// SelectModule.cpp: implementation of the CSelectModule class.////////////////////////////////////////////////////////////////////////
#include "stdafx.h"#include "SelectModule.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////int CSelectModule::m_nAllClientSockCount = 0;  //总的客户端数量CRITICAL_SECTION CSelectModule::m_CRitical_Section;DWORD WINAPI SelectThreadProc(LPVOID lpParameter){CSelectModule *pSelectMoulde = (CSelectModule*)lpParameter;if( NULL != pSelectMoulde){fd_set fdRead;timeval tv = {2 , 0};int nResult = 0;int nClientCount = 0;SOCKET *pClientSock = NULL;TCHAR szRecvBuf[4096] = "";while(true){FD_ZERO(&fdRead);nClientCount = pSelectMoulde->GetClientCount();if( 0 == nClientCount) break; //当前无客户端连接pClientSock = pSelectMoulde->GetClientSockAry();for(int i = 0 ; i < nClientCount ; i++)FD_SET(pClientSock[i],&fdRead);nResult = select(0,&fdRead,NULL,NULL,&tv);//等待时间1秒if( 0 == nResult) continue;for(i = 0 ; i < pSelectMoulde->GetClientCount() ; i++){if( FD_ISSET(pClientSock[i],&fdRead)){nResult = recv(pClientSock[i],szRecvBuf,4096,0);if( 0 == nResult || SOCKET_ERROR == nResult){//客户端断开cout << "Client is Disconnect!" << pClientSock[i] << endl;pSelectMoulde->DeleteSock(i);cout << "****************Current Client TotalCount:" << CSelectModule::m_nAllClientSockCount << "**********************"<<endl;i--;}else{szRecvBuf[nResult] = '\0';send(pClientSock[i],szRecvBuf,strlen(szRecvBuf) + 1,0);}}}}}cout << " ++++++++++++++++++++++++++Thread Exit!++++++++++++++++++++++++++" << endl;pSelectMoulde->SetThreadState(FALSE);return 0;}CSelectModule::CSelectModule(){m_nClientSockCount = 0;            //当前socket的个数     m_bFlag = FALSE;                   //线程挂起//初始化线程将线程挂起m_hThread = NULL ;}CSelectModule::~CSelectModule(){}BOOL CSelectModule::CreateSelectThread(){m_hThread = CreateThread(NULL,0,SelectThreadProc,this,0,0);//创建线程时挂起cout << "+++++++++++++++++++++++++++++CreateThread+++++++++++++++++++++++++++" << endl;m_bFlag = TRUE;return FALSE;}void CSelectModule::SetThreadState(BOOL bFlag){m_bFlag = bFlag;}int CSelectModule::GetClientCount(){return m_nClientSockCount;}SOCKET* CSelectModule::GetClientSockAry(){return m_ClientSocketAry;}BOOL CSelectModule::AddSock(SOCKET ClientSock){if( INVALID_SOCKET != ClientSock){::EnterCriticalSection(&CSelectModule::m_CRitical_Section);m_ClientSocketAry[m_nClientSockCount++] = ClientSock;m_nAllClientSockCount++;if( FALSE == m_bFlag) //线程未创建{CreateSelectThread();cout << "Create is succeed!" << endl;}::LeaveCriticalSection(&CSelectModule::m_CRitical_Section);}return FALSE;}BOOL CSelectModule::DeleteSock(int index){if( index >= 0 && index < m_nClientSockCount){::EnterCriticalSection(&CSelectModule::m_CRitical_Section);closesocket(m_ClientSocketAry[index]);m_ClientSocketAry[index] = m_ClientSocketAry[m_nClientSockCount - 1];m_nClientSockCount--;m_nAllClientSockCount--;::LeaveCriticalSection(&CSelectModule::m_CRitical_Section);return TRUE;}return FALSE;}BOOL CListenSock::AcceptSock(){      SOCKET ClientSock = NULL;        CSelectModule SelectModuleAry[4];      int nClientCount = 0;            ::InitializeCriticalSection(&CSelectModule::m_CRitical_Section);     while(true)     {      ClientSock = accept(m_ListenSock,NULL,NULL);     //投递socket    if( CSelectModule::m_nAllClientSockCount > 200)continue;             cout << "Client is Connect Succeed!" << endl;    for(int i = 0 ; i < 4 ; i++) //先找启动的线程    {      nClientCount = SelectModuleAry[i].GetClientCount();    if( nClientCount > 0 && nClientCount < FD_SETSIZE)    {     SelectModuleAry[i].AddSock(ClientSock);break;    }    }   if( 4 == i)    {    for( i = 0 ; i < 4 ; i++) //在创建新的线程     {       if( 0 == SelectModuleAry[i].GetClientCount())       {          SelectModuleAry[i].AddSock(ClientSock);         break;      }     }        }    cout << "****************Current Client TotalCount:" << CSelectModule::m_nAllClientSockCount << "**********************"<<endl;}return FALSE;}
原创粉丝点击