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; 
}