Browse Source

将HPSocket库引用到WxSerivce中(代码有错:未配置好TCP服务端)

Jeff 6 years ago
parent
commit
230eb0feec

+ 84 - 0
source/hook/WxService/CritSection.h

@@ -0,0 +1,84 @@
+#ifndef __CRITSECTION_20160221__
+#define __CRITSECTION_20160221__
+
+// ÁÙ½çÖµ;
+class ThreadSection
+{
+public:
+	ThreadSection(){
+		HRESULT hr = Init();
+		(hr);
+	}
+
+	~ThreadSection(){
+		DeleteCriticalSection(&_CriticalSection);
+	}
+
+	bool Lock()
+	{
+		bool result = false;
+		__try
+		{
+			EnterCriticalSection(&_CriticalSection);
+			result = true;
+		}
+		__except (STATUS_NO_MEMORY == GetExceptionCode())
+		{
+		}
+		return result;
+	}
+
+	bool Unlock()
+	{
+		bool result = false;
+		__try
+		{
+			LeaveCriticalSection(&_CriticalSection);
+			result = true;
+		}
+		__except (STATUS_NO_MEMORY == GetExceptionCode())
+		{
+		}
+		return result;
+	}
+
+private:
+	HRESULT Init() throw()
+	{
+		HRESULT hRes = E_FAIL;
+		__try
+		{
+			InitializeCriticalSection(&_CriticalSection);
+			hRes = S_OK;
+		}
+		__except (STATUS_NO_MEMORY == GetExceptionCode())
+		{
+			hRes = E_OUTOFMEMORY;
+		}
+		return hRes;
+	}
+
+	ThreadSection(const ThreadSection & tSection);
+	ThreadSection &operator=(const ThreadSection & tSection);
+	CRITICAL_SECTION _CriticalSection;
+};
+
+
+class AutoThreadSection
+{
+public:
+	AutoThreadSection(IN ThreadSection* pSection){
+		_pSection = pSection;
+		_pSection->Lock();
+	}
+
+	~AutoThreadSection(){
+		_pSection->Unlock();
+	}
+private:
+	AutoThreadSection(const AutoThreadSection & tSection);
+	AutoThreadSection &operator=(const AutoThreadSection & tSection);
+	ThreadSection * _pSection;
+};
+
+#endif //__CRITSECTION_20160221__

+ 2 - 1
source/hook/WxService/Global.cpp

@@ -30,6 +30,7 @@ namespace Global
 	TCHAR g_szDBType[MAX_PATH];					// 数据库类型:mysql、mssql、psql、sqlite3
 	DWORD g_dwDBPoolMaxCount = 1;						// 数据库连接池最大对象数;
 	DWORD g_dwDBPoolDef = 1;							// 数据库连接池默认对象数;
+	DWORD g_dwSvrPort = 5566;					// 服务器通信端口;
 
 	//////////////////////////////////////////////////////////////////////////
 	static const int BEGIN_YEAR = 1901;
@@ -185,7 +186,7 @@ namespace Global
 		GetPrivateProfileString(_T("DatabaseInfo"), _T("dbType"), _T("mssql"), g_szDBType, MAX_PATH, szIniPath);
 		g_dwDBPoolMaxCount = GetPrivateProfileInt(_T("DatabaseInfo"), _T("dbpoolMaxObj"), 1, szIniPath);
 		g_dwDBPoolDef = GetPrivateProfileInt(_T("DatabaseInfo"), _T("dbpoolDef"), 1, szIniPath);
-		//g_dwSvrPort = GetPrivateProfileInt(_T("NetWorkInfo"), _T("TCPChatPort"), 0, szIniPath);
+		g_dwSvrPort = GetPrivateProfileInt(_T("NetWorkInfo"), _T("TCPChatPort"), 5566, szIniPath);
 		if (g_dwDBServerPort != 0)
 		{
 			if (_tcscmp(g_szDBAccount, _T("")) == 0)

+ 1 - 0
source/hook/WxService/Global.h

@@ -59,6 +59,7 @@ namespace Global
 	extern TCHAR g_szDBType[MAX_PATH];				// 数据库类型:mysql、mssql、psql、sqlite3
 	extern DWORD g_dwDBPoolMaxCount;				// 数据库连接池最大对象数;
 	extern DWORD g_dwDBPoolDef;						// 数据库连接池默认对象数;
+	extern DWORD g_dwSvrPort;						// 服务器通信端口;
 
 	//////////////////////////////////////////////////////////////////////////
 	// 全局函数;

+ 89 - 0
source/hook/WxService/OnlineUser.cpp

@@ -0,0 +1,89 @@
+#include "StdAfx.h"
+#include "OnlineUser.h"
+
+
+COnlineUser::COnlineUser(void)
+{
+}
+
+COnlineUser::~COnlineUser(void)
+{
+}
+
+void COnlineUser::InsertOnlineUser(IN DWORD dwConnId, IN LPCTSTR lpStudioId, IN LPCTSTR lpAccount)
+{
+	if ( IsAccountExist(lpStudioId, 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 )
+{
+	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 )
+		{
+			bExist = TRUE;
+			break;
+		}
+	}
+
+	return bExist ? it->m_dwConnID : -1;
+}
+
+BOOL COnlineUser::IsAccountExist(IN LPCTSTR lpStudioId, 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 )
+		{
+			dwConnId = it->m_dwConnID;
+			bExist = TRUE;
+			break;
+		}
+	}
+
+	return bExist;
+}
+
+BOOL COnlineUser::IsConnIDExist(IN DWORD dwConnId)
+{
+	BOOL bExist = FALSE;
+	vector<OnlineUser>::iterator it = m_OnlineUser.begin();
+	for ( ; it != m_OnlineUser.end(); it++ )
+	{
+		if ( dwConnId == it->m_dwConnID )
+		{
+			bExist = TRUE;
+			break;
+		}
+	}
+
+	return bExist;
+}
+
+void COnlineUser::EraseOnlineUser(IN DWORD dwConnId)
+{
+	vector<OnlineUser>::iterator it = m_OnlineUser.begin();
+	for ( ; it != m_OnlineUser.end();  )
+	{
+		if ( dwConnId == it->m_dwConnID )
+		{
+			it = m_OnlineUser.erase(it);
+			break;
+		}
+		else
+		{
+			it++;
+		}
+	}
+}

+ 66 - 0
source/hook/WxService/OnlineUser.h

@@ -0,0 +1,66 @@
+/************************************************************************/
+/*  Copyright (C), 2016-2020, [IT], 保留所有权利;
+/*  模 块 名:;
+/*  描    述:;
+/*
+/*  版    本:[V];	
+/*  作    者:[IT];
+/*  日    期:[9/22/2016];
+/*
+/*
+/*  注    意:;
+/*
+/*  修改记录:[IT];
+/*  修改日期:;
+/*  修改版本:;
+/*  修改内容:;
+/************************************************************************/
+
+#ifndef __ONLINE_USER__
+#define __ONLINE_USER__
+
+#pragma once
+
+#include <vector>
+
+typedef struct __OnlineUser__
+{
+	DWORD	m_dwConnID;				// 客户端连接ID;
+	TCHAR	m_szStudioId[37];		// 影楼Guid;
+	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);
+	}
+}OnlineUser, *pOnlineUser;
+
+class COnlineUser
+{
+	COnlineUser(void);
+public:
+	~COnlineUser(void);
+	static COnlineUser* GetInstance()
+	{
+		static COnlineUser* pInstance = NULL;
+		if ( pInstance == NULL )
+			pInstance = new COnlineUser;
+		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);
+	BOOL IsConnIDExist(IN DWORD dwConnId);
+	void EraseOnlineUser(IN DWORD dwConnId);
+
+private:
+	vector<OnlineUser> m_OnlineUser;
+
+};
+
+#endif 

+ 418 - 0
source/hook/WxService/ServerPtr.cpp

@@ -0,0 +1,418 @@
+#include "StdAfx.h"
+#include "ServerPtr.h"
+#include "OnlineUser.h"
+#include <time.h>
+#include "CritSection.h"
+#include "msg.pb.h"
+#include "table.pb.h"
+
+
+time_t g_systm;
+// 服务通信对象;
+CServerPtr* CServerPtr::m_spThis = NULL;
+
+CServerPtr::CServerPtr(void)
+{
+	// 创建监听器对象
+	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);
+}
+
+CServerPtr::~CServerPtr(void)
+{
+	// 销毁 Socket 对象
+	::Destroy_HP_TcpPackServer(m_spThis->m_pServer);
+	// 销毁监听器对象
+	::Destroy_HP_TcpServerListener(m_pListener);
+}
+
+void CServerPtr::Release()
+{
+	if (m_spThis)
+		delete m_spThis;
+	m_spThis = NULL;
+}
+
+BOOL CServerPtr::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 CServerPtr::Stop()
+{
+	if (::HP_Server_Stop(m_spThis->m_pServer))
+	{
+		OutputDebugString(_T("停止服务器成功!\n"));
+		::LogServerStop();
+		//SetAppState(ST_STOPPED);
+	}
+	else
+	{
+		ASSERT(FALSE);
+	}
+
+	return TRUE;
+}
+
+BOOL CServerPtr::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;
+}
+
+En_HP_HandleResult CServerPtr::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 CServerPtr::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 CServerPtr::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 CServerPtr::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, thepackage, 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 CServerPtr::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 CServerPtr::OnShutdown()
+{
+	::PostOnShutdown();
+
+	return HR_OK;
+}
+
+//////////////////////////////////////////////////////////////////////////
+void CServerPtr::Req_Login(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, OUT BYTE*& pSendData, OUT DWORD &dwSendLen)
+{
+	if (COnlineUser::GetInstance()->IsAccountExist(thepackage.szStudioId, thepackage.szAccount) == -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, thepackage.szStudioId, thepackage.szAccount);
+		}
+		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 CServerPtr::Req_LogOut(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, OUT BYTE*& pSendData, OUT DWORD &dwSendLen)
+{
+
+}
+
+void CServerPtr::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 CServerPtr::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 CServerPtr::Mod_Department(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, OUT BYTE*& pSendData, OUT DWORD &dwSendLen)
+{
+
+}
+
+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);
+
+	CMemFile mf;
+	CArchive ar(&mf, CArchive::store);
+	tagDpmList.Serialize(ar);
+	ar.Close();
+
+	// 删除列表对象;
+	POSITION pos = tagDpmList.GetHeadPosition();
+	while (pos)
+	{
+		CDepartmentInfoObj *pdpmObj = (CDepartmentInfoObj*)tagDpmList.GetNext(pos);
+		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;
+}

+ 70 - 0
source/hook/WxService/ServerPtr.h

@@ -0,0 +1,70 @@
+#ifndef __SERVER_PTR_20160920__
+#define __SERVER_PTR_20160920__
+
+#pragma once
+
+#include "HPSocket4C.h"
+#include "helper.h"
+
+class CServerPtr
+{
+	CServerPtr(void);
+public:
+	~CServerPtr(void);
+
+	static CServerPtr* GetInstance()
+	{
+		if ( m_spThis == NULL )
+		{
+			m_spThis = new CServerPtr();
+		}
+
+		return m_spThis;
+	}
+
+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();
+private:
+	TPkgInfo* FindPkgInfo(HP_CONNID dwConnID);
+	void RemovePkgInfo(HP_CONNID dwConnID);
+
+private:
+	static const USHORT PORT;
+	static const LPCTSTR ADDRESS;
+
+
+	EnAppState m_enState;
+	CString m_strAddress;
+
+	static CServerPtr* m_spThis;
+
+	HP_TcpPackServer m_pServer;
+	HP_TcpServerListener m_pListener;
+
+public:
+	static BOOL Start();
+	static BOOL Stop();
+	static void Release();
+	static BOOL Disconnect(IN const DWORD& dwConnId);
+
+public:
+	// µÇ¼µÇ³ö;
+	static void Req_Login(IN HP_CONNID dwConnID, IN const BYTE* pReceiveData, IN INT nReceiveLength, IN TheProPackage &thepackage, 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

+ 2 - 2
source/hook/WxService/ServiceInfo.ini

@@ -19,9 +19,9 @@ dbpoolDef=2
 [NetWorkInfo]
 ;若服务程序处于多网卡主机上,使用0为默认网卡
 NCIP=0
-;影楼服务程序TCP命令端口;
+;服务程序TCP命令端口;
 TCPChatPort=5555
-;影楼服务程序文件传输端口;
+;服务程序文件传输端口;
 TCPFilePort=64320
 
 

+ 9 - 4
source/hook/WxService/WxService.vcxproj

@@ -63,7 +63,7 @@
       <PrecompiledHeader>Use</PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
       <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
-      <AdditionalIncludeDirectories>..\Include;..\pb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\Include;..\pb;..\hp-src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <DisableSpecificWarnings>4018;4065;4146;4244;4251;4267;4305;4307;4309;4334;4355;4506;4800;4996</DisableSpecificWarnings>
     </ClCompile>
     <Link>
@@ -71,7 +71,7 @@
       <SubSystem>Console</SubSystem>
       <TargetMachine>MachineX86</TargetMachine>
       <AdditionalLibraryDirectories>..\lib;</AdditionalLibraryDirectories>
-      <AdditionalDependencies>libprotobufd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>libprotobufd.lib;HPSocket4C_UD.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -84,7 +84,7 @@
       <PrecompiledHeader>Use</PrecompiledHeader>
       <WarningLevel>Level3</WarningLevel>
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>..\Include</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\Include;..\pb;..\hp-src;</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
@@ -93,7 +93,7 @@
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <TargetMachine>MachineX86</TargetMachine>
       <AdditionalLibraryDirectories>..\lib;</AdditionalLibraryDirectories>
-      <AdditionalDependencies>libprotobuf.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>libprotobuf.lib;HPSocket4C_U.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -107,6 +107,8 @@
     </ClCompile>
     <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,10 +119,13 @@
   <ItemGroup>
     <ClInclude Include="..\pb\msg.pb.h" />
     <ClInclude Include="..\pb\table.pb.h" />
+    <ClInclude Include="CritSection.h" />
     <ClInclude Include="Global.h" />
     <ClInclude Include="MainProcess.h" />
     <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" />

+ 18 - 0
source/hook/WxService/WxService.vcxproj.filters

@@ -19,6 +19,9 @@
     <Filter Include="pb">
       <UniqueIdentifier>{816d65ff-5c92-43f4-842c-c24d2c4e2aa9}</UniqueIdentifier>
     </Filter>
+    <Filter Include="network">
+      <UniqueIdentifier>{bf6cc1b2-fc2e-4ade-911d-3b63066d596f}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="stdafx.cpp">
@@ -42,6 +45,12 @@
     <ClCompile Include="..\pb\table.pb.cc">
       <Filter>pb</Filter>
     </ClCompile>
+    <ClCompile Include="ServerPtr.cpp">
+      <Filter>network</Filter>
+    </ClCompile>
+    <ClCompile Include="OnlineUser.cpp">
+      <Filter>network</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="Resource.h">
@@ -74,6 +83,15 @@
     <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>
   </ItemGroup>
   <ItemGroup>
     <None Include="IDI_MICON">

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

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