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;}
阅读全文
0 0
- C++封装select模型
- C-socket编程-Select()模型
- 面向接口的网络处理模型(封装select, epoll, poll)
- linux c/c++网络编程----select模型
- select 模型
- select模型
- Select模型
- Select模型
- Select模型
- SELECT模型
- select模型
- Select模型
- SELECT模型
- select 模型
- select模型
- select模型
- select模型
- SELECT模型
- 我的第一篇博客
- 在docker环境部署RabbitMQ并使用
- pandas时间序列
- Tomcat基本配置及常见问题
- 【POJ
- C++封装select模型
- 电路板上电源和地短路,电压一定会被拉到0v吗?
- pandas时间序列频率处理
- 解决html设置height:100%无效的问题
- Linux —— Vim批量操作,加密,外部命令及帮助
- 作业2
- linux命令详解(cat命令)
- sdnu1097
- Ubuntu下安装TensorFlow