📄 mainthread.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 + -