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