调用链条:\StkUI\MainFrm.cpp->CMainFrame::OnSysConnectserver()
->\StkNet\Src\StartupDlg.cpp->CStartupDlg::OnOK()
1.点击“连接行情服务器”按钮,执行的是
G:\stock\TskingVS2019\src\Client\StkUI\MainFrm.cpp
“连接行情服务器”按钮ID为ID_SYS_CONNECTSERVER,点击时发送消息OnSysConnectserver
2.弹出“连接行情服务器”登陆框
G:\stock\TskingVS2019\src\Client\StkUI\MainFrm.cpp
“连接行情服务器”登陆框在StkNet工程中定义,类名为CStartupDlg,由:\stock\TskingVS2019\src\Client\StkNet\Src\StartupDlg.cpp实现
3.行情连接登陆框点击“连接”按钮解析
G:\stock\TskingVS2019\src\Client\StkNet\Src\StartupDlg.cpp
接收数据过程:
1.事件机制接收数据
2.
(CTWSocket)CTWSocket::OnReceive(int nErrorCode)负责采用事件机制接收行情服务器发送过来的收据
然后调用CTSCache::GetInstance().OnReceive(m_rbuffer, nReceive);对收到的数据解码
CTSCache::GetInstance().OnReceive(m_rbuffer, nReceive);
解码代码
int CTSCache::TryGetPacket( int nPacketLen ) 函数按下面的循序逐个尝试解码,看属于哪种类型的数据包
nLen = TryGetInit( m_buffer, nPacketLen, prcvdata );
nLen = TryGetReport( m_buffer, nPacketLen, prcvdata );
nLen = TryGetMinute( m_buffer, nPacketLen, prcvdata, prcvdata2 );
nLen = TryGetHistory( m_buffer, nPacketLen, prcvdata );
int CTSCache::TryGetPacket( int nPacketLen )
{
if( nPacketLen <= 0 || nPacketLen > (int)m_nBufLen )
return 0;
PRCV_DATA prcvdata = NULL;
PRCV_DATA prcvdata2 = NULL;
int nLen = 0;
prcvdata = new RCV_DATA();
memset( prcvdata, 0, sizeof(RCV_DATA) );
nLen = TryGetInit( m_buffer, nPacketLen, prcvdata );
if( nLen > 0 )
{
{
CSingleLock lock(&m_mutexReports,TRUE);
m_aReports.RemoveAll();
m_mapReports.RemoveAll();
}
PushReport( prcvdata->m_pReport, prcvdata->m_nPacketNum );
PushPacket( RCV_REPORT, prcvdata );
prcvdata = NULL;
StoreReports( );
return 1;
}
if( prcvdata ) FreePacket(prcvdata);
prcvdata = new RCV_DATA();
memset( prcvdata, 0, sizeof(RCV_DATA) );
nLen = TryGetReport( m_buffer, nPacketLen, prcvdata );
if( nLen > 0 )
{
PushReport( prcvdata->m_pReport, prcvdata->m_nPacketNum );
PushPacket( RCV_REPORT, prcvdata );
prcvdata = NULL;
return 1;
}
if( prcvdata ) FreePacket(prcvdata);
prcvdata = new RCV_DATA();
prcvdata2 = new RCV_DATA();
memset( prcvdata, 0, sizeof(RCV_DATA) );
memset( prcvdata2, 0, sizeof(RCV_DATA) );
nLen = TryGetMinute( m_buffer, nPacketLen, prcvdata, prcvdata2 );
if( nLen > 0 )
{
PushReport( prcvdata2->m_pReport, prcvdata2->m_nPacketNum );
PushPacket( RCV_FILEDATA, prcvdata );
PushPacket( RCV_REPORT, prcvdata2 );
prcvdata = NULL;
prcvdata2 = NULL;
return 1;
}
if( prcvdata ) FreePacket(prcvdata);
if( prcvdata2 ) FreePacket(prcvdata2);
prcvdata = new RCV_DATA();
memset( prcvdata, 0, sizeof(RCV_DATA) );
nLen = TryGetHistory( m_buffer, nPacketLen, prcvdata );
if( nLen > 0 )
{
PushPacket( RCV_FILEDATA, prcvdata );
prcvdata = NULL;
return 1;
}
if( prcvdata ) FreePacket(prcvdata);
prcvdata = new RCV_DATA();
memset( prcvdata, 0, sizeof(RCV_DATA) );
nLen = TryGetMultisort( m_buffer, nPacketLen, prcvdata );
if( nLen > 0 )
{
PushPacket( RCV_FILEDATA, prcvdata );
prcvdata = NULL;
return 1;
}
if( prcvdata ) FreePacket(prcvdata);
prcvdata = new RCV_DATA();
memset( prcvdata, 0, sizeof(RCV_DATA) );
nLen = TryGetDetail( m_buffer, nPacketLen, prcvdata );
if( nLen > 0 )
{
PushPacket( RCV_REPORT, prcvdata );
prcvdata = NULL;
return 1;
}
if( prcvdata ) FreePacket(prcvdata);
prcvdata = new RCV_DATA();
memset( prcvdata, 0, sizeof(RCV_DATA) );
nLen = TryGetBase( m_buffer, nPacketLen, prcvdata );
if( nLen > 0 )
{
PushPacket( RCV_FILEDATA, prcvdata );
prcvdata = NULL;
return 1;
}
if( prcvdata ) FreePacket(prcvdata);
return 0;
}
解码成功则得到PRCV_DATA
客户端将网络服务器来的数据先转换成PRCV_DATA
,然后再
转换成COMMPACKET。
G:\stock\TskingVS2019\src\Client\StkLib\Include\Stock.h
COMMPACKET是各窗口能识别通用的数据结构
G:\stock\TskingVS2019\src\Client\NetTS\Stockdrv.h
PRCV_DATA是将行情服务器发送过来的数据构造成这么一个结构,然后要转换成COMMPACKET结构,再用消息的形式发往各窗口,以便各窗口接收。