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

📄 monitordemo.cpp

📁 网络通信模块。开发包的使用者需要自行承担使用本开发包的风险
💻 CPP
字号:
// monitorDemo.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "monitorDemo.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif

/*
演示 CRemoteMonitorManager CBufferWnd CConsoler 的使用
1 功能在8099端口监听客户端连接
2 在处理线程中接收客户端输入,并且将客户端输入显示到主界面和所有客户连接上
3 定时插入一些Demo数据
4 从CClrOutputDisplay 派生新类完成输出显示功能
*/
// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

#define SVR_NAME			"MDEMOSVR"


/*
测试方法:运行 telnet localhost 8099
*/
void RmtCallBack(CRemoteHelper* pHelper,SOCKET sockComm)
{
	CTCPSocket sock(sockComm,FALSE);
	char szBuf[400]={0};
	CString szU,szP;
	int iInput = pHelper->GetUsernameAndPwd(szU,szP,30,FALSE,TRUE);//身份验证
	// 比较 szU,szP确定身份

	while(1)
	{
		char szOut[200]={0};
		if(!pHelper->IsGoon())
		{
			sprintf(szOut,"{%d} IsGoon = FALSE,退出服务线程",pHelper->GetSeqID());
			pHelper->GetRemoteMonitorManager()->OutputToMainConsole(COutputDisplay::GeneralWarn,szOut,TRUE,FALSE);
			break;
		}
		if(!pHelper->SendBufMsgToClient())
		{
			printf(szOut,"{%d} 发送错误,退出服务线程",pHelper->GetSeqID());
			pHelper->GetRemoteMonitorManager()->OutputToMainConsole(COutputDisplay::GeneralError,szOut,TRUE,FALSE);
			break;
		}
		/* 方法一 线程自己利用SOCKET进行读写操作
		int iRead;
		memset(szBuf,0,sizeof(szBuf));
		int iRet =sock.TestAndRecv(0,100,(BYTE*)szBuf,iRead);
		if(iRet == SP_ERR_SUCCESS || iRet == SP_ERR_NOT_FINISH)
		{//接收连接端输入,并且在所有的屏幕上进行显示
			sprintf(szOut,"[%d] read %s",pHelper->GetSeqID(),szBuf);
			pHelper->GetRemoteMonitorManager()->OutputToMainConsole(szOut,TRUE,FALSE);
		}
		else if(iRet == SP_ERR_NETWORK)
		{
			sprintf(szOut,"{%d} 接收失败【网络错误】,退出服务线程",pHelper->GetSeqID());
			pHelper->GetRemoteMonitorManager()->OutputToMainConsole(COutputDisplay::GeneralError,szOut,TRUE,FALSE);
			break;
		}
		*/
		// 方法二 利用 CRemoteHelper 提供的网络读功能,通过Helper对象的缓冲区接收数据
		int iRet,iErrorCode;
		//读入数据到缓冲区
		iRet = pHelper->ReadDataFromClient(4,iErrorCode,TRUE);
		if(iRet >0)
		{
			//取出一行数据
			iRet = pHelper->RemoveLineFromBuffer(szBuf,400,FALSE);
			if(iRet >0)//数据过长,则直接删除所有数据
			{//接收连接端输入,并且在所有的屏幕上进行显示
				pHelper->ClearBuffer();
				sprintf(szOut,"[%d] 缓冲区内数据过多,直接清除",pHelper->GetSeqID());
				pHelper->GetRemoteMonitorManager()->OutputToMainConsole(szOut,FALSE,FALSE);
			}
			else if(iRet==0)
			{//在主屏幕上进行显示
				sprintf(szOut,"[%d] read %s",pHelper->GetSeqID(),szBuf);
				pHelper->GetRemoteMonitorManager()->OutputToMainConsole(szOut,FALSE,FALSE);
				if(strcmp("help",szBuf) == 0)
				{//help command
					pHelper->GetRemoteHandlerData()->PushMsg("help : 帮助命令\n\r");
					pHelper->GetRemoteHandlerData()->PushMsg("exit : 退出命令\n\r");
				}
				if(strcmp("exit",szBuf)==0)
				{//exit command
					break;
				}
			}
		}
		else if(iRet ==-1 && iErrorCode == -1)
		{
			sprintf(szOut,"{%d} 接收失败【网络错误】,退出服务线程",pHelper->GetSeqID());
			pHelper->GetRemoteMonitorManager()->OutputToMainConsole(szOut,FALSE,FALSE);
			break;
		}
	}
}

void DoTest(void)
{
	CClrOutputDisplay oput;
	CRemoteMonitorManager *man =new CRemoteMonitorManager("Remote Monitor Test Server",RmtCallBack,"tserver",&oput,NULL,8099,100);
	BOOL fRet = man->StartMonitor();
	printf("start Monitor %s listen port = 8099\nRun \"telnet localhost 8099\" to test\n\n",(fRet)?"OK":"Error");
	for(int i=0;i<600;i++)
	{
		char szTemp[100];
		sprintf(szTemp,"%d AAAAAAAAAAAAAAAAAA %d\n\r",i,-i);
		man->PushMsg(szTemp);
		if(i % 20==0 )
		{
			sprintf(szTemp,"%d BBBBBBBBBBBBBBBBBBB %d\n\r",i,-i);
			man->PushUrgentMsg(szTemp);
			printf("No.%d\n",i);
		} 
		Sleep(5500);
	}
	printf("stop monitor\n");
	man->StopMonitor();
	delete man;
	printf("exit\n");
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	// 初始化 MFC 并在失败时显示错误
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// TODO: 更改错误代码以符合您的需要
		_tprintf(_T("致命错误:MFC 初始化失败\n"));
		nRetCode = 1;
	}
	else
	{
		ASSERT(AfxSocketInit());
		DoTest();
	}

	return nRetCode;
}

⌨️ 快捷键说明

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