📄 data.cpp
字号:
// Global.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Data.h"
#include "io.h" // for _access()
#include "MyDatabase.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///////////////////////////////////////////////////////////////////////////
//
CData theData;
//////////////////////////////////////////////////////////////////////
// Data Class
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CData::CData()
: m_bServiceExit(FALSE),
m_socket(INVALID_SOCKET)
{
}
CData::~CData()
{
}
void CData::GetCfgInfo()
{
TCHAR path[_MAX_PATH];
LPTSTR temp = NULL;
GetModuleFileName(NULL, path, _MAX_PATH);
temp = strrchr(path, '\\');
path[temp - path + 1] = '\0';
lstrcat(path, IOD_Cfg_File);
if (_access(path, 0) == -1)
{
cerr << _T("找不到配置文件,服务失败!") << endl;
exit(-1);
}
// Router
theCfgInfo.nRouterPort = (UINT)GetPrivateProfileInt("Router", "Port", -1, path);
GetPrivateProfileString("Router", "IP", "", theCfgInfo.szRouterIP, sizeof(theCfgInfo.szRouterIP), path);
// Service
GetPrivateProfileString("Service", "ID", "", theCfgInfo.szServiceID, sizeof(theCfgInfo.szServiceID), path);
theCfgInfo.nServicePort = (UINT)GetPrivateProfileInt("Service", "Port", -1, path);
GetPrivateProfileString("Service", "IP", "", theCfgInfo.szServiceIP, sizeof(theCfgInfo.szServiceIP), path);
// Dispatcher
theCfgInfo.nDispatcherPort = (UINT)GetPrivateProfileInt("Dispatcher", "Port", -1, path);
GetPrivateProfileString("Dispatcher", "IP", "", theCfgInfo.szDispatcherIP, sizeof(theCfgInfo.szDispatcherIP), path);
// Thread's count
theCfgInfo.nRecThread = (UINT)GetPrivateProfileInt("Option", "MaxRec", 3, path);
theCfgInfo.nRecThread = max(theCfgInfo.nRecThread, 1);
theCfgInfo.nRecThread = min(theCfgInfo.nRecThread, 10);
theCfgInfo.nWorkThread = (UINT)GetPrivateProfileInt("Option", "MaxWork", 3, path);
theCfgInfo.nWorkThread = max(theCfgInfo.nWorkThread, 1);
theCfgInfo.nWorkThread = min(theCfgInfo.nWorkThread, 10);
theCfgInfo.nSendThread = (UINT)GetPrivateProfileInt("Option", "MaxSend", 3, path);
theCfgInfo.nSendThread = max(theCfgInfo.nSendThread, 1);
theCfgInfo.nSendThread = min(theCfgInfo.nSendThread, 10);
// max retry send time
theCfgInfo.nMaxRetryTime = (UINT)GetPrivateProfileInt("Option", "MaxResend", 3, path);
theCfgInfo.nMaxRetryTime = max(theCfgInfo.nMaxRetryTime, 1);
theCfgInfo.nMaxRetryTime = min(theCfgInfo.nMaxRetryTime, 10);
theCfgInfo.nRetryInterval = (UINT)GetPrivateProfileInt("Option", "RetryInterval", 10, path);
theCfgInfo.nRetryInterval = max(theCfgInfo.nRetryInterval, 5);
theCfgInfo.nRetryInterval = min(theCfgInfo.nRetryInterval, 60);
// Log
GetPrivateProfileString("Log", "Folder", "", theCfgInfo.szLogFolder, sizeof(theCfgInfo.szLogFolder), path);
GetPrivateProfileString("Log", "Module", "", theCfgInfo.szLogModule, sizeof(theCfgInfo.szLogModule), path);
GetPrivateProfileString("Log", "Server", "", theCfgInfo.szLogServer, sizeof(theCfgInfo.szLogServer), path);
}
void CData::RegisterDispatcher()
{
CString szReg;
szReg.Format("GET /LOGIN?SERVICEID=%s&SERVICEIP=%s&SERVICEPORT=%d HTTP1.1", theCfgInfo.szServiceID, theCfgInfo.szServiceIP, theCfgInfo.nServicePort);
SOCKET sock;
sockaddr_in remote;
remote.sin_family = AF_INET;
remote.sin_port = htons(theCfgInfo.nDispatcherPort);
remote.sin_addr.s_addr = inet_addr(theCfgInfo.szDispatcherIP);
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == sock)
{
WriteLog("注册Dispatch失败,SOCKET创建失败!", _T("I230"));
return;
}
if (connect(sock, (const struct sockaddr*)&remote, sizeof(remote)) != 0)
{
closesocket(sock);
WriteLog("注册Dispatch失败,连接服务器失败!", _T("I230"));
return;
}
if (send(sock, szReg, szReg.GetLength(), 0) == SOCKET_ERROR)
{
closesocket(sock);
WriteLog("注册Dispatch失败,发送注册信息失败!", _T("I230"));
return;
}
closesocket(sock);
WriteLog("注册Dispatch成功!");
}
BOOL CData::InitLog()
{
INITABLE it;
it.strFilter[0] = LSDEBUG_IAS_OFF;
it.strFilter[1] = LSDEBUG_ISS_OFF;
it.strFilter[2] = LSDEBUG_ISD_OFF;
it.strFolder = theCfgInfo.szLogFolder;
it.strModule = theCfgInfo.szLogModule;
it.strServer = theCfgInfo.szLogServer;
it.ftlist[0].iLogType = LT_IAS;
it.ftlist[1].iLogType = LT_ISS;
it.ftlist[2].iLogType = LT_ISD;
try
{
theLog.InitialLog(it);
}
catch (char* e)
{
CString str(e);
#ifdef _DEBUG
TRACE(str);
#endif
return FALSE;
}
catch (CFileException* e)
{
#ifdef _DEBUG
TCHAR szError[500];
e->GetErrorMessage(szError, 500);
TRACE(szError);
#endif
e->Delete();
return FALSE;
}
return TRUE;
}
void CData::WriteLog(LPCTSTR pszLog, LPCTSTR pszErrCode)
{
try
{
theLog.WriteLog(pszLog, pszErrCode);
}
catch (char* e)
{
CString str(e);
#ifdef _DEBUG
TRACE(str);
#endif
}
catch (CFileException* e)
{
#ifdef _DEBUG
TCHAR szError[500];
e->GetErrorMessage(szError, 500);
TRACE(szError);
#endif
e->Delete();
}
}
void CData::WriteLog(int nLogType, LPCTSTR pszMobile, LPCTSTR pszSubID, int nMsgFmt, int nMsgLen, LPCTSTR pszContent,
LPCTSTR pszFeeMP, LPCTSTR pszSrcGWID, LPCTSTR pszSrcMobile, int nMsgLevel, LPCTSTR pszMSGID,
LPCTSTR pszFeeType, LPCTSTR pszFeeCode, int nErrorCode, LPCTSTR pszAttached)
{
try
{
LOGRECORD lr;
lr.strDestMobile = pszMobile;
lr.strSubCode = pszSubID;
lr.strStrFmt.Format("%d", nMsgFmt);
lr.SetContent((unsigned char*)pszContent, nMsgLen);
lr.strFeeMobile = pszFeeMP;
lr.strSouceID = pszSrcGWID;
lr.strSrcMobile = pszSrcMobile;
lr.strMSGLever.Format("%d", nMsgLevel);
lr.strMSGID=pszMSGID;
if (pszFeeType)
lr.strFeeType = pszFeeType;
if (pszFeeCode)
lr.strFee = pszFeeCode;
lr.strErrorCode.Format("%s%d", pszAttached, nErrorCode);
theLog.WriteLog(lr, nLogType);
}
catch (char* e)
{
CString str(e);
#ifdef _DEBUG
TRACE(str);
#endif
}
catch (CFileException* e)
{
#ifdef _DEBUG
TCHAR szError[500];
e->GetErrorMessage(szError, 500);
TRACE(szError);
#endif
e->Delete();
}
}
void CData::CloseLog()
{
theLog.CloseLog();
}
BOOL CData::CreateSocket()
{
WSADATA wsaData;
sockaddr_in server;
if (WSAStartup(0x202, &wsaData) != 0)
{
WriteLog("Socket初始化失败!", _T("I110"));
return FALSE;
}
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_socket == INVALID_SOCKET)
{
WriteLog("Socket创建失败!", _T("I110"));
WSACleanup();
return FALSE;
}
server.sin_family = AF_INET;
server.sin_port = htons(theCfgInfo.nServicePort);
server.sin_addr.s_addr = inet_addr(theCfgInfo.szServiceIP);
if (bind(m_socket, (sockaddr*)&server, sizeof(server)) != 0)
{
WriteLog("Socket绑定监听端口失败!", _T("I110"));
closesocket(m_socket);
m_socket = INVALID_SOCKET;
WSACleanup();
return FALSE;
}
if (listen(m_socket, 5) != 0)
{
WriteLog("Socket开始监听失败!", _T("I110"));
closesocket(m_socket);
m_socket = INVALID_SOCKET;
WSACleanup();
return FALSE;
}
WriteLog("Socket建立接收端口成功!");
return TRUE;
}
void CData::CloseSocket()
{
if (m_socket != INVALID_SOCKET)
{
closesocket(m_socket);
m_socket = INVALID_SOCKET;
WSACleanup();
WriteLog("Socket接收端口关闭!");
}
}
void CData::AddOneRecMsg(LPCTSTR pszFrom, LPCTSTR lpBuf, UINT nLen)
{
CString szLog;
// too short
if (nLen < 4)
{
WriteLog("接收到的数据包的长度不对!", _T("I219"));
return;
}
IOD_Info info;
memset(&info, 0x0, sizeof(info));
LPTSTR cursor = (LPTSTR)lpBuf;
LPTSTR temp = (LPTSTR)0;
int nTmpLen = 0;
//data packet length
ULONG lCmdLen = 0;
memcpy(&lCmdLen, cursor, 4);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -