Эх сурвалжийг харах

protobuf拆包、粘包:暂时无法在protobuf上处理,需要序列化后处理。

Jeff 6 жил өмнө
parent
commit
f02446e309

+ 412 - 6
source/hook/WxService/MainProcess.cpp

@@ -1,37 +1,182 @@
 #include "StdAfx.h"
 #include "MainProcess.h"
 #include "WinService.h"
+#include "OnlineUser.h"
+#include <time.h>
+#include "CritSection.h"
+#include "msg.pb.h"
+#include "table.pb.h"
 
+
+time_t g_systm;
+// 服务通信对象;
+CMainProcess* CMainProcess::m_spThis = NULL;
 CMainProcess::CMainProcess(void)
 {
 	m_hBackupDatabase = NULL;
 	m_hCheckServices = NULL;
 	m_hEvent1 = NULL;
 	m_hEvent2 = NULL;
+
+	// 创建监听器对象
+	m_pListener = ::Create_HP_TcpServerListener();
+	// 创建 Socket 对象
+	m_pServer = ::Create_HP_TcpPackServer(m_pListener);
+	// 设置 Socket 监听器回调函数
+	::HP_Set_FN_Server_OnPrepareListen(m_pListener, OnPrepareListen);
+	::HP_Set_FN_Server_OnAccept(m_pListener, OnAccept);
+	::HP_Set_FN_Server_OnSend(m_pListener, OnSend);
+	::HP_Set_FN_Server_OnReceive(m_pListener, OnReceive);
+	::HP_Set_FN_Server_OnClose(m_pListener, OnClose);
+	::HP_Set_FN_Server_OnShutdown(m_pListener, OnShutdown);
+	// 获取机器时间;
+	time(&g_systm); // g_systm = time(NULL);
 }
 
 CMainProcess::~CMainProcess(void)
 {
+	// 销毁 Socket 对象
+	::Destroy_HP_TcpPackServer(m_spThis->m_pServer);
+	// 销毁监听器对象
+	::Destroy_HP_TcpServerListener(m_pListener);
+}
+
+En_HP_HandleResult __stdcall CMainProcess::OnPrepareListen(SOCKET soListen)
+{
+	TCHAR szAddress[40];
+	int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
+	USHORT usPort;
+
+	::HP_Server_GetListenAddress(m_spThis->m_pServer, szAddress, &iAddressLen, &usPort);
+	::PostOnPrepareListen(szAddress, usPort);
+	return HR_OK;
+}
+
+En_HP_HandleResult __stdcall CMainProcess::OnAccept( HP_CONNID dwConnID, SOCKET soClient)
+{
+	BOOL bPass = TRUE;
+	TCHAR szAddress[40];
+	int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
+	USHORT usPort;
+
+	::HP_Server_GetRemoteAddress(m_spThis->m_pServer, dwConnID, szAddress, &iAddressLen, &usPort);
+
+	if (!m_spThis->m_strAddress.IsEmpty())
+	{
+		if (m_spThis->m_strAddress.CompareNoCase(szAddress) == 0)
+			bPass = FALSE;
+	}
+
+	//::PostOnAccept(dwConnID, szAddress, usPort, bPass);
+
+	TRACE(_T("新客户端连接:%d, %s, %d!\n"), dwConnID, szAddress, usPort);
+
+	return bPass ? HR_OK : HR_ERROR;
+}
+
+En_HP_HandleResult __stdcall CMainProcess::OnSend( HP_CONNID dwConnID, const BYTE * pData, int iLength)
+{
+	TRACE(_T("发送数据给客户端:%d, %s, %d!\n"), dwConnID, pData, iLength);
+	//::PostOnSend(dwConnID, pData, iLength);
+	return HR_OK;
+}
+
+En_HP_HandleResult __stdcall CMainProcess::OnReceive( HP_CONNID dwConnID, const BYTE * pData, int iLength)
+{
+	TheProPackage thepackage;
+	memcpy(&thepackage, pData, sizeof(TheProPackage));
+
+	EnHandleResult nResult = HR_OK;
+	BYTE *pSendData = NULL;
+	DWORD dwSendLen = 0;
+	switch (thepackage.nCmd)
+	{
+		// 客户端请求登录;
+	case C2CCMD_REQ_LOGIN:
+	{
+		Req_Login(dwConnID, pData, iLength, msg_login(), pSendData, dwSendLen);
+	}
+	break;
+	// 客户端请求登出;
+	case C2CCMD_REQ_LOGOUT:
+	{
+		Req_LogOut(dwConnID, pData, iLength, thepackage, pSendData, dwSendLen);
+	}
+	break;
+	// 客户端请求添加部门;
+	case C2CCMD_NEW_DEPARTMENT:
+	{
+		New_Department(dwConnID, pData, iLength, thepackage, pSendData, dwSendLen);
+	}
+	break;
+	// 客户端请求删除部门;
+	case C2CCMD_DEL_DEPARTMENT:
+	{
+		Del_Department(dwConnID, pData, iLength, thepackage, pSendData, dwSendLen);
+	}
+	break;
+	// 客户端请求修改部门;
+	case C2CCMD_MOD_DEPARTMENT:
+	{
+		// 暂未使用;
+		Mod_Department(dwConnID, pData, iLength, thepackage, pSendData, dwSendLen);
+	}
+	break;
+	// 客户端请求查询部门;
+	case C2CCMD_QRY_DEPARTMENT:
+	{
+		nResult = Ask_Department(dwConnID, pData, iLength, thepackage, pSendData, dwSendLen);
+		if (nResult != HR_IGNORE)
+			return nResult;
+	}
+	break;
+	//////////////////////////////////////////////////////////////////////////
+	default:
+		break;
+	}
+
+	BOOL bSendResult = ::HP_Server_Send(m_spThis->m_pServer, dwConnID, pSendData, dwSendLen);
+	if (pSendData)
+		delete[]pSendData;
+
+	return bSendResult ? HR_OK : HR_ERROR;
+}
+
+En_HP_HandleResult __stdcall CMainProcess::OnClose( HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode)
+{
+	// 移除登录的用户信息;
+	COnlineUser::GetInstance()->EraseOnlineUser(dwConnID);
+
+	iErrorCode == SE_OK ? ::PostOnClose(dwConnID) : ::PostOnError(dwConnID, enOperation, iErrorCode);
+
+	return HR_OK;
+}
+
+En_HP_HandleResult __stdcall CMainProcess::OnShutdown()
+{
+	::PostOnShutdown();
+
+	return HR_OK;
 }
 
 void CMainProcess::StartWork()
 {
 	m_hEvent1 = CreateEvent(NULL, TRUE, FALSE, NULL);
-	if ( m_hEvent1 == NULL )
+	if (m_hEvent1 == NULL)
 	{
 		//_tprintf_s(_T("创建事件失败\n"));
 		return;
 	}
 
 	m_hEvent2 = CreateEvent(NULL, TRUE, FALSE, NULL);
-	if ( m_hEvent2 == NULL )
+	if (m_hEvent2 == NULL)
 	{
 		//_tprintf_s(_T("创建事件失败2\n"));
 		return;
 	}
 
 	m_hCheckServices = CreateThread(NULL, 0, CheckSvcStatusThread, this, 0, NULL);
-	if ( m_hCheckServices == NULL)
+	if (m_hCheckServices == NULL)
 	{
 		SetEvent(m_hEvent1);
 		SetEvent(m_hEvent2);
@@ -44,7 +189,7 @@ void CMainProcess::StartWork()
 	}
 
 	m_hBackupDatabase = CreateThread(NULL, 0, BackupDatabaseThread, this, 0, NULL);
-	if ( m_hBackupDatabase == NULL )
+	if (m_hBackupDatabase == NULL)
 	{
 		SetEvent(m_hEvent1);
 		SetEvent(m_hEvent2);
@@ -52,13 +197,15 @@ void CMainProcess::StartWork()
 		CloseHandle(m_hEvent2);
 		m_hEvent1 = NULL;
 		m_hEvent2 = NULL;
-		WaitForSingleObject(m_hCheckServices,INFINITE);
+		WaitForSingleObject(m_hCheckServices, INFINITE);
 		if (m_hBackupDatabase)
 			CloseHandle(m_hBackupDatabase);
 		m_hBackupDatabase = NULL;
 		//_tprintf_s(_T("创建线程失败2\n"));
 		return;
 	}
+
+	Start();
 }
 
 void CMainProcess::EndofWork()
@@ -87,6 +234,8 @@ void CMainProcess::EndofWork()
 		WaitForSingleObject(m_hBackupDatabase,INFINITE);
 		CloseHandle(m_hBackupDatabase);
 	}
+
+	Stop();
 }
 
 DWORD CMainProcess::CheckSvcStatusThread(LPVOID lpVoid)
@@ -109,4 +258,261 @@ DWORD CMainProcess::BackupDatabaseThread(LPVOID lpVoid)
 	} while ( WaitForSingleObject(pthis->m_hEvent2, 200) == WAIT_TIMEOUT );
 
 	return 0;
-}
+}
+
+BOOL CMainProcess::Start()
+{
+	if (m_spThis == NULL)
+		return FALSE;
+
+	::HP_TcpPackServer_SetMaxPackSize(m_spThis->m_pServer, 0x3FFFFF);
+	::HP_TcpPackServer_SetPackHeaderFlag(m_spThis->m_pServer, 0x3FE);
+
+	if (::HP_Server_Start(m_spThis->m_pServer, _T("0.0.0.0"), Global::g_dwSvrPort))
+	{
+		//::LogServerStart(ADDRESS, PORT);
+		OutputDebugString(_T("服务器启动成功!\n"));
+		//SetAppState(ST_STARTED);
+	}
+	else
+	{
+		//::LogServerStartFail(::HP_Server_GetLastError(m_spThis->m_pServer), ::HP_Server_GetLastErrorDesc(m_spThis->m_pServer));
+		OutputDebugString(_T("服务器启动失败!\n"));
+		//SetAppState(ST_STOPPED);
+	}
+
+	return TRUE;
+}
+
+BOOL CMainProcess::Stop()
+{
+	if (::HP_Server_Stop(m_spThis->m_pServer))
+	{
+		OutputDebugString(_T("停止服务器成功!\n"));
+		::LogServerStop();
+		//SetAppState(ST_STOPPED);
+	}
+	else
+	{
+		ASSERT(FALSE);
+	}
+
+	return TRUE;
+}
+
+BOOL CMainProcess::Disconnect(IN const DWORD & dwConnId)
+{
+	if (::HP_Server_Disconnect(m_spThis->m_pServer, dwConnId, TRUE))
+	{
+		// 移除登录的用户信息;
+		COnlineUser::GetInstance()->EraseOnlineUser(dwConnId);
+		::LogDisconnect(dwConnId);
+	}
+	else
+	{
+		::LogDisconnectFail(dwConnId);
+	}
+
+	return TRUE;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+void CMainProcess::Req_Login(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN msg_login &msg, OUT BYTE*& pSendData, OUT DWORD &dwSendLen)
+{
+	if (COnlineUser::GetInstance()->IsAccountExist(msg.phone().c_str()) == -1)
+	{// 用户没在线;
+		// 查询数据库是否存在用户;
+		INT nRet = USER_NULL;
+		//CUserDetail tagUserDetail;
+		//nRet = g_pODBCPool->QueryUserDetail(thepackage.szStudioId, thepackage.szAccount, thepackage.szPassword, &tagUserDetail);
+		nRet = 0;
+		if (nRet == USER_LOGIN)
+		{
+			CMemFile mf;
+			CArchive ar(&mf, CArchive::store);
+			//tagUserDetail.Serialize(ar);
+			ar.Close();
+
+			DWORD dwArchive = mf.GetLength();
+			dwSendLen = sizeof(TheProPackage) - 2 + dwArchive;
+			pSendData = new BYTE[dwSendLen];
+			TheProPackage *pPackage = (TheProPackage*)pSendData;
+			pPackage->flag = PACKAGE_ONESELF;
+			//pPackage->nCmd = thepackage.nCmd;
+			pPackage->nDataLen = dwArchive;
+			pPackage->dwReserve = USER_LOGIN;
+
+			BYTE *pMf = mf.Detach();
+			memcpy(pPackage->byBody, pMf, dwArchive);
+			if (pMf)
+				delete pMf;
+			// 记录在线用户;
+			COnlineUser::GetInstance()->InsertOnlineUser(dwConnID, msg.phone().c_str());
+		}
+		else
+		{
+			dwSendLen = sizeof(TheProPackage);
+			pSendData = new BYTE[dwSendLen];
+			TheProPackage *pPackage = (TheProPackage*)pSendData;
+			pPackage->flag = PACKAGE_ONESELF;
+			pPackage->nCmd = C2CCMD_REQ_LOGIN;
+			pPackage->nDataLen = 0;
+			pPackage->dwReserve = nRet;
+			OutputDebugString(_T("用户密码不对\n"));
+		}
+	}
+	else
+	{
+		dwSendLen = sizeof(TheProPackage);
+		pSendData = new BYTE[dwSendLen];
+		TheProPackage *pPackage = (TheProPackage*)pSendData;
+		pPackage->flag = PACKAGE_ONESELF;
+		pPackage->nCmd = C2CCMD_REQ_LOGIN;
+		pPackage->nDataLen = 0;
+		pPackage->dwReserve = USER_HAVE_LOGIN;
+		OutputDebugString(_T("用户已登录\n"));
+	}
+}
+
+void CMainProcess::Req_LogOut(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, OUT BYTE*& pSendData, OUT DWORD &dwSendLen)
+{
+
+}
+
+void CMainProcess::New_Department(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, OUT BYTE*& pSendData, OUT DWORD &dwSendLen)
+{
+	/*CMemFile mf;
+	//mf.Attach(thepackage.szBody, thepackage.nDataLen);//错误方式;
+	mf.Attach(const_cast<BYTE*>(pReceiveData)+sizeof(TheProPackage) - 2, thepackage.nDataLen);
+	CArchive ar(&mf, CArchive::load);
+	CAddDepartment tagAddDepartment;
+	tagAddDepartment.Serialize(ar);
+	ar.Close();
+	mf.Detach();
+
+	CString strSQL;
+	strSQL.Format(_T("INSERT INTO [DepartmentInfo](")
+		_T("[StudioID], [DepartmentName], [DepartmentNote]) values ('%s', '%s', '%s')"),
+		thepackage.szStudioId, tagAddDepartment.m_strDepartmentName, tagAddDepartment.m_strDepartmentNote);
+	BOOL bRet = g_pODBCPool->ExecuteSQL(strSQL);
+
+	// 返回信息;
+	dwSendLen = sizeof(TheProPackage);
+	pSendData = new BYTE[dwSendLen];
+	TheProPackage *pPackage = (TheProPackage*)pSendData;
+	pPackage->flag = PACKAGE_ONESELF;
+	pPackage->nCmd = thepackage.nCmd;
+	pPackage->nDataLen = 0;
+	pPackage->dwReserve = bRet;*/
+}
+
+void CMainProcess::Del_Department(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, OUT BYTE*& pSendData, OUT DWORD &dwSendLen)
+{
+	/*CMemFile mf;
+	//mf.Attach(thepackage.szBody, thepackage.nDataLen);//错误方式;
+	mf.Attach(const_cast<BYTE*>(pReceiveData)+sizeof(TheProPackage) - 2, thepackage.nDataLen);
+	CArchive ar(&mf, CArchive::load);
+	CAddDepartment tagAddDepartment;
+	tagAddDepartment.Serialize(ar);
+	ar.Close();
+	mf.Detach();
+
+	CString strSQL;
+	strSQL.Format(_T("DELETE FROM [DepartmentInfo] WHERE [StudioID] = '%s' and [DepartmentName] = '%s' "), thepackage.szStudioId, tagAddDepartment.m_strDepartmentName);
+	BOOL bRet = g_pODBCPool->ExecuteSQL(strSQL);
+
+	// 返回信息;
+	dwSendLen = sizeof(TheProPackage);
+	pSendData = new BYTE[dwSendLen];
+	TheProPackage *pPackage = (TheProPackage*)pSendData;
+	pPackage->flag = PACKAGE_ONESELF;
+	pPackage->nCmd = thepackage.nCmd;
+	pPackage->nDataLen = 0;
+	pPackage->dwReserve = bRet;*/
+}
+
+void CMainProcess::Mod_Department(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, OUT BYTE*& pSendData, OUT DWORD &dwSendLen)
+{
+
+}
+
+EnHandleResult CMainProcess::Ask_Department(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, OUT BYTE*& pSendData, OUT DWORD &dwSendLen)
+{
+	CObList tagDpmList;
+	INT nRet = 0;
+
+	CMemFile mf;
+	CArchive ar(&mf, CArchive::store);
+	tagDpmList.Serialize(ar);
+	ar.Close();
+
+	// 删除列表对象;
+	POSITION pos = tagDpmList.GetHeadPosition();
+	while (pos)
+	{
+		LPVOID *pdpmObj = NULL;
+		if (pdpmObj)
+			delete pdpmObj;
+	}
+	tagDpmList.RemoveAll();
+
+	BOOL bResult = FALSE;
+	__int64 nArchive = mf.GetLength();
+	if ((nArchive + sizeof(TheProPackage) - 2) > 0x3FFFFF)
+	{
+		__int64 nSubLen = nArchive;
+		BYTE *pMf = mf.Detach();
+		while (nSubLen > 0)
+		{
+			if (nSubLen - 0x3FFFFF + sizeof(TheProPackage) - 2 > 0)
+				dwSendLen = 0x3FFFFF;
+			else
+				dwSendLen = nSubLen + sizeof(TheProPackage) - 2;
+			pSendData = new BYTE[dwSendLen];
+			TheProPackage *pPackage = (TheProPackage*)pSendData;
+			pPackage->flag = PACKAGE_MULTIPLE;
+			pPackage->nCmd = thepackage.nCmd;
+			pPackage->nDataLen = nArchive;
+			pPackage->nSubDataLen = (nSubLen - 0x3FFFFF + sizeof(TheProPackage) - 2) > 0 ? (0x3FFFFF - sizeof(TheProPackage) + 2) : nSubLen;
+			pPackage->dwReserve = nRet;
+			memcpy(pPackage->byBody, pMf + nArchive - nSubLen, pPackage->nSubDataLen);
+			nSubLen -= (0x3FFFFF - sizeof(TheProPackage) + 2);
+
+			bResult = ::HP_Server_Send(m_spThis->m_pServer, dwConnID, pSendData, dwSendLen);
+			if (pSendData)
+				delete[]pSendData;
+			pSendData = NULL;
+
+			if (!bResult)
+			{
+				if (pMf)
+					delete pMf;
+				return HR_ERROR;
+			}
+		}
+
+		if (pMf)
+			delete pMf;
+
+		return HR_OK;
+	}
+	else
+	{// 单包;
+		dwSendLen = sizeof(TheProPackage) - 2 + nArchive;
+		pSendData = new BYTE[dwSendLen];
+		TheProPackage *pPackage = (TheProPackage*)pSendData;
+		pPackage->flag = PACKAGE_ONESELF;
+		pPackage->nCmd = thepackage.nCmd;
+		pPackage->nDataLen = nArchive;
+		pPackage->dwReserve = nRet;
+
+		BYTE *pMf = mf.Detach();
+		memcpy(pPackage->byBody, pMf, nArchive);
+
+		if (pMf)
+			delete pMf;
+	}
+
+	return HR_IGNORE;
+}

+ 39 - 4
source/hook/WxService/MainProcess.h

@@ -21,6 +21,9 @@
 
 #pragma once
 
+#include "HPSocket4C.h"
+#include "helper.h"
+
 class CMainProcess
 {
 	CMainProcess(void);
@@ -28,17 +31,34 @@ public:
 	// 单例对象模式;
 	static CMainProcess* GetInstance()
 	{
-		static CMainProcess* pInstance = NULL;
-		if ( pInstance == NULL )
+		if (m_spThis == NULL )
 		{
-			pInstance = new CMainProcess;
+			m_spThis = new CMainProcess;
 		}
 
-		return pInstance;
+		return m_spThis;
 	}
 
 	~CMainProcess(void);
 
+private:
+	static const USHORT PORT;
+	static const LPCTSTR ADDRESS;
+
+	EnAppState m_enState;
+	CString m_strAddress;
+
+	static CMainProcess* m_spThis;
+
+	HP_TcpPackServer m_pServer;
+	HP_TcpServerListener m_pListener;
+	static En_HP_HandleResult __stdcall OnPrepareListen(SOCKET soListen);
+	static En_HP_HandleResult __stdcall OnAccept(HP_CONNID dwConnID, SOCKET soClient);
+	static En_HP_HandleResult __stdcall OnSend(HP_CONNID dwConnID, const BYTE* pData, int iLength);
+	static En_HP_HandleResult __stdcall OnReceive(HP_CONNID dwConnID, const BYTE* pData, int iLength);
+	static En_HP_HandleResult __stdcall OnClose(HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode);
+	static En_HP_HandleResult __stdcall OnShutdown();
+
 protected:
 	// 线程控制句柄;
 	HANDLE  m_hEvent1;
@@ -60,6 +80,21 @@ public:
 	static DWORD WINAPI CheckSvcStatusThread(LPVOID lpVoid);
 	static DWORD WINAPI BackupDatabaseThread(LPVOID lpVoid);
 
+public:
+	// 启动/退出;
+	static BOOL Start();
+	static BOOL Stop();
+	static BOOL Disconnect(IN const DWORD& dwConnId);
+	// 登录登出;
+	static void Req_Login(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN msg_login &msg, OUT BYTE*& pSendData, OUT DWORD &dwSendLen);
+	static void Req_LogOut(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, OUT BYTE*& pSendData, OUT DWORD &dwSendLen);
+	// 部门;
+	static void New_Department(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, OUT BYTE*& pSendData, OUT DWORD &dwSendLen);
+	static void Del_Department(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, OUT BYTE*& pSendData, OUT DWORD &dwSendLen);
+	static void Mod_Department(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, OUT BYTE*& pSendData, OUT DWORD &dwSendLen);
+	static EnHandleResult Ask_Department(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, OUT BYTE*& pSendData, OUT DWORD &dwSendLen);
+
+
 };
 
 #endif

+ 6 - 7
source/hook/WxService/OnlineUser.cpp

@@ -10,25 +10,24 @@ COnlineUser::~COnlineUser(void)
 {
 }
 
-void COnlineUser::InsertOnlineUser(IN DWORD dwConnId, IN LPCTSTR lpStudioId, IN LPCTSTR lpAccount)
+void COnlineUser::InsertOnlineUser(IN DWORD dwConnId, IN LPCTSTR lpAccount)
 {
-	if ( IsAccountExist(lpStudioId, lpAccount) != -1 )
+	if ( IsAccountExist(lpAccount) != -1 )
 		return;
 
 	OnlineUser tagOnlineUser;
 	tagOnlineUser.m_dwConnID = dwConnId;
-	_stprintf_s(tagOnlineUser.m_szStudioId, _T("%s"), lpStudioId);
 	_stprintf_s(tagOnlineUser.m_szAccount, _T("%s"), lpAccount);
 	m_OnlineUser.push_back(tagOnlineUser);
 }
 
-DWORD COnlineUser::IsAccountExist(IN LPCTSTR lpStudioId, IN LPCTSTR lpAccount )
+DWORD COnlineUser::IsAccountExist(IN LPCTSTR lpAccount )
 {
 	BOOL bExist = FALSE;
 	vector<OnlineUser>::iterator it = m_OnlineUser.begin();
 	for ( ; it != m_OnlineUser.end(); it++ )
 	{
-		if ( _tcscmp( it->m_szStudioId, lpStudioId ) == 0 && _tcscmp(it->m_szAccount, lpAccount ) == 0 )
+		if ( _tcscmp(it->m_szAccount, lpAccount ) == 0 )
 		{
 			bExist = TRUE;
 			break;
@@ -38,13 +37,13 @@ DWORD COnlineUser::IsAccountExist(IN LPCTSTR lpStudioId, IN LPCTSTR lpAccount )
 	return bExist ? it->m_dwConnID : -1;
 }
 
-BOOL COnlineUser::IsAccountExist(IN LPCTSTR lpStudioId, IN LPCTSTR lpAccount, OUT DWORD& dwConnId)
+BOOL COnlineUser::IsAccountExist(IN LPCTSTR lpAccount, OUT DWORD& dwConnId)
 {
 	BOOL bExist = FALSE;
 	vector<OnlineUser>::iterator it = m_OnlineUser.begin();
 	for ( ; it != m_OnlineUser.end(); it++ )
 	{
-		if ( _tcscmp( it->m_szStudioId, lpStudioId ) == 0 && _tcscmp(it->m_szAccount, lpAccount ) == 0 )
+		if ( _tcscmp(it->m_szAccount, lpAccount ) == 0 )
 		{
 			dwConnId = it->m_dwConnID;
 			bExist = TRUE;

+ 4 - 6
source/hook/WxService/OnlineUser.h

@@ -26,14 +26,12 @@
 typedef struct __OnlineUser__
 {
 	DWORD	m_dwConnID;				// 客户端连接ID;
-	TCHAR	m_szStudioId[37];		// 影楼Guid;
-	TCHAR	m_szAccount[17];		// 账号;
+	TCHAR	m_szAccount[17];		// 账号(手机号码);
 	//TCHAR	m_szPassword[17];		// 密码;
 
 	__OnlineUser__()
 	{
 		m_dwConnID = -1;
-		memset(m_szStudioId, 0, sizeof(TCHAR)*37);
 		memset(m_szAccount, 0, sizeof(TCHAR)*17);
 		//memset(m_szPassword, 0, sizeof(TCHAR)*17);
 	}
@@ -52,9 +50,9 @@ public:
 		return pInstance;
 	}
 
-	void InsertOnlineUser(IN DWORD dwConnId, IN LPCTSTR lpStudioId, IN LPCTSTR lpAccount);
-	DWORD IsAccountExist(IN LPCTSTR lpStudioId, IN LPCTSTR lpAccount );
-	BOOL IsAccountExist(IN LPCTSTR lpStudioId, IN LPCTSTR lpAccount, OUT DWORD& dwConnId);
+	void InsertOnlineUser(IN DWORD dwConnId, IN LPCTSTR lpAccount);
+	DWORD IsAccountExist(IN LPCTSTR lpAccount );
+	BOOL IsAccountExist( IN LPCTSTR lpAccount, OUT DWORD& dwConnId);
 	BOOL IsConnIDExist(IN DWORD dwConnId);
 	void EraseOnlineUser(IN DWORD dwConnId);
 

+ 11 - 11
source/hook/WxService/ServerPtr.cpp

@@ -99,25 +99,25 @@ BOOL CServerPtr::Disconnect(IN const DWORD& dwConnId)
 	return TRUE;
 }
 
-En_HP_HandleResult CServerPtr::OnPrepareListen(SOCKET soListen)
+En_HP_HandleResult CServerPtr::OnPrepareListen(HP_Server pSender,SOCKET soListen)
 {
 	TCHAR szAddress[40];
 	int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
 	USHORT usPort;
 
-	::HP_Server_GetListenAddress(m_spThis->m_pServer, szAddress, &iAddressLen, &usPort);
+	::HP_Server_GetListenAddress(pSender, szAddress, &iAddressLen, &usPort);
 	::PostOnPrepareListen(szAddress, usPort);
 	return HR_OK;
 }
 
-En_HP_HandleResult CServerPtr::OnAccept(HP_CONNID dwConnID, SOCKET soClient)
+En_HP_HandleResult CServerPtr::OnAccept(HP_Server pSender, HP_CONNID dwConnID, SOCKET soClient)
 {
 	BOOL bPass = TRUE;
 	TCHAR szAddress[40];
 	int iAddressLen = sizeof(szAddress) / sizeof(TCHAR);
 	USHORT usPort;
 
-	::HP_Server_GetRemoteAddress(m_spThis->m_pServer, dwConnID, szAddress, &iAddressLen, &usPort);
+	::HP_Server_GetRemoteAddress(pSender, dwConnID, szAddress, &iAddressLen, &usPort);
 
 	if (!m_spThis->m_strAddress.IsEmpty())
 	{
@@ -132,14 +132,14 @@ En_HP_HandleResult CServerPtr::OnAccept(HP_CONNID dwConnID, SOCKET soClient)
 	return bPass ? HR_OK : HR_ERROR;
 }
 
-En_HP_HandleResult CServerPtr::OnSend(HP_CONNID dwConnID, const BYTE* pData, int iLength)
+En_HP_HandleResult CServerPtr::OnSend(HP_Server pSender, HP_CONNID dwConnID, const BYTE* pData, int iLength)
 {
 	TRACE(_T("发送数据给客户端:%d, %s, %d!\n"), dwConnID, pData, iLength);
 	//::PostOnSend(dwConnID, pData, iLength);
 	return HR_OK;
 }
 
-En_HP_HandleResult CServerPtr::OnReceive(HP_CONNID dwConnID, const BYTE* pData, int iLength)
+En_HP_HandleResult CServerPtr::OnReceive(HP_Server pSender, HP_CONNID dwConnID, const BYTE* pData, int iLength)
 {
 	TheProPackage thepackage;
 	memcpy(&thepackage, pData, sizeof(TheProPackage));
@@ -193,14 +193,14 @@ En_HP_HandleResult CServerPtr::OnReceive(HP_CONNID dwConnID, const BYTE* pData,
 		break;
 	}
 
-	BOOL bSendResult = ::HP_Server_Send(m_spThis->m_pServer, dwConnID, pSendData, dwSendLen);
+	BOOL bSendResult = ::HP_Server_Send(pSender, dwConnID, pSendData, dwSendLen);
 	if (pSendData)
 		delete[]pSendData;
 
 	return bSendResult ? HR_OK : HR_ERROR;
 }
 
-En_HP_HandleResult CServerPtr::OnClose(HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode)
+En_HP_HandleResult CServerPtr::OnClose(HP_Server pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode)
 {
 	// 移除登录的用户信息;
 	COnlineUser::GetInstance()->EraseOnlineUser(dwConnID);
@@ -210,7 +210,7 @@ En_HP_HandleResult CServerPtr::OnClose(HP_CONNID dwConnID, En_HP_SocketOperation
 	return HR_OK;
 }
 
-En_HP_HandleResult CServerPtr::OnShutdown()
+En_HP_HandleResult CServerPtr::OnShutdown(HP_Server pSender)
 {
 	::PostOnShutdown();
 
@@ -340,7 +340,7 @@ void CServerPtr::Mod_Department(IN HP_CONNID dwConnID, IN const BYTE* pReceiveDa
 EnHandleResult CServerPtr::Ask_Department(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, OUT BYTE*& pSendData, OUT DWORD &dwSendLen)
 {
 	CObList tagDpmList;
-	INT nRet = g_pODBCPool->QueryDepartmentInfo(thepackage.szStudioId, &tagDpmList);
+	INT nRet = 0;
 
 	CMemFile mf;
 	CArchive ar(&mf, CArchive::store);
@@ -351,7 +351,7 @@ EnHandleResult CServerPtr::Ask_Department(IN HP_CONNID dwConnID, IN const BYTE*
 	POSITION pos = tagDpmList.GetHeadPosition();
 	while (pos)
 	{
-		CDepartmentInfoObj *pdpmObj = (CDepartmentInfoObj*)tagDpmList.GetNext(pos);
+		LPVOID *pdpmObj = NULL;
 		if (pdpmObj)
 			delete pdpmObj;
 	}

+ 8 - 8
source/hook/WxService/ServerPtr.h

@@ -1,5 +1,5 @@
-#ifndef __SERVER_PTR_20160920__
-#define __SERVER_PTR_20160920__
+#ifndef __SERVER_PTR_20190920__
+#define __SERVER_PTR_20190920__
 
 #pragma once
 
@@ -25,12 +25,12 @@ public:
 public:
 	void SetAppState(EnAppState state);
 private:
-	static En_HP_HandleResult __stdcall OnPrepareListen(SOCKET soListen);
-	static En_HP_HandleResult __stdcall OnAccept(HP_CONNID dwConnID, SOCKET soClient);
-	static En_HP_HandleResult __stdcall OnSend(HP_CONNID dwConnID, const BYTE* pData, int iLength);
-	static En_HP_HandleResult __stdcall OnReceive(HP_CONNID dwConnID, const BYTE* pData, int iLength);
-	static En_HP_HandleResult __stdcall OnClose(HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode);
-	static En_HP_HandleResult __stdcall OnShutdown();
+	static En_HP_HandleResult __stdcall OnPrepareListen(HP_Server pSender, SOCKET soListen);
+	static En_HP_HandleResult __stdcall OnAccept(HP_Server pSender, HP_CONNID dwConnID, SOCKET soClient);
+	static En_HP_HandleResult __stdcall OnSend(HP_Server pSender, HP_CONNID dwConnID, const BYTE* pData, int iLength);
+	static En_HP_HandleResult __stdcall OnReceive(HP_Server pSender, HP_CONNID dwConnID, const BYTE* pData, int iLength);
+	static En_HP_HandleResult __stdcall OnClose(HP_Server pSender, HP_CONNID dwConnID, En_HP_SocketOperation enOperation, int iErrorCode);
+	static En_HP_HandleResult __stdcall OnShutdown(HP_Server pSender);
 private:
 	TPkgInfo* FindPkgInfo(HP_CONNID dwConnID);
 	void RemovePkgInfo(HP_CONNID dwConnID);

+ 29 - 33
source/hook/WxService/WxService.cpp

@@ -5,9 +5,8 @@
 #include "WxService.h"
 #include "MainProcess.h"
 
-#define _CRTDBG_MAP_ALLOC 
-#include<stdlib.h>
-#include<crtdbg.h>
+#include <iostream>
+#include <fstream>
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -37,36 +36,6 @@ void CALLBACK WorkStart()
 		}
 	}
 
-#ifdef _DEBUG
-	// 添加用户;
-	tb_customer customer;
-	customer.set_customer_phone(_T("15089231318"));
-	customer.set_customer_password(_T("15089231318"));
-	customer.set_customer_name(_T("jeff"));
-	customer.set_customer_gender(true);
-	customer.set_customer_gen_time(CWxAdoImpl::GetCurrentLocalTime().c_str());
-	g_pAdoPool->AddCustomer((LPVOID)&customer);
-
-	customer.Clear();
-	g_pAdoPool->QueryUserDetail(_T("15089231318"), (LPVOID)&customer);
-
-	// 添加回复类型;
-	tb_type type;
-	type.set_customer_id(customer.customer_id().c_str());
-	type.set_type_name(_T("电脑类"));
-	type.set_type_gen_time(CWxAdoImpl::GetCurrentLocalTime().c_str());
-	g_pAdoPool->AddType((LPVOID)&type);
-
-	// 添加回复详情;
-	tb_reply reply;
-	reply.set_type_id(type.type_id().c_str());
-	reply.set_reply_name(_T("电脑主板价格"));
-	reply.set_reply_content(_T("当前价格100元人民币"));
-	reply.set_reply_gen_time(CWxAdoImpl::GetCurrentLocalTime().c_str());
-	g_pAdoPool->AddReply((LPVOID)&reply);
-
-#endif
-
 	WinService::GetDebugPriv();
 	CMainProcess::GetInstance()->StartWork();
 }
@@ -87,6 +56,31 @@ void CALLBACK WorkEndof()
 
 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
 {
+#ifdef _DEBUG
+	msg_register msg;
+	msg.set_phone(_T("15089231318"));
+	msg.set_passwrod(_T("168"));
+	msg.set_gender(1);
+	msg.set_vcode(_T("5678"));
+	msg.set_name(_T("dfdfdfdf"));
+	//msg.set_len(msg.ByteSizeLong());
+	msg.set_len(msg.ByteSizeLong()+ msg.len());
+
+
+	long size = msg.ByteSizeLong();
+
+	BYTE szData[100];
+	if (!msg.SerializeToArray(szData, size))
+		OutputDebugString(_T("序列化失败\n"));
+
+	msg_register msg2;
+	if ( !msg2.ParseFromArray(szData, 20) )
+		OutputDebugString(_T("反序列化失败\n"));
+
+	if (!msg2.ParseFromArray(szData, 100))
+		OutputDebugString(_T("反序列化失败\n"));
+
+#endif
 	int nRetCode = 0;
 	_CrtSetBreakAlloc(165);
 	// 直接获得前景窗口的句柄;
@@ -118,6 +112,8 @@ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
 			return 0;
 		}
 
+		WinService::InitWinSock();
+
 #ifdef _DEBUG
 		WorkStart();
 		system("pause");

+ 10 - 6
source/hook/WxService/WxService.vcxproj

@@ -56,7 +56,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;HPSOCKET_STATIC_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <MinimalRebuild>true</MinimalRebuild>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -71,14 +71,14 @@
       <SubSystem>Console</SubSystem>
       <TargetMachine>MachineX86</TargetMachine>
       <AdditionalLibraryDirectories>..\lib;</AdditionalLibraryDirectories>
-      <AdditionalDependencies>libprotobufd.lib;HPSocket4C_UD.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>libprotobufd.lib;HPSocket4C_D.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <ClCompile>
       <Optimization>MaxSpeed</Optimization>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;HPSOCKET_STATIC_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <PrecompiledHeader>Use</PrecompiledHeader>
@@ -93,10 +93,11 @@
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <TargetMachine>MachineX86</TargetMachine>
       <AdditionalLibraryDirectories>..\lib;</AdditionalLibraryDirectories>
-      <AdditionalDependencies>libprotobuf.lib;HPSocket4C_U.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>libprotobuf.lib;HPSocket4C.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClCompile Include="..\hp-src\helper.cpp" />
     <ClCompile Include="..\pb\msg.pb.cc">
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
@@ -108,7 +109,6 @@
     <ClCompile Include="Global.cpp" />
     <ClCompile Include="MainProcess.cpp" />
     <ClCompile Include="OnlineUser.cpp" />
-    <ClCompile Include="ServerPtr.cpp" />
     <ClCompile Include="stdafx.cpp">
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
@@ -117,6 +117,11 @@
     <ClCompile Include="WxService.cpp" />
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="..\hp-src\GeneralHelper.h" />
+    <ClInclude Include="..\hp-src\helper.h" />
+    <ClInclude Include="..\hp-src\HPSocket4C.h" />
+    <ClInclude Include="..\hp-src\HPTypeDef.h" />
+    <ClInclude Include="..\hp-src\SocketInterface.h" />
     <ClInclude Include="..\pb\msg.pb.h" />
     <ClInclude Include="..\pb\table.pb.h" />
     <ClInclude Include="CritSection.h" />
@@ -125,7 +130,6 @@
     <ClInclude Include="MTVERIFY.H" />
     <ClInclude Include="OnlineUser.h" />
     <ClInclude Include="Resource.h" />
-    <ClInclude Include="ServerPtr.h" />
     <ClInclude Include="stdafx.h" />
     <ClInclude Include="targetver.h" />
     <ClInclude Include="WinService.h" />

+ 17 - 5
source/hook/WxService/WxService.vcxproj.filters

@@ -45,10 +45,10 @@
     <ClCompile Include="..\pb\table.pb.cc">
       <Filter>pb</Filter>
     </ClCompile>
-    <ClCompile Include="ServerPtr.cpp">
+    <ClCompile Include="OnlineUser.cpp">
       <Filter>network</Filter>
     </ClCompile>
-    <ClCompile Include="OnlineUser.cpp">
+    <ClCompile Include="..\hp-src\helper.cpp">
       <Filter>network</Filter>
     </ClCompile>
   </ItemGroup>
@@ -83,15 +83,27 @@
     <ClInclude Include="..\pb\table.pb.h">
       <Filter>pb</Filter>
     </ClInclude>
-    <ClInclude Include="ServerPtr.h">
-      <Filter>network</Filter>
-    </ClInclude>
     <ClInclude Include="CritSection.h">
       <Filter>network</Filter>
     </ClInclude>
     <ClInclude Include="OnlineUser.h">
       <Filter>network</Filter>
     </ClInclude>
+    <ClInclude Include="..\hp-src\GeneralHelper.h">
+      <Filter>network</Filter>
+    </ClInclude>
+    <ClInclude Include="..\hp-src\HPSocket4C.h">
+      <Filter>network</Filter>
+    </ClInclude>
+    <ClInclude Include="..\hp-src\SocketInterface.h">
+      <Filter>network</Filter>
+    </ClInclude>
+    <ClInclude Include="..\hp-src\HPTypeDef.h">
+      <Filter>network</Filter>
+    </ClInclude>
+    <ClInclude Include="..\hp-src\helper.h">
+      <Filter>network</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <None Include="IDI_MICON">

+ 0 - 4
source/hook/WxService/stdafx.h

@@ -50,7 +50,3 @@ extern IWxAdoInterface* g_pAdoPool;
 extern BOOL CreatePoolInstance();
 extern void FreelyfzodbcLibrary();
 // TODO: 在此处引用程序需要的其他头文件
-
-#include "GeneralHelper.h"
-#include "HPSocket4C.h"
-#include "helper.h"