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