www.pudn.com > Fronter_xie3.rar > ConnectTestGBSocket.cpp


// ConnectTestGBSocket.cpp: implementation of the CConnectTestGBSocket class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Fronter.h" 
#include "ConnectTestGBSocket.h" 
#include "Connect790Socket.h" 
#include "OnlinePage.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
extern TestGBPara_Address g_TestGbSocketList[LISTENSOCKETNUM]; 
extern Para_Address g_SocketList[LISTENSOCKETNUM]; 
extern bool g_TestGBEXIT; 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CConnectTestGBSocket::CConnectTestGBSocket() 
{ 
	wRecvCycPoolSize=GB_FRM_SIZE; 
	m_Localsockfd=INVALID_SOCKET; 
	m_fExit=false; 
 
} 
 
CConnectTestGBSocket::~CConnectTestGBSocket() 
{ 
 
} 
 
 
bool CConnectTestGBSocket::Send(BYTE* pbTxBuf, WORD wLen) 
{//发送消息给cl790D,如果发送失败,关闭cl790D端套结字 
	int ret; 
	if(m_Localsockfd==INVALID_SOCKET) return false; 
	ret = send(m_Cl790DLocalsockfd, (const char *)pbTxBuf, wLen, 0); 
	if(ret==-1) 
	{ 
		g_SocketList[m_Cl790Dindex].cl790D_Valid=false; 
		closesocket(m_Cl790DLocalsockfd); 
		m_Cl790DLocalsockfd=INVALID_SOCKET; 
		g_SocketList[m_Cl790Dindex].cl790D_SOCKET=INVALID_SOCKET; 
		return false; 
	} 
	if(ret>0) 
	{ 
		CountPackages(m_Cl790Dindex,SENDTOCL790D,ret); 
	} 
	return true; 
} 
WORD CConnectTestGBSocket::Receive(BYTE* pbRxBuf, WORD wBufSize) 
{//从testgb接收消息,接收失败,关闭连接testGB端套结字 
	int ret; 
	if(m_Localsockfd==INVALID_SOCKET) return false; 
	char debugbuff[100]; 
	memset(debugbuff,0,100); 
	sprintf(debugbuff,"CConnectTestGBSocket::Receive(),socket=%d.waiting...\n\r",m_Localsockfd); 
	DebugMSg(debugbuff,LOG_INFO); 
 
	ret = recv(m_Localsockfd, (char *)pbRxBuf, wBufSize, 0); 
	if(ret==-1) 
	{ 
		if (ret == SOCKET_ERROR) 
		{ 
			int nLastErr =  WSAGetLastError (); 
			if (nLastErr == WSAETIMEDOUT) 
			{ 
				WSASetLastError(0);  
			} 
		} 
		int nLastErr =  WSAGetLastError (); 
		memset(debugbuff,0,100); 
		sprintf(debugbuff,"CConnectTestGBSocket::Receive() fail,socket=%d,nLastErr=%d\n\r",m_Localsockfd,nLastErr); 
		DebugMSg(debugbuff,LOG_ERROR); 
 
		g_TestGbSocketList[m_index].TestGB_Valid=false; 
		closesocket(m_Localsockfd); 
		m_Localsockfd=INVALID_SOCKET; 
		g_TestGbSocketList[m_index].TestGB_SOCKET=INVALID_SOCKET; 
		return -1; 
	} 
	memset(debugbuff,0,100); 
	sprintf(debugbuff,"CConnectTestGBSocket::Receive() success,socket=%d,len=%d\n\r",m_Localsockfd,ret); 
	DebugMSg(debugbuff,LOG_INFO); 
 
	return ret; 
} 
int CConnectTestGBSocket::ReceiveTask() 
{ 
	int ret=0; 
	int cl790DCli; 
	unsigned short wNum; 
	WORD wFrmLen; 
	BYTE *pFrmBuf = NULL; 
	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 ) 
			{				 
//				RxProcess(); 
				if(m_bFlush) 
				{//查找客户端的socket 
					cl790DCli=SearchCl790DSocket(); 
					if((cl790DCli >= 0) && (cl790DCli<= LISTENSOCKETNUM)) 
					{ 
						m_cl790DValid=true; 
						m_Cl790Dindex=cl790DCli; 
						m_Cl790DLocalsockfd=g_SocketList[cl790DCli].cl790D_SOCKET; 
						g_SocketList[cl790DCli].TestGB_Valid=true; 
						g_SocketList[cl790DCli].TestGB_SOCKET = m_Localsockfd; 
					} 
					else 
					{ 
						m_cl790DValid=false; 
					} 
				 
				} 
				//转发消息给终端 
				if(m_cl790DValid) 
				{ 
					Send(pFrmBuf, wFrmLen); 
				} 
				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; 
 
} 
//查找cl790D终端的套结字是否存在 
int CConnectTestGBSocket::SearchCl790DSocket() 
{ 
	int iret=-1; 
	char     cl790D_GBAddress[20]; 
	memset(cl790D_GBAddress,0,20); 
	for(int i=0;i> 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 CConnectTestGBSocket::VeryRxFrm(const BYTE *pRxBufStart,WORD wRxLen) 
{ 
	bool f=false; 
	 
	WORD DataLen; 
	WORD wRxB1B2; 
	//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 ); 
	wRxB1B2 = ByteToWord( RxMsg.pBuf + GB_LOC_ADDB1 ); 
	if(GBCommInfo.wRxB1B2 != wRxB1B2) 
	{ 
		m_bFlush=true; 
		GBCommInfo.wRxB1B2 = wRxB1B2; 
	} 
	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; 
} 
 
CConnectTestGBSocket g_pFapLocal; 
UINT TestGBLocalSocketThread(void* pvPara) 
{ 
	int index; 
	char debugbuff[100]; 
	index=*((int *)pvPara); 
	CConnectTestGBSocket *pFapLocal; 
	pFapLocal=&(g_TestGbSocketList[index].pFapLocal); 
	pFapLocal->m_fConnected = false; 
	pFapLocal->m_Localsockfd=g_TestGbSocketList[index].TestGB_SOCKET; 
	pFapLocal->m_index=index; 
 
	memset(debugbuff,0,100); 
	sprintf(debugbuff,"TestGBLocalSocketThread() 进入线程,socket=%d,index=%d\n\r",g_TestGbSocketList[index].TestGB_SOCKET,index); 
	DebugMSg(debugbuff,LOG_INFO); 
	while (1) 
	{ 
		Sleep(100); 
		//pFapLocal->Beat(); 
		if (pFapLocal->m_fExit) 
			break; 
		if(g_TestGBEXIT)break; 
		if(pFapLocal->m_Localsockfd == INVALID_SOCKET) 
		{ 
			break; 
		} 
		if (pFapLocal->ReceiveTask()!=0xFFFF) 
		{ 
			pFapLocal->m_fConnected = true; 
		} 
		else 
		{ 
			break; 
		} 
	} 
	pFapLocal->m_fExitDone = true; 
	return 1; 
}