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

📄 ctelnetview.cpp

📁 Visual+C++网络通信协议分析
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			m_strLine += ch;
			break;
		} 

		ndx ++;


		if (ndx == nBytes)
		{
			bLine = TRUE;
		}
	}
	return bLine;
}

//数据处理
void CTelnetView::MessageReceived(LPCSTR pText)
{
	BOOL bSkip = FALSE;
	int loop=0;
	CString tempStr="0123456789;";
	CString tempStr2;
	int ColorVal;
	int tempY=0;

	CDC * pDC = GetDC();
	OnPrepareDC(pDC);
	DrawCursor(pDC,FALSE);

	CRect clip;
	pDC->GetClipBox(clip);

	CMainFrame * frm = (CMainFrame*)GetTopLevelFrame();
	//设置颜色
	pDC->SetTextColor(cTextColor);
	pDC->SetBkColor(cBackgroundColor);

	pDC->SelectObject(GetStockObject(ANSI_FIXED_FONT));
	int length = strlen(pText);
	char text[2] = {0x00, 0x00};
	while(loop < length)
	{
		switch(pText[loop])
		{
		case 8: //删除
			CurrentXX--;
			if(CurrentXX < 0) CurrentXX = 0;
			loop++;
			break;
		case 9: //TAB键
			CurrentXX++; //TBD make this smarter
			loop++;
			break;
		case 13: //换行CR
			m_strline.Empty();
			CurrentXX = 0;
			loop++;
			break;
		case 27:
			loop++;
			//分析紧接着27的字符是否是91,如果不是91,则这两个字符都不作处理了,直接跳出
			if (pText[loop]!=91) 
			{
				loop++;
				break;
			}
			//如果是91,则接下来的数据则是系统相关数据
			else
			{
				loop++;
				while (tempStr.Find(pText[loop])!=-1) 
				{
					tempStr2+=pText[loop];
					loop++;
				}
				if (pText[loop]=='m')//如果接下来的数据是m,则分析前面获得的字符串
				{

					//循环获得字符串中的值,其中字符串中的值都是以分号隔开的
					while (tempStr2!="")
					{
						if (tempStr2.Find(";")!=-1)
						{
							ColorVal=atoi(tempStr2.Mid(0,tempStr2.Find(";")));
							tempStr2=tempStr2.Mid(tempStr2.Find(";")+1);

						}
						else
						{
							ColorVal=atoi(tempStr2);
							tempStr2.Empty();
						}

						//获得一个值
						//改变前景颜色,这个颜色可以按照一定的规则来自定义
						
						if (ColorVal>29 && ColorVal<38)
							//cTextColor=RGB(0,0,255);
						//设置背景颜色
						if (ColorVal>39 && ColorVal<48)
							//cBackgroundColor=RGB(0,255,ColorVal);
						//恢复基本设置
						if (ColorVal==0)
						{
							//cBackgroundColor=RGB(0,0,0);
							//cTextColor=RGB(255,255,255);
						}
						//如果为1,则设置前景色
						//if ColorVal==1
						//表示要反色
						//if ColorVal==7

					}
				}
				//如果为字符K,表示要画一条以背景色的矩形区域
				if (pText[loop]=='K')
				{

					int x,y;
					CString myStr;
					//保持原来的坐标

					//画出矩形区域,因为以背景色画,所以相当于移动光标
					//将坐标变量改变到目前的位置
					x=CurrentXX;
					y=CurrentYY;
					for (int l=CurrentXX;l<80;l++)
					{
						cText[l][CurrentYY]=' ';
						myStr+=' ';
					}
					pDC->TextOut(x*dtX, y * dtY, myStr);

					CurrentXX=x;
					CurrentYY=y;

				}
	            //如果字符为C,表示要改变当前的横坐标
				if (pText[loop]=='C')
				{
	            //获得横坐标的改变量
					if (tempStr2.Find(";")!=-1)
					{
						ColorVal=atoi(tempStr2.Mid(0,tempStr2.Find(";")));
						tempStr2=tempStr2.Mid(tempStr2.Find(";")+1);
					}
					else
					{
						ColorVal=atoi(tempStr2);
						tempStr2.Empty();
					}
					//然后增建坐标值,注意这里要加上字符宽度
					CurrentXX=CurrentXX+ColorVal;
				}
				//如果字符为H,表示重新设置横坐标和纵坐标
				if (pText[loop]=='H')
				{
                //获得纵坐标值,在服务器发送的过程中,先发送纵坐标值
				TRACE0("H");

				int tX=0,tY=0;
				//char buffer3[20];
					tY=atoi(tempStr2.Mid(0,tempStr2.Find(";")));
					tempStr2=tempStr2.Mid(tempStr2.Find(";")+1);
					//获得横坐标值,注意这里获得值是没有加字符宽度的
					tX=atoi(tempStr2);
					if (tX>0 && tY>0)
					{
						CurrentYY=tY-1;
						CurrentXX=tX-1;
					}
				}

				//如果为字符J,表示要清除整个屏幕
				if (pText[loop]=='J')
				{
					ClearWindows(pDC);
				}
			}
			loop++;
			IfOutput=false;
			break;
		case 0:
			loop++;
		case 10: //换行
			{
				
				CurrentYY=CurrentYY+1;
				if (CurrentYY>=bufferLines)
				{
					for(int row = 0; row < bufferLines; row++)
					{
						for(int  col = 0; col < 80; col++)
						{
							cText[col][row] = cText[col][row+1];
						}
					}
					for(int  col = 0; col < 80; col++)
					{
						cText[col][bufferLines-1] = ' ';
					}
				CurrentYY=CurrentYY-1;
				DoDraw(pDC);
				}
				
			}
			loop++;
			break;

		default://输出数据
			{
					cText[CurrentXX][CurrentYY] = pText[loop];
					m_strline.Empty();
					for (int i=0;i<80;i++)
					{
						if (cText[i][CurrentYY]!=27)
							m_strline += cText[i][CurrentYY];
						else
							break;
					}


					pDC->TextOut(0, CurrentYY * dtY, m_strline);
					CurrentXX++;
				
			}
			tempStr2.Empty();
			loop++;

			break;
		}
	}
	DrawCursor(pDC,TRUE);
	ReleaseDC(pDC);
}

//按键处理
void CTelnetView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	//发出回车键
	if (nChar == VK_RETURN)
	{
		DispatchMessage("\r\n");
	}
	else
	{
		DispatchMessage(nChar);
	}
}

//画光标
void CTelnetView::DrawCursor(CDC * pDC, BOOL pDraw)
{
	COLORREF color;
	CMainFrame * frm = (CMainFrame*)GetTopLevelFrame();
	if(pDraw) //draw
	{
		color = cTextColor;
	}
	else //erase
	{
		color = cBackgroundColor;
	}
	CRect rect(CurrentXX * dtX + 2, CurrentYY * dtY + 1, 
		CurrentXX * dtX + dtX - 2, CurrentYY * dtY + dtY -1);
	pDC->FillSolidRect(rect, color);
}

void CTelnetView::OnSize(UINT nType, int cx, int cy) 
{
	CScrollView::OnSize(nType, cx, cy);
	if(IsWindow(m_hWnd))
	{
		if(IsWindowVisible())
		{
			//ScrollToPosition(CPoint(0, bufferLines * 1000)); //go way past the end
		}
	}
}

BOOL CTelnetView::OnEraseBkgnd(CDC* pDC) 
{
	CRect clip;
	pDC->GetClipBox(clip);
	CMainFrame * frm = (CMainFrame*)GetTopLevelFrame();
	pDC->FillSolidRect(clip,cBackgroundColor);
	return TRUE;
}

//查找字符
int CTelnetView::Find(CString str, char ch)
{
	char* data = str.GetBuffer(0);
	int len = str.GetLength();
	int i = 0;
	for(i = 0; i < len; i++){
		if(data[i] == ch)
			break;
	}
	str.ReleaseBuffer();
	return i;
}

//方向键处理
void CTelnetView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	unsigned char myChar[3];

	// TODO: Add your message handler code here and/or call default
	//左方向键
	if (nChar==37)
	{
		myChar[0]=27;
		myChar[1]=91;
		myChar[2]=68;

		DispatchMessage(myChar);
	}
	//右方向键
	else if (nChar==39)
	{
		myChar[0]=27;
		myChar[1]=91;
		myChar[2]=67;

		DispatchMessage(myChar);
	}
	//上方向键
	else if (nChar==38)
	{
		myChar[0]=27;
		myChar[1]=91;
		myChar[2]=65;

		DispatchMessage(myChar);
	}
	//下方向键
	else if (nChar==40)
	{
		myChar[0]=27;
		myChar[1]=91;
		myChar[2]=66;

		DispatchMessage(myChar);
	}
	CView::OnKeyDown(nChar, nRepCnt, nFlags);
	//MessageBox((char*)nChar);
}

//清除屏幕
void CTelnetView::ClearWindows(CDC *pDc)
{
	for(int x = 0; x < 80; x++)
	{
		for(int y = 0; y < bufferLines; y++)
		{
			cText[x][y] = ' ';
		}
	}
	DoDraw(pDc);
	CurrentYY=0;
	CurrentXX=0;
}

void CTelnetView::OnFileNew() 
{
	BOOL bOK;

	// TODO: Add your command handler code here
	//弹出设定服务器对话框
	CHostDialog host;
	host.DoModal();
	cHostName = host.m_HostName;

	//创建socke
	cSock = new CClientSocket(this);
	if(cSock != NULL)
	{
		bOK = cSock->Create();
		if(bOK == TRUE)
		{
			cSock->AsyncSelect(FD_READ | FD_WRITE | FD_CLOSE | FD_CONNECT | FD_OOB);
			//连接服务器
			cSock->Connect(cHostName, 23);
			//设定标题
			GetDocument()->SetTitle(cHostName);
			Sleep(90);
		}
		else
		{
			ASSERT(FALSE);  
			delete cSock;
			cSock = NULL;
		}
	}
	else
	{
		AfxMessageBox("不能创建socket",MB_OK);
	}
}

⌨️ 快捷键说明

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