step 1:客户端发起了登陆数据库服务器的请求
数据服务器为web服务器,登陆请求址为download/clking/login请求。post方式
1.1 数据库服务器域名定义在
G:\stock\Tskingfromgoogle\src\StkLib\Src\Profile.cpp
/Profile.cpp 定义了历史数据下载的网址: 2019/05/20 by freeman
CSPString CStProfile::GetMainServerDomain()
{
CSPString strResult;
char szMainServerDomainFmt[] = "%sin%su%sls%sco%s";
// ninebul ninebulls.comls.co m
// ^ ^^ ^ ^ ^
strResult.Format( szMainServerDomainFmt, "n", "eb", "l", ".", "m" );
strResult = "tsking.cn"; //old
strResult = "ninebulls.com"; //modify temp by freeman 2019/05/20
return strResult;
}
1.2 相关的下载数据项目的地址download/clking定义在
G:\stock\Tskingfromgoogle\src\StkLib\Src\Profile.cpp
CSPString CStProfile::GetDownloadURL( )
{
CSPString strResult;
#ifdef CLKLAN_ENGLISH_US
strResult.Format( "http://%s:%d/enu/download/ninebulls/", (LPCTSTR)GetHTTPServerDomain(), GetHTTPServerPort() );
#elif defined CLKVER_OEM
strResult.Format( "http://%s:%d/download/stockana/", (LPCTSTR)GetHTTPServerDomain(), GetHTTPServerPort() );
#else
strResult.Format( "http://%s:%d/download/clking/", (LPCTSTR)GetHTTPServerDomain(), GetHTTPServerPort() );
#endif
return strResult;
}
下载的数据项目在StkNet\Src\HttpClt.cpp中定义
G:\stock\Tskingfromgoogle\src\StkNet\Src\HttpClt.cpp
const TCHAR szHttpURLFormat[] = "http://%s:%d%s";
#ifdef CLKLAN_ENGLISH_US
const TCHAR *szWebpathWGet = _T( "/enu/download/ninebulls/wget" );
const TCHAR *szWebpathLogin = _T( "/enu/download/ninebulls/login" );
const TCHAR *szWebpathLogout = _T( "/enu/download/ninebulls/logout" );
const TCHAR *szWebpathPackageInfo = _T( "/enu/download/ninebulls/package3.xml" );
const TCHAR *szWebpathServerInfo = _T( "/enu/download/ninebulls/server3.xml" );
#elif defined CLKVER_OEM
const TCHAR *szWebpathWGet = _T( "/download/stockana/wget" );
const TCHAR *szWebpathLogin = _T( "/download/stockana/login" );
const TCHAR *szWebpathLogout = _T( "/download/stockana/logout" );
const TCHAR *szWebpathPackageInfo = _T( "/download/stockana/package3.xml" );
const TCHAR *szWebpathServerInfo = _T( "/download/stockana/server3.xml" );
#else
const TCHAR *szWebpathWGet = _T( "/download/clking/wget" );
const TCHAR *szWebpathLogin = _T( "/download/clking/login" );
const TCHAR *szWebpathLogout = _T( "/download/clking/logout" );
const TCHAR *szWebpathPackageInfo = _T( "/download/clking/package3.xml" );
const TCHAR *szWebpathServerInfo = _T( "/download/clking/server3.xml" );
#endif
1.3 登陆数据库服务器:数据服务器为web服务器
用用户名、密码、注册码、序列号、版本号登陆,用cookie保存用户登录信息。
G:\stock\Tskingfromgoogle\src\StkUI\Dialog\DownloadDlg.cpp
在“数据下载”登陆框点击开始后,执行的
login 调用链:src\StkUI\Dialog\DownloadDlg.cpp里的OnOK按钮->\STKNeT\netdb.cpp 里面的login ->STKNeT\httpclt.cpp里面的login,登陆成功后在httpclt.h 里面的m_bIsLogin 设置为true
m_bIsLogin = FALSE;
if( HTTP_STATUS_OK == RequestPost( strURL, &map, &strResult, NULL, NULL ) )
{
CString strResultOK;
//const TCHAR *szResultOKFmt= _T( "%sO%s" );数据服务器返回的内容应该包含字符串 “+OK” 2019/06/08 by freeman
strResultOK.Format( szResultOKFmt, "+", "K" );
if( -1 != strResult.Find( strResultOK ) )
{
m_bIsLogin = TRUE;
return TRUE;
}
}
服务器返回信息应为:包含字符串 +OK,则客户端认为登陆成功。注销logout 数据服务器返回字符串也应该是+OK。
void CDownloadDlg::OnOK()
{
}
服务器端没有返回正确的信息时,出现错误信息
G:\stock\Tskingfromgoogle\src\StkNet\Src\Strings.cpp
char szErrInterrupted[] = "网络传输意外终止,请与软件供应商联系";
step 2:下载download/clking/package3.xml get方式
选择“历史数据下载”菜单后,弹出“数据下载”框,点击“开始”按钮,执行 OnOK()函数, OnOK()函数位于
G:\stock\Tskingfromgoogle\src\StkUI\Dialog\DownloadDlg.cpp,
调用链条:src\StkUI\Dialog\DownloadDlg.cpp的OnOK()->调用sTknet里的NetDb.cpp->CNetDatabase::NetloadPackageInfo()->httpclt.cpp里面的CHttpClient:LoadPackageInfo()
void CDownloadDlg::OnOK()
{
// load package info
if( bOK && ! m_netdb.NetloadPackageInfo( NULL, NULL ) )
{
char szErr[1024];
if( m_netdb.GetLastErrorMessage(szErr,1023) )
AfxMessageBox( szErr, MB_OK | MB_ICONINFORMATION );
else
AfxMessageBox( IDS_DOWNLOAD_FAILED, MB_OK | MB_ICONINFORMATION );
bOK = FALSE;
}
}
G:\stock\Tskingfromgoogle\src\StkNet\Src\NetDB.cpp
BOOL CNetDatabase::NetloadPackageInfo( PROGRESS_CALLBACK fnCallback, void *cookie )
{
CString strPackageInfo;
if( !m_httpClient.LoadPackageInfo( strPackageInfo, fnCallback, cookie ) )
{
SetLastError( ERR_NETDB_HTTPCLIENT );
return FALSE;
}
if( ! m_packages.SetRawXMLDocument( strPackageInfo ) )
{
SetLastError( ERR_NETDB_PACKAGES );
return FALSE;
}
AfxGetProfile().SetNetInfo( m_packages.m_strInfo, m_packages.m_strInfourl );
AfxGetProfile().SetLatestver( m_packages.m_strLatestver );
return TRUE;
}
基本介绍
G:\stock\Tskingfromgoogle\src\StkNet\Include\Markup.cpp
定义了XML解析类CMarkup
G:\stock\Tskingfromgoogle\src\StkNet\Include\NetDB.h
定义了以下几个类:
数据下载服务器信息
class STKNET_API CDownloadServer : public CXMLNode
{
public:
CDownloadServer( ) { };
CDownloadServer( const CDownloadServer &src );
virtual ~CDownloadServer( ) { };
// virtual operation
CDownloadServer & operator = ( const CDownloadServer & src );
virtual BOOL SetAttribute( CMarkup & markup );
BOOL FromString( CString string );
CString AsString( );
CString m_strAddress;
UINT m_nPort;
CString m_strDescript;
};
客户端下载步骤
2.1 G:\stock\Tskingfromgoogle\src\StkNet\Src\StartupDlg.cpp
点击行情服务器登陆窗口的“连接”按钮后,调用gsNet.dll中的RefreshServers( LPVOID pParam )函数,这个函数干了以下几件事情:
StartupDlg.cpp->RefreshServers( LPVOID pParam )
点击行情服务器登陆窗口的“连接”按钮后,调用gsNet.dll中的RefreshServers( LPVOID pParam )函数,这个函数干了以下几件事情:
刷新数据服务器列表:
登陆数据服务器:
下载以下数据到本地:
//从主服务器主服务器下载一些财经或者K线等的数据。
if( netdb->NetloadPackageInfo( NULL, NULL ) && netdb->GetPackages().m_nDataVersion > AfxGetProfile().GetLocalDataVersion() )
{
netdb->NetloadCodetbl( NULL, NULL );
netdb->NetloadBasetable( NULL, NULL, NULL, NULL, NULL );
netdb->NetloadDRData( NULL, NULL, NULL, NULL, NULL );
AfxGetProfile().SetLocalDataVersion( netdb->GetPackages().m_nDataVersion );
}
下载数据