⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainthread.cpp

📁 一个声讯平台的管理平台.包括平台的客户端何服务器端口.是个不错的软件.
💻 CPP
字号:
// MainThread.cpp : implementation file
//

#include "stdafx.h"
#include "IvrServer.h"
#include "IvrServerView.h"
#include "MainThread.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainThread

IMPLEMENT_DYNCREATE(CMainThread, CWinThread)

int iCountClient=0;
extern int iMaxClients;
extern int iPort;
extern int bNeed;

CMainThread::CMainThread()
{
}

CMainThread::~CMainThread()
{
}

BOOL CMainThread::InitInstance()
{
	// TODO:  perform and per-thread initialization here
	return TRUE;
}

int CMainThread::ExitInstance()
{
	// TODO:  perform any per-thread cleanup here
	return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CMainThread, CWinThread)
	//{{AFX_MSG_MAP(CMainThread)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMainThread message handlers

int CMainThread::OnCreatSock()
{
	//启动服务

	//加载DLL库

	//
	return RETCODE_SUCCESS;
}


//当有数据到达时,需要轮循TCP/IP套接字(这是取列)
int CMainThread::OnProcessAccpt()
{
	fd_set	fdset;
	struct	timeval tv;
	struct	sockaddr_in cli_addr;
	char	sTemp[STRTEMP_LEN];
	int		ret,addrlen;
	int		RemoteClientSocket =0;
	class   CProcTcpClientThread  *pProCProcTcpClientThreadThread;
	
	//0.
	memset(sTemp,0x00, sizeof(sTemp));
	pProCProcTcpClientThreadThread = NULL;
    FD_ZERO(&fdset);
	tv.tv_sec =0;
	tv.tv_usec =0;
	FD_SET((unsigned )ServerSock,&fdset);
	
	//1.
	ret=select(ServerSock+1,&fdset,NULL,NULL,&tv);
	if ( ret >= RETCODE_SUCCESS)
	{
		//有连接请求或数据到达.
		addrlen=sizeof(cli_addr);
		while(1)
		{
			RemoteClientSocket=accept(ServerSock,
							(struct sockaddr *)&cli_addr,
							&addrlen);
			if(RemoteClientSocket > RETCODE_SUCCESS)
			{
				iCountClient++;
		 		if(iCountClient>= (iMaxClients -1) )
				{
					closesocket(RemoteClientSocket);  
					m_pDoc->ShowMsg("对不起,连接客户已经满了!",bNeed);
					iCountClient = 0;
				}
				else
				{
					//产生新线程来处理新连接
					pProCProcTcpClientThreadThread = \
						(CProcTcpClientThread *)AfxBeginThread(RUNTIME_CLASS(CProcTcpClientThread),\
						THREAD_PRIORITY_NORMAL,\
						0,\
						CREATE_SUSPENDED,\
						NULL);

           			if (pProCProcTcpClientThreadThread!=NULL)
					{
						sprintf(sTemp,"连接客户数目:%d IP地址为:%s 套接字为:%d的客户接入,线程:%p已经接受处理",iCountClient, inet_ntoa(cli_addr.sin_addr),RemoteClientSocket,(void *)pProCProcTcpClientThreadThread);
						m_pDoc->ShowMsg(sTemp,bNeed);
						pProCProcTcpClientThreadThread->RemoteClientSocket=RemoteClientSocket;
						//pProCProcTcpClientThreadThread->m_bAutoDelete =true;
						pProCProcTcpClientThreadThread->m_pDoc=m_pDoc;
						memcpy(pProCProcTcpClientThreadThread->cIp,inet_ntoa(cli_addr.sin_addr),16);
						pProCProcTcpClientThreadThread->ResumeThread();
					}
				}
			}
			else
			{
				closesocket(RemoteClientSocket);           
			}
		}
	
	}
	return RETCODE_SUCCESS;

}

int CMainThread::Run() 
{
	// TODO: Add your specialized code here and/or call the base class
	//1.启动TCP/IP服务器程序,并加载高阳的动态库
	if(OnCreatSock()== RETCODE_FAIL)
	{
		StopThread();
		return RETCODE_FAIL;
	}

	//所有业务处理流程
	OnProcessAccpt();

	return RETCODE_SUCCESS;

}

//异常处理
void CMainThread::StopThread()
{
	StopEvent.SetEvent();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -