⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 data.cpp

📁 关于联通的一个统一定制程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -