策略为王源代码分析-构建数据服务器源代码

Published

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

 

 

下载数据