?? 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 + -