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