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

📄 clientsocket.cpp

📁 网络数据库管理软件是一个集网络技术与数据库技术于一体的软件
💻 CPP
字号:
// ClientSocket.cpp : implementation file
//

#include "stdafx.h"
#include "ClientSocket.h"
#include "datamanager.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CClientSocket

CClientSocket::CClientSocket(CServerSocket* pServerSocket)
{
	m_pServerSocket=pServerSocket;
	m_pFile = NULL;
	m_pArchiveIn = NULL;
	m_pArchiveOut = NULL;
	m_bNetConnected=false;
}

CClientSocket::~CClientSocket()
{
	if (m_pArchiveOut != NULL)
		delete m_pArchiveOut;

	if (m_pArchiveIn != NULL)
		delete m_pArchiveIn;

	if (m_pFile != NULL)
		delete m_pFile;
}


// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CClientSocket, CSocket)
	//{{AFX_MSG_MAP(CClientSocket)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif	// 0

/////////////////////////////////////////////////////////////////////////////
// CClientSocket member functions

void CClientSocket::OnReceive(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
	CSocket::OnReceive(nErrorCode);
	LPMODFRAME  lpreceive;
	LPSTR		lpTemp;
	UINT		nLong;
	do
	{
		lpreceive = new ModFrame;
		*m_pArchiveIn >> lpreceive->nOrder;
		*m_pArchiveIn >> nLong;
		
		lpTemp = lpreceive->Content.GetBuffer(nLong + 1);
		m_pArchiveIn->Read(lpTemp,nLong);
		lpTemp[nLong]= 0;
		lpreceive->Content.ReleaseBuffer(-1);
		HandleNetData(lpreceive);
		delete lpreceive;
	}
	while(!m_pArchiveIn->IsBufferEmpty());
}

void CClientSocket::Init()
{
	m_pFile = new CSocketFile(this);
	m_pArchiveIn = new CArchive(m_pFile,CArchive::load);
	m_pArchiveOut = new CArchive(m_pFile,CArchive::store);
}

void CClientSocket::SendFrame(LPMODFRAME lpSend)
{
	LPSTR		lpTemp;
	UINT		nLong = lpSend->Content.GetLength();
	
	*m_pArchiveOut << lpSend->nOrder;
	*m_pArchiveOut << nLong;
	
	lpTemp = lpSend->Content.LockBuffer();
	m_pArchiveOut->Write(lpTemp,nLong);
	
	lpSend->Content.ReleaseBuffer();
	m_pArchiveOut->Flush();
}

void CClientSocket::HandleNetData(LPMODFRAME pFrame)
{
	CControlSegment		*lpTempSegment;
	CControlUnit		*lpTempUnit;
	CControlPoint		*lpTempPoint;
	CString				TempSegmentName , TempUnitName , TempPointName , strTemp;
	int					nFindPos , nSubPos,i;
	
	switch(pFrame->nOrder)
	{
	case 2:
		{
			pFrame->nOrder = 3;
			pFrame->Content=""; 
			this->SendFrame(pFrame);
		}
	case 4:
		{
			if(pFrame->Content.Right(1) == ";")
				pFrame->Content = pFrame->Content.Left
								(pFrame->Content.GetLength() - 1);
			nFindPos = pFrame->Content.Find(';');
			if(nFindPos < 0)
				break;
			strTemp = pFrame->Content.Left(nFindPos);
			pFrame->Content = pFrame->Content.Right
						(pFrame->Content.GetLength() - nFindPos - 1);
			
			p_ControlModule->AddSegment(strTemp); 
			lpTempSegment=p_ControlModule->GetSegment(strTemp);
			if (lpTempSegment==NULL)
				break;
			
			lpTempSegment->m_SegmentSocket=this; 
			pFrame->Content.Format("%s;",strTemp);
			pFrame->nOrder = 5;
			this->SendFrame(pFrame);
			break;
		}
	case 6:
		{
			if(pFrame->Content.Right(1) != ";")
				pFrame->Content += ";";
			
			nFindPos = pFrame->Content.Find(';');
			if(nFindPos < 0)
				break;
			strTemp=pFrame->Content.Left(nFindPos);
			pFrame->Content = pFrame->Content.Right
						(pFrame->Content.GetLength() - nFindPos - 1);
			lpTempSegment=p_ControlModule->GetSegment(strTemp); 
			if(lpTempSegment==NULL)
				break;
			
			while(!pFrame->Content.IsEmpty())
			{
				nFindPos = pFrame->Content.Find(';');
				if(nFindPos < 0)
					break;
				strTemp = pFrame->Content.Left(nFindPos);
				pFrame->Content = pFrame->Content.Right
						(pFrame->Content.GetLength() - nFindPos - 1);
				
				lpTempSegment->AddUnit(strTemp); 
			}
			
			for(i=0;i<lpTempSegment->GetUnitCount();i++)
			{
				pFrame->Content.Format("%s;",
						lpTempSegment->GetUnit(i)->GetUnitLongName());
				pFrame->nOrder = 7;
				this->SendFrame(pFrame);
			}
			break;
		}
	case 8:
		{
			if(pFrame->Content.Right(1) != ";")
				pFrame->Content += ";";
			
			nFindPos = pFrame->Content.Find(';');
			if(nFindPos < 0)
				break;
			strTemp = pFrame->Content.Left(nFindPos);
			pFrame->Content = pFrame->Content.Right
					(pFrame->Content.GetLength() - nFindPos - 1);
			nSubPos = strTemp.Find('.');
			if(nSubPos < 0)
				break;
			TempSegmentName = strTemp.Left(nSubPos);
			TempUnitName = strTemp.Mid(nSubPos+1);
			
			lpTempSegment=p_ControlModule->GetSegment(TempSegmentName); 
			if(lpTempSegment==NULL)
				break;
			
			lpTempUnit=lpTempSegment->GetUnit(TempUnitName);
			if(lpTempUnit==NULL)
				break;
			
			while(!pFrame->Content.IsEmpty())
			{
				nFindPos = pFrame->Content.Find(';');
				if(nFindPos < 0)
					break;
				
				strTemp = pFrame->Content.Left(nFindPos);
				pFrame->Content = pFrame->Content.Right
						(pFrame->Content.GetLength() - nFindPos - 1);
				nSubPos = strTemp.Find(',');
				if(nSubPos < 0)
					continue;
				
				CString m_strPointName=strTemp.Left(nSubPos);
				
				strTemp = strTemp.Mid(nSubPos + 1);
				nSubPos = strTemp.Find(',');
				if(nSubPos < 0)
					continue;
				CString m_strValue=strTemp.Left(nSubPos);
				CString m_strMemo=strTemp.Mid(nSubPos + 1);

				lpTempUnit->AddPoint(m_strPointName,m_strMemo); 
			}				
			
			break;
		}
	case 10:
		{
			CString		strValue;
			
			if(pFrame->Content.Right(1) != ";")
				pFrame->Content += ";";
			while(!pFrame->Content.IsEmpty())
			{
				nFindPos = pFrame->Content.Find(';');
				if(nFindPos < 0)
					break;
				strTemp = pFrame->Content.Left(nFindPos);
				pFrame->Content = pFrame->Content.Right
						(pFrame->Content.GetLength() - nFindPos - 1);
				nSubPos = strTemp.Find('.');
				if(nSubPos < 0)
					continue;
				TempSegmentName = strTemp.Left(nSubPos);
				lpTempSegment=p_ControlModule->GetSegment(TempSegmentName); 
				if(lpTempSegment==NULL)
					continue;
				
				strTemp = strTemp.Mid(nSubPos + 1);
				nSubPos = strTemp.Find('.');
				if(nSubPos < 0)
					continue;
				TempUnitName = strTemp.Left(nSubPos);
				lpTempUnit=lpTempSegment->GetUnit(TempUnitName); 
				if(lpTempUnit==NULL)
					continue;
				
				strTemp = strTemp.Mid(nSubPos + 1);
				nSubPos = strTemp.Find('=');
				if(nSubPos < 0)
					continue;
				TempPointName = strTemp.Left(nSubPos);
				lpTempPoint=lpTempUnit->GetPoint(TempPointName);
				if(lpTempPoint==NULL)
					continue;
				lpTempPoint->SetPointValue(strTemp.Mid(nSubPos + 1));
			}
			
		}
	}
}

void CClientSocket::OnClose(int nErrorCode) 
{
	// TODO: Add your specialized code here and/or call the base class
	m_bNetConnected=false;

	POSITION pos=m_pServerSocket->m_connectionList.Find(this);
	if (pos!=NULL)
		m_pServerSocket->m_connectionList.RemoveAt(pos); 

	CSocket::OnClose(nErrorCode);
}

⌨️ 快捷键说明

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