www.pudn.com > Fronter_xie3.rar > Connect790Socket.cpp
// CConnect790Socket.cpp: implementation of the CTransferSocket class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Fronter.h"
#include "Connect790Socket.h"
#include "OnlinePage.h"
#include "struct.h"
#include "ConnectTestGBSocket.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern Para_Address g_SocketList[LISTENSOCKETNUM];
extern TestGBPara_Address g_TestGbSocketList[LISTENSOCKETNUM];
extern bool g_Cl790DEXIT;
extern bool g_bstartstat;
//全局定义
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CConnect790Socket::CConnect790Socket()
{
m_Localsockfd = INVALID_SOCKET;
wRecvCycPoolSize=GB_FRM_SIZE;
m_TestGBLocalsockfd=INVALID_SOCKET;
m_bFlush=false;
}
CConnect790Socket::~CConnect790Socket()
{
}
bool CConnect790Socket::Send(BYTE* pbTxBuf, WORD wLen)
{
int ret;
char debugbuff[100];
if(m_Localsockfd==INVALID_SOCKET) return false;
memset(debugbuff,0,100);
sprintf(debugbuff,"CConnect790Socket::send(),socket=%d.Taddress=%x%x\n\r",m_Localsockfd,GBCommInfo.wRxA1A2,GBCommInfo.wRxB1B2);
DebugMSg(debugbuff,LOG_INFO);
ret = send(m_Localsockfd, (const char *)pbTxBuf, wLen, 0);
if(ret==-1)
{
int nLastErr = WSAGetLastError ();
memset(debugbuff,0,100);
sprintf(debugbuff,"CConnect790Socket::Send() fail,socket=%d,nLastErr=%d\n\r",m_Localsockfd,nLastErr);
DebugMSg(debugbuff,LOG_ERROR);
g_SocketList[m_index].cl790D_Valid=false;
closesocket(m_Localsockfd);
m_Localsockfd=INVALID_SOCKET;
g_SocketList[m_index].cl790D_SOCKET=INVALID_SOCKET;
return false;
}
memset(debugbuff,0,100);
sprintf(debugbuff,"CConnect790Socket::Send() success,socket=%d,len=%d\n\r",m_Localsockfd,ret);
DebugMSg(debugbuff,LOG_INFO);
if(ret>0)
{
CountPackages(m_index,SENDTOCL790D,ret);
}
return true;
}
bool CConnect790Socket::Send2TestGB(BYTE* pbTxBuf, WORD wLen)
{//发送消息给testgb,发送失败,关闭testgb套结字
int ret=0;
if(m_Localsockfd==INVALID_SOCKET) return false;
if(m_TestGBLocalsockfd==INVALID_SOCKET) return false;
ret = send(m_TestGBLocalsockfd, (const char *)pbTxBuf, wLen, 0);
if(ret==-1)
{
g_SocketList[m_index].TestGB_Valid=false;
g_TestGbSocketList[m_TestGBindex].TestGB_Valid=false;
closesocket(m_TestGBLocalsockfd);
m_TestGBLocalsockfd=INVALID_SOCKET;
g_SocketList[m_index].TestGB_SOCKET=INVALID_SOCKET;
return false;
}
return true;
}
//查找TestGB的套结字是否存在
int CConnect790Socket::SearchSocket()
{
int iret=-1;
char cl790D_GBAddress[20];
memset(cl790D_GBAddress,0,20);
sprintf(cl790D_GBAddress,"%x%x",GBCommInfo.wRxA1A2,GBCommInfo.wRxB1B2);
for(int i=0;i0)
{
CountPackages(m_index,REVFROMCL790D,ret);
}
return ret;
}
int CConnect790Socket::ReceiveTask()
{
int ret=0;
int iRxprocessRet=0;
unsigned short wNum;
WORD wFrmLen;
BYTE *pFrmBuf = NULL;
char debugbuff[100];
memset(debugbuff,0,100);
sprintf(debugbuff,
"CConnect790Socket::ReceiveTask(),RecvCycPool=%X,socket=%d\n\r"
,&(RecvCycPool[0]),m_Localsockfd);
DebugMSg(debugbuff,LOG_INFO);
wNum = Receive( RecvCycPool + wRecvCycPoolHead, wRecvCycPoolSize-wRecvCycPoolHead );
if( (wNum != 0xFFFF)&&(wNum>0) )
{
wRecvCycPoolHead = ( wRecvCycPoolHead + wNum ) % wRecvCycPoolSize;
}
else
{
return wNum;
}
if( wRecvCycPoolHead > wRecvCycPoolTail )
{
while( SearchOneFrame( &pFrmBuf, &wFrmLen ) == true )
{
if( VeryRxFrm( pFrmBuf, wFrmLen ) == true )
{
iRxprocessRet=RxProcess();
if(!m_bFlush)
{//更新终端界面信息
m_bFlush=true;
SearchSocket();
sprintf(g_SocketList[m_index].cl790D_GBAddress,"%x%x",GBCommInfo.wRxA1A2,GBCommInfo.wRxB1B2);
char debugbuff[100];
memset(debugbuff,0,100);
sprintf(debugbuff,"CConnect790Socket::ReceiveTask(),hWnd=%d.\n\r",g_SocketList[m_index].hWnd);
DebugMSg(debugbuff,LOG_INFO);
// ::PostMessage(g_SocketList[m_index].hWnd, USER_PROC_UPDATA, 0, 0);
}
//根据RxProcess()函数的返回值,确定是否要转发到主站
if(iRxprocessRet!=0)
{
if(g_SocketList[m_index].TestGB_Valid==true)
{
m_TestGBLocalsockfd = g_SocketList[m_index].TestGB_SOCKET;
Send2TestGB(pFrmBuf,wFrmLen);
}
}
else
{
ret = wFrmLen;
}
}
}
}
//如果无效的代码过多或出错,清空
if( wRecvCycPoolHead - wRecvCycPoolTail + 1 >= 512 || wRecvCycPoolHead < wRecvCycPoolTail )
wRecvCycPoolHead = wRecvCycPoolTail = 0;
//如果仍有少量代码,进行拷贝,移至最前面
if( wRecvCycPoolHead != wRecvCycPoolTail )
{
wNum = wRecvCycPoolHead - wRecvCycPoolTail;
memcpy( RecvCycPool, RecvCycPool+wRecvCycPoolTail, wNum );
wRecvCycPoolHead = wNum;
wRecvCycPoolTail = 0;
}
else
wRecvCycPoolHead = wRecvCycPoolTail = 0;
return ret;
}
//找出一个帧,返回TRUE,并将帧的起始地址和帧长度传递出来
bool CConnect790Socket::SearchOneFrame(BYTE **pRxFrmStart,WORD *wRxLen)
{
WORD num,len,FrmNum;
BYTE *pCode;
while( wRecvCycPoolHead != wRecvCycPoolTail )
{
num = wRecvCycPoolHead - wRecvCycPoolTail;
if( num < 18 ) return false;
if( RecvCycPool[ wRecvCycPoolTail ]== 0x68 )
{
pCode = RecvCycPool + wRecvCycPoolTail;
if( pCode[ GB_LOC_START1 ] == 0x68 &&
pCode[ GB_LOC_START2 ] == 0x68 &&
pCode[ GB_LOC_LLEN1 ] == pCode[ GB_LOC_LLEN2 ] &&
pCode[ GB_LOC_HLEN1 ] == pCode[ GB_LOC_HLEN2 ]
)
{
len = ByteToWord( pCode + GB_LOC_LLEN1 ) >> 2;
FrmNum = len + 8;
if( num < FrmNum ) return false;
if( pCode[ FrmNum - 1 ] == 0x16 )
{
*pRxFrmStart = pCode;
*wRxLen = FrmNum;
wRecvCycPoolTail += FrmNum;
return TRUE;
}
}
}
wRecvCycPoolTail++;
}
return false;
}
bool CConnect790Socket::VeryRxFrm(const BYTE *pRxBufStart,WORD wRxLen)
{
bool f=false;
WORD DataLen;
//copy frame
memcpy( RxMsg.pBuf, pRxBufStart, wRxLen );
RxMsg.wBufLen = wRxLen;
DataLen = ByteToWord( RxMsg.pBuf + GB_LOC_LLEN1 ) >> 2;
GBCommInfo.wRxDataLen = DataLen + 8;
GBCommInfo.bRxCTL = RxMsg.pBuf[ GB_LOC_CONTROL ];
GBCommInfo.bRxFUN = GBCommInfo.bRxCTL & GB_CONTROL_FUN;
GBCommInfo.wRxA1A2 = ByteToWord( RxMsg.pBuf + GB_LOC_ADDA1 );
GBCommInfo.wRxB1B2 = ByteToWord( RxMsg.pBuf + GB_LOC_ADDB1 );
GBCommInfo.bRxMasterAddreess = RxMsg.pBuf[ GB_LOC_ADDB3 ] >> 1;
GBCommInfo.bRxAFN = RxMsg.pBuf[ GB_LOC_AFN ];
GBCommInfo.bRxSequence = RxMsg.pBuf[ GB_LOC_SEQUENCE ];
GBCommInfo.bRxTVP = GBCommInfo.bRxSequence & GB_SEQUENCE_TVP;
return true;
}
int CConnect790Socket::RxProcess()
{
int iret=0;
if( GBCommInfo.bRxCTL & GB_CONTROL_FCV )
{
GBCommInfo.bRxFCB = GBCommInfo.bRxCTL & GB_CONTROL_FCB;
if( GBCommInfo.bRxFCB != GBCommInfo.bHisFCB )
GBCommInfo.bHisFCB = GBCommInfo.bRxFCB;
}
switch( GBCommInfo.bRxAFN )
{
case GB_AFUN_CHECKLINK:// 2
AnsCmd_CONFIRM();
break;
default :
{
iret = -1;
}
}
return iret;
}
int CConnect790Socket::AnsCmd_CONFIRM()
{
BYTE bReturn;
//get bReturn
bReturn = 1;
//make frame
GBMsg *pTxMsg = &TxMsg;
memset(TxMsg.pBuf,0,GB_FRM_SIZE);
pTxMsg->wBufPointer = GB_LOC_SEQUENCE;
BYTE *pTxBuf = pTxMsg->pBuf + pTxMsg->wBufPointer;
*pTxBuf++ = GB_SEQUENCE_FIR|GB_SEQUENCE_FIN|GBCommInfo.bHisSEQ;
*pTxBuf++ = 0;
*pTxBuf++ = 0;
*pTxBuf++ = bReturn;//FN
*pTxBuf++ = 0;
pTxMsg->wBufPointer = pTxBuf - TxMsg.pBuf;
return MakeTxFrm( false, GB_LFUN_CONFIRM, GB_AFUN_CONFIRM, pTxMsg );
}
//bCmd = LFUN
int CConnect790Socket::MakeTxFrm(bool fPRM,BYTE bCmd,BYTE bAFN,GBMsg *pTxMsg)
{
BYTE bCTL = bCmd;
WORD wDLen,wDLen1;
BYTE *pTxBuf = pTxMsg->pBuf + pTxMsg->wBufPointer;
BYTE *pTail;
bCTL |= GB_CONTROL_DIR;
//if need time tag
if( bAFN != GB_AFUN_CHECKLINK && GBCommInfo.bRxTVP )
{
pTxMsg->pBuf[GB_LOC_SEQUENCE] |= GB_SEQUENCE_TVP;
pTail = RxMsg.pBuf + RxMsg.wBufLen - 8;
if( pTxMsg->pBuf[GB_LOC_SEQUENCE] & GB_SEQUENCE_TVP )
{
memcpy(pTxBuf,pTail,6);
pTxBuf = pTxBuf+6;
}
}
pTxMsg->wBufPointer = pTxBuf - pTxMsg->pBuf;
wDLen = pTxMsg->wBufPointer - 6;
wDLen1 = ( wDLen << 2 ) | 0x01;
pTxMsg->pBuf[ GB_LOC_START1 ] = pTxMsg->pBuf[ GB_LOC_START2 ] = 0X68;
pTxMsg->pBuf[ GB_LOC_LLEN1 ] = pTxMsg->pBuf[ GB_LOC_LLEN2 ] = wDLen1 & 0xff;
pTxMsg->pBuf[ GB_LOC_HLEN1 ] = pTxMsg->pBuf[ GB_LOC_HLEN2 ] = wDLen1 >> 8;
pTxMsg->pBuf[ GB_LOC_CONTROL ] = 0;
pTxMsg->pBuf[ GB_LOC_ADDA1 ] = GBCommInfo.wRxA1A2& 0xff;
pTxMsg->pBuf[ GB_LOC_ADDA2 ] = GBCommInfo.wRxA1A2 >> 8;
pTxMsg->pBuf[ GB_LOC_ADDB1 ] = GBCommInfo.wRxB1B2& 0xff;
pTxMsg->pBuf[ GB_LOC_ADDB2 ] = GBCommInfo.wRxB1B2 >> 8;
if( fPRM == true )
pTxMsg->pBuf[ GB_LOC_ADDB3 ] = 0;
else
pTxMsg->pBuf[ GB_LOC_ADDB3 ] = GBCommInfo.bRxMasterAddreess<<1;
pTxMsg->pBuf[ GB_LOC_AFN ] = bAFN;
pTxMsg->pBuf[ pTxMsg->wBufPointer++ ] = CheckSum(pTxMsg->pBuf+GB_LOC_CONTROL,wDLen);
pTxMsg->pBuf[ pTxMsg->wBufPointer++ ] = 0x16;
pTxMsg->wBufLen = pTxMsg->wBufPointer;
// if( pTxMsg->pBuf[ GB_LOC_SEQUENCE ] & GB_SEQUENCE_CON ||
// bAFN == GB_AFUN_CHECKLINK )
// GBCommInfo.dwPrmSend_Click = GetClick();
if( pTxMsg == &TxMsg )
{
//return Send( pTxMsg->pBuf, pTxMsg->wBufLen );
Sleep(100) ;
if( Send( pTxMsg->pBuf, pTxMsg->wBufLen ) == false )
return -1;
}
return 0;
}
//本地维护口的监视线程,用电管理终端协议
UINT CL790DGBLocalSocketThread(void* pvPara)
{
int index;
char debugbuff[100];
index=*((int *)pvPara);
CConnect790Socket *pFapLocal;
pFapLocal=&(g_SocketList[index].pFapLocal);
pFapLocal->m_fConnected = false;
pFapLocal->m_Localsockfd=g_SocketList[index].cl790D_SOCKET;
pFapLocal->m_index=index;
memset(debugbuff,0,100);
sprintf(debugbuff,"CL790DGBLocalSocketThread() 进入线程,socket=%d,index=%d\n\r",g_SocketList[index].cl790D_SOCKET,index);
DebugMSg(debugbuff,LOG_INFO);
while (1)
{
Sleep(100);
//pFapLocal->Beat();
if (pFapLocal->m_fExit)
break;
if(g_Cl790DEXIT)break;
if(pFapLocal->m_Localsockfd == INVALID_SOCKET)
{
break;
}
if (pFapLocal->ReceiveTask()!=0xFFFF)
{
pFapLocal->m_fConnected = true;
}
else
{
break;
}
}
pFapLocal->m_fExitDone = true;
return 1;
}