BinaryApplication

来源:互联网 发布:淘宝客服如何打开分流 编辑:程序博客网 时间:2024/05/18 08:22
#pragma once




#include "CMyCriticalSection.h"
#include "CCriticalSectionGuard.h"




#include "FileLog.h"


#include "./CustBinaryBizClass.h"
#include "./NetCommuication/CommuApplication.h"
#include "./NetCommuication/NetCommunication.h"
#include "SzBinaryAnalyzer.h"
#include "ChangeBinaryAndJson.h"
#include "LogBlock.h"


#include "AsyncLogger.h"


class CBinaryApplication:
public CCommuApplication
{
public:
// add by liusg 2016-11-28 增加二进制显示格式文本串的输出
typedef struct tagBinaryConig
{
std::string strBinaryProtocalsFileName;  // 协议定义文件名
std::string strProtocalFieldsFileName;   // 协议字段定义文件名
std::string strDefaultApplVerID;         // 协议版本
bool        bEnableClearText;            // 是否输出明文格式文件
}BINARY_CONFIG, *LPBINARY_CONFIG;


CBinaryApplication(void);
//提供App模块参数的配置接口
//a) App模块连接TGW的信息(IP\PORT\TGWID)
CBinaryApplication( const std::string & strIP, unsigned short uiPort, const std::string & strPlatFlag, 
const std::string& sPassword, const std::string& sSenderCompID, 
const std::string&  strStoragePath );


~CBinaryApplication(void);




public:
//     a) 打开接口(启动接口) 所谓启动成功,包括两部分 一、连接;二、登录成功
bool StartBinaryApp();


//     c) 关闭接口(停止接口) 考虑被动被关闭
bool StopBinaryApp();


//     d) 引擎是否正常工作
bool IsWorking();


//     d) 发送数据(主动)
bool SendData(BINARY::CMessageBase& p_pclMsg);




// 
// 获取平台状态
inline std::string& GetPlatFlag()

return m_strPlatFlag; 
}


inline int GetPlatformStatus()

return m_iPlatformStatus; 
}


void SetPlatformStatus(int& iPlatformStatus) 

m_iPlatformStatus = iPlatformStatus; 
} // add by liusg 2016-04-10 for (stsv5) 增加强制开市控制


inline void SetReportIndex( int iReportIndex  ) 

m_iReportIndex = ( iReportIndex < 1 ? 0 : iReportIndex ); 
}


inline __int64 GetReportIndex( ) 
{  
return m_iReportIndex; 
}




inline void SetCommTimeOut(unsigned int iCommTimeOut) 

m_iCommuTimeout = iCommTimeOut > 10 ? iCommTimeOut : 10; 
m_iHeartBeatInter = max( 5, m_iCommuTimeout / 2 ); 
}




bool SendSynchMessage(int p_iReportIndex ); // add by liusg 2015-10-03 for 支持回报重扫




private:


bool ResolveInterfaceParam( char* pszContent, std::string& strTargetIP, int& iTargetPort, 
std::string& strTargetCompID );


void FromNet(TCPCONNECT::CONNECT_INFO& refConnectInfo, char* pszBussBufOut, int iBufLenOut);


void NetEvent(TCPCONNECT::CONNECT_INFO& refConnectInfo, int enEventType);


void DoLogout(TCPCONNECT::CONNECT_INFO& refConnectInfo); // add by liusg 2016-11-18 修正接收到交易所logout消息接口未被关闭的问题 接收到登出消息需要断开网络
void DoConnectSuccess(TCPCONNECT::CONNECT_INFO& refConnectInfo);
void DoConnectBreak(TCPCONNECT::CONNECT_INFO& refConnectInfo);


void RecvBussniessMessage(unsigned int iMsgType, const char* pszBussBufOut, const int iBufLenOut);


inline bool CheckSecuCode( const char p_chMktID, const char * p_szSecuCode );






char* GenerateLogon(BINARY::CLogon& logon, int& iMessageLen);
char* GenerateLogout(int p_iLogutReason, char* p_szText, BINARY::CLogout& logout, int& iMessageLen);
char* GenerateReportSynchronization(__int64 iReportIndex, 
BINARY::CReportSynchronization& reportSyn, int& iMessageLen);


void GetBinaryConfig(std::string strConfigFile, BINARY_CONFIG& stBinaryCfg); // add by liusg 2016-11-28 增加二进制显示格式文本串的输出


public:








private:


std::string m_strPlatIP;       // 平台IP
unsigned short m_uiPlatPort;   // 平台端口
std::string m_strPlatFlag;     // 平台会话标识
std::string m_strSenderCompID; // 用户会话标识
std::string m_strUserPwd;      // 用户会话密码


bool m_bIsWorking;             // 引擎工作正常状态
bool m_bQuitWaitLogin;         // 登录等待状态 开始登录时为true, 网络断开为false,主动关闭接口为false


 
int         m_iCommuTimeout;                   // 通讯超时
TCPCONNECT::COMMUNICATION_MODE m_enCommMode;   // 通讯模型
TCPCONNECT::BLOCKING_MODE      m_enBlockMode;  // 阻塞模型
CNetCommunication m_clNetComm;  // 通讯模型
CSzBinaryAnalyzer m_clAnalyzer; // 协议解析器


TCPCONNECT::CONNECT_INFO m_stConnectInfo; // 连接信息(客户端模型下才使用到)


int m_iHeartBeatInter;          // 心跳时间间隔
// 
std::string m_strStoragePath;  // 存储目录


 
bool m_bLogined;        // 是否已经登录
//   bool m_bDebug;   // 日志开关
CFileLog    m_clNetFileLog;          // 网络日志
std::string m_strNetLogFileName;     // 网络日志文件名
std::string m_strSessionFileName;    // 会话日志文件名
CFileLog    m_clSessionFileLog;      // 会话日志
//   bool m_bMessages;   // 业务消息开关
std::string m_strBusinessFileName;   // 业务落地文件名
// CFileLog    m_clBusinessFileLog;     // 业务日志
// add by liusg 2016-11-28 增加二进制显示格式文本串的输出
std::string m_strBussClearTextFileName; // 业务明文落地文件名
CFileLog    m_clBusinessClearTextLog;   // 业务明文日志 
CChangeBinaryAndJson* m_clBinaryToJson; // 二进制与JSON格式互转类
BINARY_CONFIG         m_stBinaryConfig; // 二进制配置项
// add end


int  m_iPlatformStatus;  // 平台状态
__int64 m_iReportIndex;  
 
 


unsigned int m_iHeartBeatThreadID;
HANDLE m_hHeartBeatThread;
HANDLE m_hQuitHeartBeatEvent;


__int64 m_i64SendDataTime;
void SetSendDataTime(__int64 i64SendDataTime)

mylib::CCriticalSectionGuard lockGuard(m_clCSHeartBeat); 
m_i64SendDataTime = i64SendDataTime; 
}


__int64 GetSendDataTime()

mylib::CCriticalSectionGuard lockGuard(m_clCSHeartBeat); 
return m_i64SendDataTime; 
}


__int64 m_i64RecvDataTime;
void SetRecvDataTime(__int64 i64RecvDataTime) 

mylib::CCriticalSectionGuard lockGuard(m_clCSHeartBeat); 
m_i64RecvDataTime = i64RecvDataTime; 
}


__int64 GetRecvDataTime()

mylib::CCriticalSectionGuard lockGuard(m_clCSHeartBeat); 
return m_i64RecvDataTime; 
}


mylib::CMyCriticalSection m_clCSHeartBeat; 


bool StartHeartBeat();
bool StopHeartBeat();
static unsigned int _stdcall HeartBeatThread(void* p);


AsyncLogger * m_pAsyncLogger;


};


#include "stdafx.h"
#include "BinaryApplication.h"
#include <process.h>
#include <deque>






CBinaryApplication::CBinaryApplication(void)
{
}


//提供App模块参数的配置接口
//a) App模块连接TGW的信息(IP\PORT\TGWID)
CBinaryApplication::CBinaryApplication( const std::string & strIP, unsigned short uiPort, 
const std::string & strPlatFlag, const  std::string & sPassword, const std::string& sSenderCompID,   
const std::string & strStoragePath ) : m_iPlatformStatus(0),m_bLogined(false),m_bIsWorking(false)
,m_iCommuTimeout(20),m_strUserPwd( sPassword ) ,m_clBinaryToJson(NULL),m_pAsyncLogger(NULL)
{
m_strPlatIP = strIP;
m_uiPlatPort = uiPort;
m_strPlatFlag = strPlatFlag;


m_strStoragePath = strStoragePath;


SYSTEMTIME tmNow;
GetSystemTime(&tmNow);
char szDate[21] = { 0 };
char szPort[ 10 ] = { 0 };
_snprintf(szDate, sizeof(szDate), "%04d%02d%02d", tmNow.wYear, tmNow.wMonth, tmNow.wDay);
sprintf( szPort, "%d", uiPort );
//m_strSenderCompID = m_strPlatIP + "_" + std::string( szPort );
m_strSenderCompID = sSenderCompID;
m_strNetLogFileName = m_strSenderCompID + "_" + std::string( szPort ) 
+ "_Event_" + std::string(szDate) + ".log";
m_strSessionFileName = m_strSenderCompID + "_" + std::string( szPort ) 
+ "_Session_" + std::string(szDate) + ".log";
m_strBusinessFileName = m_strSenderCompID + "_" + std::string( szPort ) 
+ "_Business_" + std::string(szDate) + ".log";
m_strBussClearTextFileName = m_strSenderCompID + "_" + std::string( szPort ) 
+ "_Business_ClearText" + std::string(szDate) + ".log";// add by liusg 2016-11-28 增加二进制显示格式文本串的输出
m_strStoragePath = ".\\log\\" + std::string(szDate);
m_clNetFileLog.Init(m_strStoragePath, m_strNetLogFileName);
//m_clBusinessFileLog.Init(m_strStoragePath, m_strBusinessFileName);


// add by liusg 2016-11-28 增加二进制显示格式文本串的输出m_clBusinessClearTextLog
//modified begin by liusg 2016-11-28 增加是否启用二进制明文显示
m_clBusinessClearTextLog.Init(m_strStoragePath, m_strBussClearTextFileName);
GetBinaryConfig("binary\\cfg\\Binary.ini", m_stBinaryConfig);


if (m_stBinaryConfig.bEnableClearText)
{
//m_clBinaryToJson = CChangeBinaryAndJson::GetInstance(m_stBinaryConfig.strBinaryProtocalsFileName, m_stBinaryConfig.strProtocalFieldsFileName);


m_clBinaryToJson = new CChangeBinaryAndJson( m_stBinaryConfig.strBinaryProtocalsFileName, 
m_stBinaryConfig.strProtocalFieldsFileName );
}
// add end


m_enCommMode = TCPCONNECT::COMMUNICATION_MODE::MODE_CLIENT;
m_enBlockMode = TCPCONNECT::BLOCKING_MODE::MODE_BLOCKING;
m_clNetComm.SetNetCommParam(m_enCommMode, m_enBlockMode, m_strPlatIP, 
m_uiPlatPort, m_iCommuTimeout );
m_iHeartBeatInter = max( 5, m_iCommuTimeout / 2 );
m_clNetComm.RigisterApp( this );
m_clNetComm.RigisterPacker( &m_clAnalyzer );


m_iHeartBeatThreadID = 0;
m_hHeartBeatThread = INVALID_HANDLE_VALUE;
m_hQuitHeartBeatEvent = INVALID_HANDLE_VALUE;


m_pAsyncLogger = new AsyncLogger(  &m_clBusinessClearTextLog, m_clBinaryToJson );
}


CBinaryApplication::~CBinaryApplication(void)
{
StopBinaryApp();


if ( m_clBinaryToJson != NULL )
{
delete m_clBinaryToJson;
m_clBinaryToJson = NULL;
}


if ( m_pAsyncLogger != NULL )
{
delete m_pAsyncLogger;
m_pAsyncLogger = NULL;
}


}




bool CBinaryApplication::StartBinaryApp()
{
bool bReturn = false;


if ( IsWorking() )
{
bReturn = true;
}
else
{
if ( m_clNetComm.Start() )
{
int iStartTickt = GetTickCount();
for(;;)
{
Sleep(200);
if (m_bLogined == true)
{
if(StartHeartBeat() == true)
{
m_bIsWorking = true;
bReturn = true;
break;
}
else
{
StopBinaryApp();
printf( "启动心跳处理失败[%s:%d]",  const_cast< char* >(m_strPlatIP.c_str() ), m_uiPlatPort );
break;
}
}
if ((GetTickCount() - iStartTickt) > m_iCommuTimeout*1000
|| m_bQuitWaitLogin == false)
{
StopBinaryApp();
break;
}
}
}
}


return bReturn;
}


//     c) 关闭接口(停止接口) 考虑被动被关闭
bool CBinaryApplication::StopBinaryApp()
{
bool bReturn = false;


if ( !IsWorking() )
{
bReturn = true;
}
else
{
char szSocket[20] = {0};
char szHint[256] = {0};
sprintf_s(szSocket, sizeof(szSocket), "%d", m_stConnectInfo.iSocketHandle);


// 构建Logout消息
int iMessageLen = 0;
BINARY::CLogout logout;
unsigned int iMsgType = logout.GetHEADMsgType();
char* pszMessage = GenerateLogout(101, "正常退登", logout, iMessageLen);
// 发送Logout消息
m_clNetFileLog.WriteLog("Initiated logout request: " + std::string(szSocket));
// modified by liusg 2016-11-28 增加二进制显示格式文本串的输出
if(!this->SendData(logout))
//if(m_clNetComm.SendData(m_stConnectInfo, pszMessage, iMessageLen))
{
//       char szTile[50] = { 0 };
//       sprintf_s(szTile, "SEND MsgType( %d )", iMsgType);
//       m_clBusinessFileLog.WriteLog(szTile, pszMessage, iMessageLen);
//     }
//     else
//     {
m_clNetFileLog.WriteLog("Send logout failed: " + std::string(szSocket));
//         m_clNetFileLog.WriteLog("socket handle:" + std::string(szSocket) + " calling send() occurs error! logout is not sended");
//         m_clNetFileLog.WriteLog("Socket Error: " + m_strLastError);
}
// modified end


//     m_clNetFileLog.WriteLog("Disconnecting, socket handle: " + std::string(szSocket));
//     m_pclTcpClient->CloseConnect();
}
m_clNetComm.Stop(); // modified by liusg 2016-11-16 修改由于关闭某个连接时,错误的删除了服务对象从而导致内存异常的问题。
memset(&m_stConnectInfo, 0x00, sizeof(m_stConnectInfo));
m_bLogined = false;
m_bIsWorking = false;
bReturn = true;
return bReturn;
}


bool CBinaryApplication::IsWorking() 
{
return m_bIsWorking; 
}


//     d) 发送数据(主动)
bool CBinaryApplication::SendData(BINARY::CMessageBase& p_pclMsg)
{
bool bReturn = false;
char szTile[50] = { 0 };
int iMessageLen = 0;


char * pszMessage = p_pclMsg.Serialize(iMessageLen);
sprintf_s(szTile, "SEND MsgType( %d )", p_pclMsg.GetHEADMsgType());
bReturn = m_clNetComm.SendData(m_stConnectInfo, pszMessage, iMessageLen);
if (bReturn == true)
{
//m_clBusinessFileLog.WriteLog(szTile, pszMessage, iMessageLen);
if (m_clBinaryToJson != NULL)
{
m_pAsyncLogger->AddMsgQueue( szTile, pszMessage, iMessageLen  );
}
}
// add end
SetSendDataTime(GetTickCount());
return bReturn;
}


// 构建Logon消息
char* CBinaryApplication::GenerateLogon(BINARY::CLogon& logon, int& iMessageLen)
{
logon.SetLOGINDefaultApplVerID(m_stBinaryConfig.strDefaultApplVerID.c_str());
logon.SetLOGINHeartBtInt(m_iHeartBeatInter);
logon.SetLOGINPassword(m_strUserPwd.c_str());
logon.SetLOGINSenderCompID(m_strSenderCompID.c_str());
logon.SetLOGINTargetCompID(m_strPlatFlag.c_str());


return logon.Serialize(iMessageLen);  
}


// 构建Logout消息
char* CBinaryApplication::GenerateLogout(int p_iLogutReason, char* p_szText, 
BINARY::CLogout& logout, int& iMessageLen)
{
logout.SetLOGOUTSessionStatus(p_iLogutReason);
logout.SetLOGOUTText(p_szText);


return logout.Serialize(iMessageLen);
}


// 构建回扫同步消息
char* CBinaryApplication::GenerateReportSynchronization(__int64 iReportIndex, 
BINARY::CReportSynchronization& reportSyn, int& iMessageLen)
{
reportSyn.SetREPORT_SYNCHRONIZATIONReportIndex(iReportIndex);
return reportSyn.Serialize(iMessageLen);
}


bool CBinaryApplication::ResolveInterfaceParam( char* pszContent, 
std::string& strTargetIP, int& iTargetPort, 
std::string& strTargetCompID/*, std::string& strUserId, std::string& strPassword */)
{
bool bReturn = true;


std::string strContent( pszContent );
int iFindIndex = 0;
int iFindCount = 0;
while ( iFindIndex >= 0)
{
iFindIndex = strContent.find( ':', iFindIndex + 1 );
if ( 0 <= iFindIndex )
iFindCount++;
}
if ( 2 != iFindCount/* && 4 != iFindCount*/)
{
bReturn = false;
}


int iColonPosStart;
int iColonPosEnd;
if ( 2 == iFindCount )
{
iColonPosStart = strContent.find( ':' );
strTargetIP = strContent.substr( 0, iColonPosStart );


iColonPosEnd = strContent.find( ':', iColonPosStart + 1 );
iTargetPort = atoi( ( strContent.substr( iColonPosStart + 1, iColonPosEnd - iColonPosStart - 1 ) ).c_str() );


iColonPosStart = iColonPosEnd;
strTargetCompID = strContent.substr( iColonPosStart + 1 , strContent.length() );
}


return bReturn;
}




void CBinaryApplication::FromNet(TCPCONNECT::CONNECT_INFO& refConnectInfo, 
char* pszBussBufOut, int iBufLenOut)
{
try
{
SetRecvDataTime(GetTickCount());
int iMsgType = ntohl(((BINARY::HEAD*)pszBussBufOut)->MsgType);
char szTile[50] = { 0 };
sprintf_s(szTile, "RECV MsgType( %d )", iMsgType);
// add by liusg 2016-11-28 增加二进制显示格式文本串的输出
if (m_clBinaryToJson != NULL)
{
m_pAsyncLogger->AddMsgQueue( szTile, pszBussBufOut, iBufLenOut  );
}
// add end
switch(iMsgType)
{
case BINARY::MsgType_Logon1:
{
//m_clBusinessFileLog.WriteLog(szTile, pszBussBufOut, iBufLenOut);
m_clNetFileLog.WriteLog("Received logon response" );
m_bLogined = true;


printf( "交易平台[%s:%d]产生网络恢复事件 "
, const_cast< char* >( m_strPlatIP.c_str() ), m_uiPlatPort);
}
break;
case BINARY::MsgType_Logout2:
{
BINARY::CLogout logout;
logout.Deserialize(pszBussBufOut, iBufLenOut);
//m_clBusinessFileLog.WriteLog(szTile, pszBussBufOut, iBufLenOut);
char szReason[400] = {0};
int iText = 0;
sprintf_s(szReason, 300, "Received logout response reason is %d [%s]", logout.GetLOGOUTSessionStatus(), TrimRight(logout.GetLOGOUTText(iText)));
m_clNetFileLog.WriteLog(szReason);
m_bLogined = false;


DoLogout(refConnectInfo); // add by liusg 2016-11-18 修正接收到交易所logout消息接口未被关闭的问题 接收到登出消息需要断开网络
}
break;
case BINARY::MsgType_HeartBeat3:  // 该三类消息不存入内部队列
{
//m_clBusinessFileLog.WriteLog(szTile, pszBussBufOut, iBufLenOut);
}
break;
case BINARY::MsgType_PlatformStateInfo6:
{
BINARY::CPlatformStateInfo6 platformStateInfo;
platformStateInfo.Deserialize(pszBussBufOut, iBufLenOut);
//m_clBusinessFileLog.WriteLog(szTile, pszBussBufOut, iBufLenOut);
m_iPlatformStatus = platformStateInfo.GetPLATFORM_STATE_INFOPlatformState();
if (3 == m_iPlatformStatus
|| 4 == m_iPlatformStatus)
{
printf( "交易平台[%s:%d]产生平台重新开放事件 " , const_cast< char* >( m_strPlatIP.c_str() ), m_uiPlatPort);
}
}
break;
default: // 其他消息都需要存入内部队列
{
//m_clBusinessFileLog.WriteLog(szTile, pszBussBufOut, iBufLenOut);
//RecvBussniessMessage(iMsgType, pszBussBufOut, iBufLenOut);        
}
break;
}


delete[] pszBussBufOut;
pszBussBufOut = NULL;
}
catch (...)
{
m_clNetFileLog.WriteLog("call ProcessMessage failed! unexecption ");
}


}


void CBinaryApplication::NetEvent(TCPCONNECT::CONNECT_INFO& refConnectInfo, int enEventType)
{
char szHint[128] = {0};
if (enEventType == TCPCONNECT::EVENT_TYPE::CONNECTINT__EVENT)
{
sprintf_s(szHint, "Connecting to %s on port %d, socket handle is %d", refConnectInfo.szConnectIP, refConnectInfo.siConnectPort, refConnectInfo.iSocketHandle);
}
else if (enEventType == TCPCONNECT::EVENT_TYPE::CONNECT_SUCCESS_EVENT)
{
// 发起登录消息,同时发送回报同步消息
DoConnectSuccess(refConnectInfo);
m_bQuitWaitLogin = true;
}
else if (enEventType == TCPCONNECT::EVENT_TYPE::CONNECT_FAILD_EVENT)
{
sprintf_s(szHint, "Can not connect to %s on port %d, socket handle is %d", refConnectInfo.szConnectIP, refConnectInfo.siConnectPort, refConnectInfo.iSocketHandle);
}
else if (enEventType == TCPCONNECT::EVENT_TYPE::CONNECT_BREAKED_EVENT)
{
DoConnectBreak(refConnectInfo);
m_bQuitWaitLogin = false;
}
else if (enEventType == TCPCONNECT::EVENT_TYPE::HAS_DIRTY_DATA_BREAK)
{
sprintf_s(szHint, "the connection has dirty data, socket handle is %d", refConnectInfo.szConnectIP, refConnectInfo.siConnectPort, refConnectInfo.iSocketHandle);
}
m_clNetFileLog.WriteLog(std::string(szHint));
}


void CBinaryApplication::DoConnectBreak(TCPCONNECT::CONNECT_INFO& refConnectInfo)
{  
char szHint[2048] = {0};


char buffer[2048] = {0};
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buffer, 2048, NULL );


sprintf_s(szHint, "Connected to %s on port %d is breadked, socket handle is %d【%s】", refConnectInfo.szConnectIP, refConnectInfo.siConnectPort, refConnectInfo.iSocketHandle, buffer);
m_clNetFileLog.WriteLog(std::string(szHint));


m_iPlatformStatus = 4; 
// 
//   m_lpstExchangeItf[0]->astItfSet[ EXCHANGE_ITF::enDeclareItf ].bDeclStatus = false;
//   if (m_lpstExchangeItf[1] != NULL)
//   {
//     m_lpstExchangeItf[1]->astItfSet[ EXCHANGE_ITF::enDeclareItf ].bDeclStatus = false;
//   }
//   m_lpstExchangeItf[0]->astItfSet[ EXCHANGE_ITF::enDeclareItf ].iPlatformStatus = m_iPlatformStatus; // add by wanyx 2016-06-20 当TGW关闭时平台状态显示不正确
//   if (m_lpstExchangeItf[1] != NULL)
//   {
//     m_lpstExchangeItf[1]->astItfSet[ EXCHANGE_ITF::enDeclareItf ].iPlatformStatus = m_iPlatformStatus; // add by wanyx 2016-06-20 当TGW关闭时平台状态显示不正确
//   }
StopHeartBeat();
memset(&m_stConnectInfo, 0x00, sizeof(m_stConnectInfo));
m_bLogined = false;
m_bIsWorking = false;
}


void CBinaryApplication::RecvBussniessMessage( unsigned int iMsgType, const char* pszBussBufOut,
const int iBufLenOut )
{
std::string strSecurity;
__int64 i64ReportIndex = 0;


// 取证券代码
BINARY::CMessageBase* pclBase = NULL;
int iLen = 0;
bool bDeSucc = false;
switch ( iMsgType )
{
case BINARY::MsgType_BusinessReject4   : //业务拒绝
{
pclBase = new BINARY::CBusinessReject4();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CBusinessReject4* pclBody = (BINARY::CBusinessReject4*)pclBase;
strSecurity = std::string(pclBody->GetBUSINESS_REJECTSecurityID(iLen));
i64ReportIndex = pclBody->GetReportIndex();
}
break;
case BINARY::MsgType_CancelReject290008   : //撤单响应失败
{
pclBase = new BINARY::CCancelReject290008();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CCancelReject290008* pclBody = (BINARY::CCancelReject290008*)pclBase;
strSecurity = std::string(pclBody->GetCANCEL_REJECTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport200102: //现货(股票,基金,债券等)集中竞价交易执行报告
{
pclBase = new BINARY::CExecutionReport200102();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
// 
//       int iBufLen = 0;
//       char* szBufferOut = pclBase->Serialize(iBufLen);
//       std::string strBinaryProtocalsFileName = ".\\binary\\spec\\protocol.json";
//       std::string strProtocalFieldsFileName = ".\\binary\\spec\\protocol_feilds.json";
//       CChangeBinaryAndJson* pclChange = CChangeBinaryAndJson::GetInstance(strBinaryProtocalsFileName, strProtocalFieldsFileName);
//       pclChange->BinaryToJson(pszBussBufOut, iBufLenOut, strBinaryProtocalsFileName, strProtocalFieldsFileName);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport200102*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport200202: //质押式回购交易执行报告
{
pclBase = new BINARY::CExecutionReport200202();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport200202*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport200302: //债券分销执行报告
{
pclBase = new BINARY::CExecutionReport200302();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport200302*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport200402: //期权集中竞价交易执行报告
{
pclBase = new BINARY::CExecutionReport200402();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport200402*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport200502: //协议交易定价执行报告\协议交易点击成交执行报告
{
pclBase = new BINARY::CExecutionReport200502();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport200502*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport200602: //以收盘价交易的盘后定价交易执行报告\以成交量加权平均价交易的盘后定价交易执行报告
{
pclBase = new BINARY::CExecutionReport200602();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport200602*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport200702: //转融通证券出借非约定执行报告
{
pclBase = new BINARY::CExecutionReport200702();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport200702*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport201202: //股票/债券/货币ETF实时申购赎回执行报告\  黄金ETF现金申购赎回执行报告
{
pclBase = new BINARY::CExecutionReport201202();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport201202*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport201302: //网上发行认购执行报告
{
pclBase = new BINARY::CExecutionReport201302();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport201302*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport201402: //配股认购执行报告
{
pclBase = new BINARY::CExecutionReport201402();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport201402*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport201502: //债券转股执行报告\债券回售执行报告
{
pclBase = new BINARY::CExecutionReport201502();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport201502*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport201602: //期权行权执行报告
{
pclBase = new BINARY::CExecutionReport201602();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport201602*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport201702: //开放式基金申购赎回执行报告
{
pclBase = new BINARY::CExecutionReport201702();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport201702*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport201802: //要约收购预受要约执行报告\要约收购解除预受要约执行报告
{
pclBase = new BINARY::CExecutionReport201802();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport201802*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport201902: //质押式回购质押执行报告\质押式回购解押执行报告
{
pclBase = new BINARY::CExecutionReport201902();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport201902*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport202202: //黄金ETF实物申购赎回执行报告
{
pclBase = new BINARY::CExecutionReport202202();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport202202*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport202302: //权证行权执行报告
{
pclBase = new BINARY::CExecutionReport202302();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport202302*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport202602: //备兑锁定执行报告\备兑解锁执行报告
{
pclBase = new BINARY::CExecutionReport202602();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport202602*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport202702: //转处置扣券执行报告\转处置还券执行报告
{
pclBase = new BINARY::CExecutionReport202702();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport202702*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport202802: //垫券执行报告\还券执行报告
{
pclBase = new BINARY::CExecutionReport202802();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport202802*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport202902: //待清偿扣划客户申报执行报告\待清偿扣划自营申报执行报告
{
pclBase = new BINARY::CExecutionReport202902();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport202902*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport203102: //分级基金实时分拆申报\分级基金实时合并申报
{
pclBase = new BINARY::CExecutionReport203102();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport203102*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_ExecutionReport206302: //港股通订单执行报告
{
pclBase = new BINARY::CExecutionReport206302();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CExecutionReport* pclBody = (BINARY::CExecutionReport206302*)pclBase;
strSecurity = std::string(pclBody->GetEXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_MatchedExecutionReport200115: //现货(股票,基金,债券等)集中竞价交易执行报告
{
pclBase = new BINARY::CMatchedExecutionReport200115();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CMatchedExecutionReport* pclBody = (BINARY::CMatchedExecutionReport200115*)pclBase;
strSecurity = std::string(pclBody->GetMATCHED_EXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_MatchedExecutionReport200215: //质押式回购交易执行报告
{
pclBase = new BINARY::CMatchedExecutionReport200215();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CMatchedExecutionReport* pclBody = (BINARY::CMatchedExecutionReport200215*)pclBase;
strSecurity = std::string(pclBody->GetMATCHED_EXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_MatchedExecutionReport200315: //债券分销执行报告
{
pclBase = new BINARY::CMatchedExecutionReport200315();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CMatchedExecutionReport* pclBody = (BINARY::CMatchedExecutionReport200315*)pclBase;
strSecurity = std::string(pclBody->GetMATCHED_EXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_MatchedExecutionReport200415: //期权集中竞价交易执行报告
{
pclBase = new BINARY::CMatchedExecutionReport200415();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CMatchedExecutionReport* pclBody = (BINARY::CMatchedExecutionReport200415*)pclBase;
strSecurity = std::string(pclBody->GetMATCHED_EXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_MatchedExecutionReport200515: //协议交易定价执行报告\协议交易点击成交执行报告
{
pclBase = new BINARY::CMatchedExecutionReport200515();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CMatchedExecutionReport* pclBody = (BINARY::CMatchedExecutionReport200515*)pclBase;
strSecurity = std::string(pclBody->GetMATCHED_EXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_MatchedExecutionReport200615: //以收盘价交易的盘后定价交易执行报告\以成交量加权平均价交易的盘后定价交易执行报告
{
pclBase = new BINARY::CMatchedExecutionReport200615();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CMatchedExecutionReport* pclBody = (BINARY::CMatchedExecutionReport200615*)pclBase;
strSecurity = std::string(pclBody->GetMATCHED_EXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_MatchedExecutionReport200715: //转融通证券出借非约定执行报告
{
pclBase = new BINARY::CMatchedExecutionReport200715();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CMatchedExecutionReport* pclBody = (BINARY::CMatchedExecutionReport200715*)pclBase;
strSecurity = std::string(pclBody->GetMATCHED_EXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_MatchedExecutionReport202615: //备兑锁定执行报告\备兑解锁执行报告
{
pclBase = new BINARY::CMatchedExecutionReport202615();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CMatchedExecutionReport* pclBody = (BINARY::CMatchedExecutionReport202615*)pclBase;
strSecurity = std::string(pclBody->GetMATCHED_EXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_MatchedExecutionReport206315: //港股通订单执行报告
{
pclBase = new BINARY::CMatchedExecutionReport206315();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CMatchedExecutionReport* pclBody = (BINARY::CMatchedExecutionReport206315*)pclBase;
strSecurity = std::string(pclBody->GetMATCHED_EXECUTION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_QuoteStatusReport200406: //期权集中竞价交易报价状态
{
pclBase = new BINARY::CQuoteStatusReport200406();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CQuoteStatusReport* pclBody = (BINARY::CQuoteStatusReport200406*)pclBase;
strSecurity = std::string(pclBody->GetQUOTE_STATUS_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_QuoteStatusReport200506: //协议交易报价状态回报
{
pclBase = new BINARY::CQuoteStatusReport200506();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CQuoteStatusReport* pclBody = (BINARY::CQuoteStatusReport200506*)pclBase;
strSecurity = std::string(pclBody->GetQUOTE_STATUS_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_QuoteRequestAck200417: //期权集中竞价交易询价申报
{
pclBase = new BINARY::CQuoteRequestAck200417();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CQuoteRequestAck* pclBody = (BINARY::CQuoteRequestAck200417*)pclBase;
strSecurity = std::string(pclBody->GetQUOTE_REQUEST_ACKSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_QuoteRequestReject200418: //期权集中竞价交易询价申报
{
pclBase = new BINARY::CQuoteRequestReject200418();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CQuoteRequestReject* pclBody = (BINARY::CQuoteRequestReject200418*)pclBase;
strSecurity = std::string(pclBody->GetQUOTE_REQUEST_REJECTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_QuoteResponse200510: //协议交易意向申报响应
{
pclBase = new BINARY::CQuoteResponse200510();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CQuoteResponse* pclBody = (BINARY::CQuoteResponse200510*)pclBase;
strSecurity = std::string(pclBody->GetQUOTE_RESPONSESecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_TradeCaptureReportAck200504: //协议交易双方协议成交申报响应
{
pclBase = new BINARY::CTradeCaptureReportAck200504();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CTradeCaptureReportAck* pclBody = (BINARY::CTradeCaptureReportAck200504*)pclBase;
strSecurity = std::string(pclBody->GetTRADE_CAPTURE_REPORT_ACKSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_TradeCaptureReportAck200704: //转融通证券出借约定申报响应
{
pclBase = new BINARY::CTradeCaptureReportAck200704();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CTradeCaptureReportAck* pclBody = (BINARY::CTradeCaptureReportAck200704*)pclBase;
strSecurity = std::string(pclBody->GetTRADE_CAPTURE_REPORT_ACKSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_TradeCaptureReportAck200804: //资产管理计划份额转让成交申报响应
{
pclBase = new BINARY::CTradeCaptureReportAck200804();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CTradeCaptureReportAck* pclBody = (BINARY::CTradeCaptureReportAck200804*)pclBase;
strSecurity = std::string(pclBody->GetTRADE_CAPTURE_REPORT_ACKSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_TradeCaptureReportAck200904://股票质押式回购成交申报响应
{
pclBase = new BINARY::CTradeCaptureReportAck200904();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CTradeCaptureReportAck* pclBody = (BINARY::CTradeCaptureReportAck200904*)pclBase;
strSecurity = std::string(pclBody->GetTRADE_CAPTURE_REPORT_ACKSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_TradeCaptureReportAck201004:     
{
pclBase = new BINARY::CTradeCaptureReportAck201004();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CTradeCaptureReportAck* pclBody = (BINARY::CTradeCaptureReportAck201004*)pclBase;
strSecurity = std::string(pclBody->GetTRADE_CAPTURE_REPORT_ACKSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_TradeCaptureReportAck201104:     
{
pclBase = new BINARY::CTradeCaptureReportAck201104();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CTradeCaptureReportAck* pclBody = (BINARY::CTradeCaptureReportAck201104*)pclBase;
strSecurity = std::string(pclBody->GetTRADE_CAPTURE_REPORT_ACKSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_TradeCaptureReportAck203004:     
{
pclBase = new BINARY::CTradeCaptureReportAck203004();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CTradeCaptureReportAck* pclBody = (BINARY::CTradeCaptureReportAck203004*)pclBase;
strSecurity = std::string(pclBody->GetTRADE_CAPTURE_REPORT_ACKSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_TradeCaptureReport200503: 
{
pclBase = new BINARY::CTradeCaptureReport200503();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CTradeCaptureReport* pclBody = (BINARY::CTradeCaptureReport200503*)pclBase;
strSecurity = std::string(pclBody->GetTRADE_CAPTURE_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}       
break;
case BINARY::MsgType_TradeCaptureReport200703:
{
pclBase = new BINARY::CTradeCaptureReport200703();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CTradeCaptureReport* pclBody = (BINARY::CTradeCaptureReport200703*)pclBase;
strSecurity = std::string(pclBody->GetTRADE_CAPTURE_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_TradeCaptureReport203003:
{
pclBase = new BINARY::CTradeCaptureReport203003();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CTradeCaptureReport* pclBody = (BINARY::CTradeCaptureReport203003*)pclBase;
strSecurity = std::string(pclBody->GetTRADE_CAPTURE_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_DesignationReport202098:
{
pclBase = new BINARY::CDesignationReport202098();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CDesignationReport202098* pclBody = (BINARY::CDesignationReport202098*)pclBase;
strSecurity = std::string(pclBody->GetDESIGNATION_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_EvoteReport202196:
{
pclBase = new BINARY::CEvoteReport202196();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CEvoteReport202196* pclBody = (BINARY::CEvoteReport202196*)pclBase;
strSecurity = std::string(pclBody->GetEVOTE_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_PasswordServiceReport202488:
{
pclBase = new BINARY::CPasswordServiceReport202488();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CPasswordServiceReport202488* pclBody = (BINARY::CPasswordServiceReport202488*)pclBase;
strSecurity = std::string(pclBody->GetPASSWORD_SERVICE_REPORTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
case BINARY::MsgType_MarginQueryResult202586:
{
pclBase = new BINARY::CMarginQueryResult202586();
bDeSucc = pclBase->Deserialize(pszBussBufOut, iBufLenOut);
BINARY::CMarginQueryResult202586* pclBody = (BINARY::CMarginQueryResult202586*)pclBase;
strSecurity = std::string(pclBody->GetMARGIN_QUERY_RESULTSecurityID(iLen));
i64ReportIndex = pclBase->GetReportIndex();
}
break;
default:
printf( "未被处理的回报消息[ MsgType=%d]", iMsgType);
return ;
}


if (bDeSucc == false)
{
delete pclBase;
pclBase = NULL;
printf( "回报消息解析失败[ MsgType=%d]", iMsgType);
return ;
}



bool CBinaryApplication::SendSynchMessage(int p_iReportIndex )
{
int iReportIndex = p_iReportIndex;
BINARY::CReportSynchronization clMessage;
clMessage.SetREPORT_SYNCHRONIZATIONReportIndex(iReportIndex);
return this->SendData(clMessage);
}










// add by liusg 2016-11-18 修正接收到交易所logout消息接口未被关闭的问题 接收到登出消息需要断开网络
void CBinaryApplication::DoLogout(TCPCONNECT::CONNECT_INFO& refConnectInfo)
{
// 构建Logout消息
int iMessageLen = 0;
BINARY::CLogout logout;
unsigned int iMsgType = logout.GetHEADMsgType();
char* pszMessage = GenerateLogout(4, "会话退登完成", logout, iMessageLen);
// 发送Logout消息
// modified begin by liusg 2016-11-28 增加二进制显示格式文本串的输出
this->SendData(logout);
//   m_clNetComm.SendData(m_stConnectInfo, pszMessage, iMessageLen);
//   char szTile[50] = { 0 };
//   sprintf_s(szTile, "SEND MsgType( %d )", iMsgType);
//   m_clBusinessFileLog.WriteLog(szTile, pszMessage, iMessageLen);
// modified end
closesocket(refConnectInfo.iSocketHandle);


m_bQuitWaitLogin = false;
}
// add end


void CBinaryApplication::DoConnectSuccess(TCPCONNECT::CONNECT_INFO& refConnectInfo)
{
char szTile[30] = {0};
char szHint[128] = {0};
memcpy(&m_stConnectInfo, &refConnectInfo, sizeof(m_stConnectInfo));
sprintf_s(szHint, "Connect to %s on port %d success", refConnectInfo.szConnectIP, refConnectInfo.siConnectPort);
m_clNetFileLog.WriteLog(std::string(szHint));
memset(szHint, 0x00, sizeof(szHint));
BINARY::CLogon clLogin;
int iLoginLen = 0;
char* pszMessage = GenerateLogon(clLogin, iLoginLen);


// modified begin by liusg 2016-11-28 增加二进制显示格式文本串的输出
if (this->SendData(clLogin))
//if (m_clNetComm.SendData(refConnectInfo, pszMessage, iLoginLen))
{
memset(szTile, 0x00, sizeof(szTile));
sprintf_s(szHint, "Initialize Login success");
m_clNetFileLog.WriteLog(std::string(szHint));
//     sprintf_s(szTile, "SEND MsgType( %d )", clLogin.GetHEADMsgType());
//     m_clBusinessFileLog.WriteLog(szTile, pszMessage, iLoginLen);
// modified end
}
else
{
sprintf_s(szHint, "Failed Initialze Login");
m_clNetFileLog.WriteLog(std::string(szHint));
}
}


bool CBinaryApplication::StartHeartBeat()
{
bool bReturn = true;
mylib::CCriticalSectionGuard lockGuard(m_clCSHeartBeat);
if (m_hHeartBeatThread == INVALID_HANDLE_VALUE)
{
m_hQuitHeartBeatEvent = CreateEvent(NULL, false, false, "");
m_hHeartBeatThread = (HANDLE )_beginthreadex( NULL, 0, HeartBeatThread, this, 0, &m_iHeartBeatThreadID );
if (m_hHeartBeatThread != INVALID_HANDLE_VALUE)
bReturn = true;
}
return bReturn;
}


bool CBinaryApplication::StopHeartBeat()
{
bool bReturn = true;
mylib::CCriticalSectionGuard lockGuard(m_clCSHeartBeat);
if (m_hHeartBeatThread != INVALID_HANDLE_VALUE)
{
SetEvent(m_hQuitHeartBeatEvent);
WaitForSingleObject(m_hHeartBeatThread, INFINITE);
m_hHeartBeatThread = INVALID_HANDLE_VALUE;
CloseHandle(m_hQuitHeartBeatEvent );
m_hQuitHeartBeatEvent = INVALID_HANDLE_VALUE;
}
return true;
}








unsigned int _stdcall CBinaryApplication::HeartBeatThread(void* p)
{
char szTile[30] = {0};
char szHint[128] = {0};
CBinaryApplication* pThis = (CBinaryApplication*)p;
pThis->SetRecvDataTime(GetTickCount());
pThis->SetSendDataTime(GetTickCount());
while(WaitForSingleObject(pThis->m_hQuitHeartBeatEvent, 1000) != WAIT_OBJECT_0)
{
// 计算 超过通讯心跳超时间隔,则主动发起心跳
if ((GetTickCount() - pThis->GetSendDataTime()) > pThis->m_iHeartBeatInter*1000)
{
pThis->SetSendDataTime(GetTickCount());
// 构建HeartBeat消息
BINARY::CHeartbeat clHeartBeat;
int iMessageLen = 0;
char* pszMessage = clHeartBeat.Serialize(iMessageLen);
// 发送HeartBeat消息
// modified begin by liusg 2016-11-28 增加二进制显示格式文本串的输出
pThis->SendData(clHeartBeat);
//       if(pThis->m_clNetComm.SendData(pThis->m_stConnectInfo, pszMessage, iMessageLen))
//       {
//         memset(szTile, 0x00, sizeof(szTile));
//         sprintf_s(szTile, "SEND MsgType( %d )", clHeartBeat.GetHEADMsgType());
//         pThis->m_clBusinessFileLog.WriteLog(szTile, pszMessage, iMessageLen);
//       }
// modified end
}


// 计算 多久没有收到交易所的心跳或是响应,则需要断开网络,重新连接。
if (GetTickCount() - pThis->GetRecvDataTime() > pThis->m_iCommuTimeout*1000) // 接收数据超时,则断开网络
{
printf( "通讯链路超时,对端无心跳,断开网络[IP:%s, Port:%d]", const_cast< char* >(pThis->m_strPlatIP.c_str() ), pThis->m_uiPlatPort);


closesocket(pThis->m_stConnectInfo.iSocketHandle);
}
}
return 0;
}




// add by liusg 2016-11-28 增加二进制显示格式文本串的输出
void CBinaryApplication::GetBinaryConfig(std::string strConfigFile, BINARY_CONFIG& stBinaryCfg)
{
//::GetPrivateProfileSection()
char szCurrentDir[256] = {0};
::GetCurrentDirectory(256, szCurrentDir);


std::string strFileName = std::string(szCurrentDir).append("\\").append(strConfigFile.c_str());
char szTempBuffer[256] = { 0 };


GetPrivateProfileString( "SESSION", "DefaultApplVerID", "0.00", szTempBuffer, sizeof(szTempBuffer), strFileName.c_str() );
m_stBinaryConfig.strDefaultApplVerID = std::string(szTempBuffer);


memset(szTempBuffer, 0x00, 256);
GetPrivateProfileString( "SESSION", "ProtocolFeildsDictionary", "", szTempBuffer, sizeof(szTempBuffer), strFileName.c_str() );
m_stBinaryConfig.strProtocalFieldsFileName = std::string(szTempBuffer);


memset(szTempBuffer, 0x00, 256);
GetPrivateProfileString( "SESSION", "ProtocolsDictionary", "", szTempBuffer, sizeof(szTempBuffer), strFileName.c_str() );
m_stBinaryConfig.strBinaryProtocalsFileName = std::string(szTempBuffer);


//add begin by liusg 2016-11-28 增加是否启用二进制明文显示
memset(szTempBuffer, 0x00, 256);
GetPrivateProfileString( "SESSION", "EnableClearText", "NO", szTempBuffer, sizeof(szTempBuffer), strFileName.c_str() );
m_stBinaryConfig.bEnableClearText = (std::string(szTempBuffer) == "NO")? false : true;  
// add end
}
// add end






原创粉丝点击