Explorar el Código

!2 上传RVCComm修改

pcacc hace 5 años
padre
commit
89c3e78967

+ 4 - 0
Common/AutoArray.h

@@ -1,4 +1,8 @@
 #pragma once
+#ifndef WIN32
+#define _ASSERT assert
+#endif
+#
 template<class T> class CAutoArray
 {
 	struct CRefNode

+ 5 - 0
Common/AutoLock.h

@@ -1,5 +1,10 @@
+
 #ifndef _AUTOLOCK_H
 #define _AUTOLOCK_H
+#include <winpr/synch.h>
+#include <winpr/thread.h>
+#include <winpr/sysinfo.h>
+
 
 class CLockObject
 {

+ 2 - 1
Common/RVCComm.h

@@ -13,7 +13,8 @@
 
 
 
-#include <windows.h>
+#include <winpr/windows.h>
+#include <winpr/interlocked.h>
 #include <string>
 #include <vector>
 using namespace std;

+ 2 - 0
Common/SimpleString.h

@@ -1,7 +1,9 @@
 #pragma once
 
 #include <stdexcept>
+#include <winpr/string.h>
 #include "AutoArray.h"
+#include <winpr/tchar.h>
 
 template<class T> class CSimpleStringT;
 typedef CSimpleStringT<char> CSimpleStringA;

+ 1 - 0
Common/SmartPointer.h

@@ -1,5 +1,6 @@
 #pragma once
 #include <assert.h>
+#include <winpr/interlocked.h>
 
 template<class T> class CSmartPointer
 {

+ 7 - 7
Common/precompile.h

@@ -11,23 +11,23 @@
 #endif 
 #endif
 
-#include <WinSock2.h>
+#include <winpr/winsock.h>
 #ifndef WIN32_LEAN_AND_MEAN
 #define WIN32_LEAN_AND_MEAN
 #endif //WIN32_LEAN_AND_MEAN
 #include <Mmsystem.h>
-#include <process.h>
-#include <crtdbg.h>
-#include <locale.h>
-#include <time.h>
-#endif // _WIN32
-
 #include <stdlib.h>
 #include <stdio.h>
 #include <assert.h>
+#include <process.h>
 #include <errno.h>
 #include <time.h>
 #include <string.h>
+#include <crtdbg.h>
+#include <locale.h>
+#include <time.h>
+
+#endif // _WIN32
 
 #ifdef SPABASE_LINKED_AS_STATIC_LIBRARY
 #define SPBASE_API

+ 2 - 5
Common/stdafx.h

@@ -15,17 +15,14 @@
 #endif 
 #endif
 
-#include <WinSock2.h>
+#include <winpr/winsock.h>
 #ifndef WIN32_LEAN_AND_MEAN
 #define WIN32_LEAN_AND_MEAN
 #endif
-#include <Mmsystem.h>
-#include <windows.h>
+#include <winpr/windows.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <assert.h>
-#include <crtdbg.h>
-#include <process.h>
 
 #pragma warning( disable: 4127 )
 

+ 20 - 13
RVCComm/CMakeLists.txt

@@ -7,19 +7,26 @@ endif(MSVC)
 
 message(STATUS "PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
 include_directories(${PROJECT_SOURCE_DIR}/third_party/openssl-1.1.1d/include/openssl)
+include_directories(.)
 
-SET(${MODULE_PREFIX}_SRCS 
-	ClientComm.cpp 
-	ClientComm.h 
-	Package.cpp 
-	Package.h 
-	RVCComm.cpp 
-	StdAfx.cpp 
-	StdAfx.h 
-	XUnzip.cpp 
-	XUnzip.h 
-	XZip.cpp 
-	XZip.h)
+file(GLOB ${MODULE_PREFIX}_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cpp" "*.h" "*.c")
+# remove the no use file at all platform so far
+list(REMOVE_ITEM ${MODULE_PREFIX}_SRCS 
+	ClientBase.h
+	ClientBase.cpp
+	ServerComm.h
+	ServerComm.cpp
+    )
+
+
+if (NOT WIN32)
+list(REMOVE_ITEM ${MODULE_PREFIX}_SRCS 
+	XZip.h
+	XZip.cpp
+	XUnzip.h
+	XUnzip.cpp
+    )
+endif()
 
 if (WIN32)
 	  set (RC_VERSION_MAJOR ${RVC_VERSION_MAJOR})
@@ -33,7 +40,7 @@ if (WIN32)
 endif()
 
 add_library(${MODULE_NAME} SHARED ${${MODULE_PREFIX}_SRCS})
-target_link_libraries(${MODULE_NAME} ssl)
+target_link_libraries(${MODULE_NAME} ssl winpr)
 target_compile_definitions(${MODULE_NAME} PRIVATE "-DRVCCOMM_EXPORTS=1")
 
 if (BUILD_TESTING)

+ 0 - 125
RVCComm/ClientBase.cpp

@@ -1,125 +0,0 @@
-// ClientBase.cpp: implementation of the CClientBase class.
-//
-//////////////////////////////////////////////////////////////////////
-
-#include "stdafx.h"
-#include "../../Framework/Common/ErrorCode.h"
-#include "ClientBase.h"
-#include "ClientComm.h"
-
-//////////////////////////////////////////////////////////////////////
-// Construction/Destruction
-//////////////////////////////////////////////////////////////////////
-
-CClientBase::CClientBase()
-{
-	m_pClientCommFunc = new CClientComm(this);
-}
-
-CClientBase::~CClientBase()
-{
-	delete m_pClientCommFunc;
-	m_pClientCommFunc = NULL;
-}
-
-bool CClientBase::Connect(const char *pServerAddr, int nPort, int nOption)
-{
-	return m_pClientCommFunc->Connect(pServerAddr, nPort, nOption);
-}
-
-void CClientBase::Close()
-{
-	m_pClientCommFunc->Close();
-}
-
-string CClientBase::SendPackage(const IPackage *pSendPkg)
-{
-	return m_pClientCommFunc->SendPackage(pSendPkg);
-}
-
-IPackage* CClientBase::ReceivePackage(int nWaitSecond)
-{
-	return m_pClientCommFunc->ReceivePackage(nWaitSecond);
-}
-
-
-IPackage* CClientBase::CreateNewPackage(const char *pServiceCode)
-{
-	return m_pClientCommFunc->CreateNewPackage(pServiceCode);
-}
-
-IPackage* CClientBase::CreateReplyPackage(IPackage *pRecvPkg)
-{
-	return m_pClientCommFunc->CreateReplyPackage(pRecvPkg);
-}
-
-// 默认错误处理
-void CClientBase::OnError(DWORD dwSysCode, DWORD dwUserCode, const char *pErrMsg)
-{
-	printf("[ERROR] [%d] [%d] %s\n", dwSysCode, dwUserCode, pErrMsg);
-}
-
-// 生成鉴权请求结构,需调用令牌管理实体取得令牌及加密后的设备信息
-bool CClientBase::OnAuthRequest(CConnAuthReq *pReq)
-{
-	printf("OnAuthRequest....\n");
-
-	// 取得令牌
-	int nLen = sizeof(pReq->m_arrVerifyToken);
-	if (!m_tokenEntity.GetToken(pReq->m_arrVerifyToken, &nLen))
-		return false;
-	
-	// 生成设备信息
-	CVerifyInfo info;
-	memset(&info, 0, sizeof(info));
-
-	strcpy(info.m_arrTerminalNo, "075512345678");
-	
-	info.m_arrIP[0] = 192;
-	info.m_arrIP[1] = 168;
-	info.m_arrIP[2] = 0;
-	info.m_arrIP[3] = 2;
-
-	strcpy(info.m_arrServiceType, "CMBRVC");
-
-	// 使用临时私钥加密
-	nLen = sizeof(pReq->m_arrVerifyInfo);
-	
-	if (!m_tokenEntity.EncWithClientPriKey((BYTE*)&info, sizeof(info), pReq->m_arrVerifyInfo, &nLen))
-		return false;
-
-	return true;
-}
-
-bool CClientBase::OnSessionKeyRet(CConnAuthRet *pRet, BYTE *pBuf, int *pBufLen)
-{
-	printf("OnSessionKeyRet....\n");
-
-	if (*pBufLen < 16)
-		return false;
-
-	if (!m_tokenEntity.DecWithClientPriKey(pRet->m_arrEncSessionKey, sizeof(pRet->m_arrEncSessionKey), pBuf, pBufLen))
-	{
-		OnError(Error_Unexpect, 0,  "decrypt session key fail");
-		return false;
-	}
-
-	return true;
-}
-
-bool CClientBase::OnGetSharedSK(char *pTerminalNo, int *pTerminalNoLen, BYTE *pBuf, int *pBufLen)
-{
-	printf("OnGetSharedSK...\n");
-
-	// 终端号
-	strcpy(pTerminalNo, "075512345678");
-	*pTerminalNoLen = 12;
-
-	// 从令牌管理实体中取出共享会话密钥,并返回
-	return m_tokenEntity.GetSharedSessionKey(pBuf, pBufLen);
-}
-
-void CClientBase::OnAuthPass()
-{
-	printf("OnAuthPass...\n");
-}

+ 0 - 49
RVCComm/ClientBase.h

@@ -1,49 +0,0 @@
-// ClientBase.h: interface for the CClientBase class.
-//
-//////////////////////////////////////////////////////////////////////
-
-#if !defined(AFX_CLIENTBASE_H__27D13395_DDF5_47DB_98DD_3482E578FDA0__INCLUDED_)
-#define AFX_CLIENTBASE_H__27D13395_DDF5_47DB_98DD_3482E578FDA0__INCLUDED_
-
-#if _MSC_VER > 1000
-#pragma once
-#endif // _MSC_VER > 1000
-
-#include "RVCComm.h"
-#include "TestTokenEntity.h"
-
-// 客户端实体封闭类,解决底层通信封装问题,供其它实体继承
-class CClientBase : public CSecureClientBase  
-{
-public:
-	CClientBase();
-	virtual ~CClientBase();
-
-	bool Connect(const char *pServerAddr, int nPort, int nOption);
-	void Close();
-	string SendPackage(const IPackage *pSendPkg);
-	IPackage* ReceivePackage(int nWaitSecond);
-
-	IPackage* CreateNewPackage(const char *pServiceCode);
-	IPackage* CreateReplyPackage(IPackage *pRecvPkg);
-
-protected:
-	// 派生类需重载
-	virtual void OnAuthPass();
-	virtual void OnReceivePackage(IPackage *pRecvPkg) =0;
-	virtual void OnClose() =0;
-	virtual void OnError(DWORD dwSysCode, DWORD dwUserCode, const char *pErrMsg);
-
-private:
-	bool OnAuthRequest(CConnAuthReq *pReq);
-	bool OnSessionKeyRet(CConnAuthRet *pRet, BYTE *pBuf, int *pBufLen);	
-	bool OnGetSharedSK(char *pTerminalNo, int *pTerminalNoLen, BYTE *pBuf, int *pBufLen);
-	
-protected:
-	CTestTokenEntity m_tokenEntity;
-
-private:
-	IClientCommFunc *m_pClientCommFunc; 
-};
-
-#endif // !defined(AFX_CLIENTBASE_H__27D13395_DDF5_47DB_98DD_3482E578FDA0__INCLUDED_)

+ 11 - 8
RVCComm/ClientComm.cpp

@@ -1,11 +1,9 @@
 // ClientComm.cpp: implementation of the CClientComm class.
 //
 //////////////////////////////////////////////////////////////////////
-
-#include "stdafx.h"
 #include "ErrorCode.h"
 
-#include <WTypes.h>
+#include <winpr/wtypes.h>
 
 #ifdef _INCLUDE_SPBASE_
 #include "SpBase.h"
@@ -16,9 +14,10 @@
 #include "ClientComm.h"
 #include "Package.h"
 
-#include <process.h>
 #include <assert.h>
 #include <string.h>
+#include <winpr/crt.h>
+#include <winpr/thread.h>
 
 
 DWORD CClientComm::s_dwSessionID =0;
@@ -127,8 +126,12 @@ bool CClientComm::Connect(const char *pServerAddr, int nPort, int nOption)
 	m_bNeedAuth = (nOption != 3);
 
 	// 创建接收线程,支持异步模式
-	UINT nThreadID;
-	m_hWorkThread = (HANDLE)_beginthreadex(NULL, 0, &RecvThreadFunc, this, 0, &nThreadID);
+	DWORD nThreadID;
+#ifdef WIN32
+	m_hWorkThread = (HANDLE)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&RecvThreadFunc, this, 0, &nThreadID);
+#else
+	m_hWorkThread = 0;
+#endif
 	if (m_hWorkThread == 0)
 	{
 		Close();
@@ -251,7 +254,7 @@ CSmartPointer<IPackage> CClientComm::CreateReplyPackage(const CSmartPointer<IPac
 }
 
 // socket接收线程
-UINT CClientComm::RecvThreadFunc(void *pArg)
+DWORD CClientComm::RecvThreadFunc(void *pArg)
 {
 	CClientComm *pThis = (CClientComm*) pArg;
 	assert(pThis != NULL);
@@ -265,7 +268,7 @@ UINT CClientComm::RecvThreadFunc(void *pArg)
 	pThis->m_nHasRecvLen = 0;
 	
 	// 退出线程
-	_endthreadex(0);
+	//_endthreadex(0);
 	return 0;
 }
 

+ 3 - 3
RVCComm/ClientComm.h

@@ -10,9 +10,9 @@
 #endif // _MSC_VER > 1000
 
 // 调整了位置,解决出现编译错误 error C2011: “sockaddr”:“struct”类型重定义 2020年1月21日
-#include <winsock2.h>
+#include <winpr/winsock.h>
 #include "RVCComm.h"
-#include "autolock.h"
+#include "AutoLock.h"
 
 class CClientComm : public IClientCommFunc  
 {
@@ -35,7 +35,7 @@ public:
 	//void SetSessionKey(BYTE arrSessionKey[16]);
 
 private:
-	static UINT _stdcall RecvThreadFunc(void *pArg);
+	static DWORD RecvThreadFunc(void *pArg);
 	void RecvThreadProcess();
 	//void ReceivePackageData();
 	void SetSocketOption();

+ 18 - 3
RVCComm/Package.cpp

@@ -1,14 +1,19 @@
 // CommPackageImp.cpp: implementation of the CCommPackage class.
 //
 //////////////////////////////////////////////////////////////////////
-
-#include "stdafx.h"
 #include "Package.h"
 #include <time.h>
 #include <assert.h>
+#include <memory>
+#include <winpr/crt.h>
 
+#ifdef WIN32
 #include "xzip.h"
 #include "xunzip.h"
+//µ±Ç°Î´Ê¹ÓÃÊý¾Ý¼ÓÃÜ
+#endif // WIN32
+
+
 #include "openssl/md5.h"
 //#include "openssl/des.h"
 
@@ -504,6 +509,7 @@ bool CCommPackage::GenerateSendData(BYTE *pData, int *pLen)
 
 bool CCommPackage::ZipData(BYTE *pSourceData, int nSourceLen, BYTE *pDestBuf, int *pDestLen)
 {
+#ifdef WIN32
 	HZIP hz = CreateZip(0, nSourceLen, ZIP_MEMORY);
 
 	if (hz == 0)
@@ -515,7 +521,7 @@ bool CCommPackage::ZipData(BYTE *pSourceData, int nSourceLen, BYTE *pDestBuf, in
 		return false;
 	}
 
-	void *pZipBuf = NULL;
+	void* pZipBuf = NULL;
 	DWORD nZipLen = 0;
 	if (ZipGetMemory(hz, &pZipBuf, &nZipLen) != ZR_OK)
 	{
@@ -537,10 +543,16 @@ bool CCommPackage::ZipData(BYTE *pSourceData, int nSourceLen, BYTE *pDestBuf, in
 
 	CloseZip(hz);
 	return true;
+#else
+	return true;
+#endif // WIN32
+
+	
 }
 
 bool CCommPackage::UnzipData(BYTE *pSourceData, int nSourceLen, BYTE *pDestBuf, int *pDestLen)
 {
+#ifdef WIN32
 	HZIP hz = OpenZip(pSourceData, nSourceLen, ZIP_MEMORY);
 
 	if (hz == 0)
@@ -567,6 +579,9 @@ bool CCommPackage::UnzipData(BYTE *pSourceData, int nSourceLen, BYTE *pDestBuf,
 
 	CloseZip(hz);
 	return true;
+#else
+	return true;
+#endif
 }
 
 bool CCommPackage::EncryptData(BYTE *pSourceData, int nSourceLen, BYTE *pDestBuf, int *pDestLen)

+ 1 - 1
RVCComm/Package.h

@@ -10,8 +10,8 @@
 #endif // _MSC_VER > 1000
 
 #include "RVCComm.h"
+#include <winpr/collections.h>
 #include <vector>
-
 #include "des.h"
 
 #pragma warning(disable:4200)

+ 3 - 5
RVCComm/RVCComm.cpp

@@ -1,19 +1,16 @@
 // RVCComm.cpp : Defines the entry point for the DLL application.
 //
-
-#include "stdafx.h"
 #include "RVCComm.h"
 #include "ClientComm.h"
 //#include "ServerComm.h"
-#include <winsock2.h>
 #include <assert.h>
 #include "rsa.h"
 #include "md5.h"
 //#include <applink.c>
 #include "pem.h"
 #include <err.h>
+#include <winpr/locale.h>
 
-#pragma comment(lib, "Ws2_32.lib")
 
 CSecureClientBase::CSecureClientBase()
 {
@@ -35,7 +32,7 @@ void UninitSocket()
 {
 	WSACleanup();
 }
-
+#ifdef _WIN32
 BOOL APIENTRY DllMain( HANDLE hModule, 
                        DWORD  ul_reason_for_call, 
                        LPVOID lpReserved
@@ -66,6 +63,7 @@ BOOL APIENTRY DllMain( HANDLE hModule,
 
     return bRet ? TRUE : FALSE;
 }
+#endif
 
 
 // 客户端通过此函数获得通讯类实例

+ 0 - 797
RVCComm/ServerComm.cpp

@@ -1,797 +0,0 @@
-// ServerComm.cpp: implementation of the CServerComm class.
-//
-//////////////////////////////////////////////////////////////////////
-
-#include "stdafx.h"
-#include "ServerComm.h"
-#include "Package.h"
-
-#include <assert.h>
-#include <process.h>
-#include "openssl/rand.h"
-
-//////////////////////////////////////////////////////////////////////
-// Construction/Destruction
-//////////////////////////////////////////////////////////////////////
-#define SafeCallbackOnError(nConnectionID, nErrorCode) \
-	try \
-	{ \
-		string errMsg = GetSysErrorMsg(nErrorCode); \
-		char buf[32]; \
-		memset(buf, 0, sizeof(buf)); \
-		_snprintf(buf, 31, "%d", nErrorCode); \
-		m_pCallback->OnError(nConnectionID, buf, errMsg.c_str()); \
-	} \
-	catch(...) \
-	{}
-
-#define SafeCallbackOnError2(nConnectionID, pErrCode, pErrMsg) \
-	try \
-	{ \
-		m_pCallback->OnError(nConnectionID, pErrCode, pErrMsg); \
-	} \
-	catch(...) \
-	{}
-
-
-#define SocketErrorHandle(bHandleClose) \
-	{ \
-		int nErrorCode = WSAGetLastError(); \
-		if (nErrorCode != WSA_IO_PENDING) \
-		{ \
-			SafeCallbackOnError(pContext->m_nConnectionID, nErrorCode); \
-			if (nErrorCode == 10054 && bHandleClose) \
-				HandleClose(pContext); \
-		} \
-	}
-
-CServerComm::CServerComm(CServerCallback *pCallback)
-{
-	assert(pCallback != NULL);
-	m_pCallback = pCallback;
-	m_nThreadCount = 0;
-	m_pWorkThreads = NULL;
-	m_hListenSocket = INVALID_SOCKET;
-	m_hAcceptThread = NULL;
-	m_hExitEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-	m_hIOCompletionPort = NULL;
-	m_nLastConnectionID =0;
-
-	m_bHasInit = false;
-}
-
-CServerComm::~CServerComm()
-{
-	if (m_bHasInit)
-		EndService();
-
-	delete m_pCallback;
-	m_pCallback = NULL;
-}
-
-bool CServerComm::BeginService(int nListenPort)
-{	
-	if (m_bHasInit)
-		return true;
-
-
-	m_hIOCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
-
-	if (m_hIOCompletionPort == NULL)
-	{
-		SafeCallbackOnError(0, GetLastError());
-		return false;
-	}
-	
-	UINT nThreadID(0);
-
-	//Overlapped I/O follows the model established in Windows and can be performed only on 
-	//sockets created through the WSASocket function 
-	m_hListenSocket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
-
-	if (m_hListenSocket == INVALID_SOCKET)
-		goto error;
-
-	sockaddr_in addr;
-	ZeroMemory((char *)&addr, sizeof(addr));
-	addr.sin_family = AF_INET;
-	addr.sin_addr.s_addr = htonl(INADDR_ANY); 
-	addr.sin_port = htons(nListenPort);    
-
-	if (SOCKET_ERROR == bind(m_hListenSocket, (struct sockaddr *) &addr, sizeof(addr))) 
-		goto error;
-
-	m_hAcceptEvent = WSACreateEvent();
-	if (WSA_INVALID_EVENT == m_hAcceptEvent)
-		goto error;
-
-	// select aceept event only
-	if (SOCKET_ERROR == WSAEventSelect(m_hListenSocket, m_hAcceptEvent, FD_ACCEPT))
-	{
-		WSACloseEvent(m_hAcceptEvent);
-		m_hAcceptEvent = NULL;
-		goto error;
-	}
-
-	if (SOCKET_ERROR == listen(m_hListenSocket,SOMAXCONN))
-		goto error;
-
-	// create accept thread
-	m_hAcceptThread = (HANDLE)_beginthreadex(NULL, 0, &AcceptThreadFunc, this, 0, &nThreadID);
-
-	// create work thread
-	m_nThreadCount = 2 * GetProcessorNum();
-	m_pWorkThreads = new HANDLE[m_nThreadCount];
-
-	int i;
-	for(i=0; i<m_nThreadCount; i++)
-	{
-		m_pWorkThreads[i] = (HANDLE)_beginthreadex(NULL, 0, &WorkThreadFunc, this, 0, &nThreadID);
-	}
-
-	return true;
-
-error:
-	SafeCallbackOnError(0, GetLastError());	
-	
-	if (m_hIOCompletionPort != NULL)
-	{
-		CloseHandle(m_hIOCompletionPort);
-		m_hIOCompletionPort = NULL;
-	}
-
-	if (m_hListenSocket != INVALID_SOCKET)
-	{
-		closesocket(m_hListenSocket);
-		m_hListenSocket = INVALID_SOCKET;
-	}
-
-	return false;
-}
-
-
-UINT CServerComm::AcceptThreadFunc(void *pArg)
-{
-	CServerComm *pThis = (CServerComm*) pArg;
-	assert(pThis != NULL);
-		
-	//Accept thread will be around to look for accept event, until a Shutdown event is not Signaled.
-	while(WAIT_OBJECT_0 != WaitForSingleObject(pThis->m_hExitEvent, 0))
-	{
-		DWORD dwResult = WSAWaitForMultipleEvents(1, &pThis->m_hAcceptEvent, FALSE, 100, FALSE);
-
-		if (dwResult != WSA_WAIT_FAILED && dwResult != WSA_WAIT_TIMEOUT)
-		{
-			WSANETWORKEVENTS events;
-			dwResult = WSAEnumNetworkEvents(pThis->m_hListenSocket, pThis->m_hAcceptEvent, &events);
-
-			if ((dwResult != SOCKET_ERROR) && (events.lNetworkEvents & FD_ACCEPT) && (0 == events.iErrorCode[FD_ACCEPT_BIT]))
-			{
-				// accept socket
-				pThis->AcceptConnection();
-			}
-		}
-	}
-
-	// 退出线程
-	_endthreadex(0);
-
-	return 0;
-}
-
-
-void CServerComm::AcceptConnection()
-{
-	sockaddr_in clientAddr;
-	int nAddrLen = sizeof(clientAddr);
-
-	//Accept remote connection attempt from the client
-	SOCKET hWorkSocket = accept(m_hListenSocket, (sockaddr*)&clientAddr, &nAddrLen);
-
-	if (INVALID_SOCKET == hWorkSocket)
-	{
-		SafeCallbackOnError(0, GetLastError());
-		return;
-	}
-
-	m_nLastConnectionID++;
-	
-	//Create a new ClientContext for this newly accepted client
-	CConnectionContext   *pContext  = new CConnectionContext;
-
-	pContext->m_hSocket = hWorkSocket;
-	pContext->m_nConnectionID = m_nLastConnectionID;
-
-	// associate socket with io completion port
-	if (CreateIoCompletionPort((HANDLE)hWorkSocket, m_hIOCompletionPort, (DWORD)pContext, 0) == NULL)
-	{
-		delete pContext;
-		return;
-	}
-
-	//Store this object
-	{
-		CAutoLock lock(&m_LockObject, 1000);
-		m_CnnContextMap[m_nLastConnectionID] = pContext;
-	}
-
-	// invoke accept callback
-	try
-	{
-		m_pCallback->OnAccept(pContext->m_nConnectionID, inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));
-	}
-	catch(...){}
-
-	//Once the data is successfully received, we will print it.
-	WSABUF *pwbuf = pContext->GetRecvWSABuf();
-
-	//Get data.
-	DWORD dwFlags = 0;
-	DWORD dwBytes = 0;
-
-	//Post initial Recv
-	//This is a right place to post a initial Recv
-	//Posting a initial Recv in WorkerThread will create scalability issues.
-	int nBytesRecv = WSARecv(pContext->m_hSocket, pwbuf, 1, &dwBytes, &dwFlags, &pContext->m_olRecv, NULL);
-
-	if (SOCKET_ERROR == nBytesRecv)
-	{
-		SocketErrorHandle(true);
-	}
-}
-
-UINT CServerComm::WorkThreadFunc(void *pArg)
-{
-	CServerComm *pThis = (CServerComm*) pArg;
-
-	while(WAIT_OBJECT_0 != WaitForSingleObject(pThis->m_hExitEvent, 0))
-	{
-		if (!pThis->WorkThreadProcess())
-			break;
-	}
-
-	// 退出线程
-	_endthreadex(0);
-
-	return 0;
-}
-
-void CServerComm::HandleClose(CConnectionContext *pContext)
-{
-	// connection close
-	try
-	{
-		m_pCallback->OnClose(pContext->m_nConnectionID);
-	}
-	catch(...){}
-
-	int nConnectionID = pContext->m_nConnectionID;
-
-	CAutoLock lock(&m_LockObject);			
-	std::map<DWORD, CConnectionContext*>::iterator it = m_CnnContextMap.find(nConnectionID);
-	if (it != m_CnnContextMap.end())
-		m_CnnContextMap.erase(it);
-
-	delete pContext;
-}
-
-
-// 返回参数表示是否退出工作线程
-bool CServerComm::WorkThreadProcess()
-{
-	RVCOVERLAPPED *pOverlapped = NULL;
-	CConnectionContext *pContext = NULL;
-	DWORD dwBytesTransfered = 0;
-
-
-	BOOL bRet = GetQueuedCompletionStatus(m_hIOCompletionPort,&dwBytesTransfered, 
-		(LPDWORD)&pContext, (LPOVERLAPPED *)&pOverlapped, INFINITE);
-
-	// should exit now
-	if (pContext == NULL)
-		return false;
-
-	if ((FALSE == bRet) || ((TRUE == bRet) && (0 == dwBytesTransfered)))
-	{		
-		HandleClose(pContext);
-		return true;
-	}
-
-	assert(pOverlapped != NULL);
-	if (pOverlapped->IsSendOp())
-	{
-		assert(pOverlapped == &pContext->m_olSend);
-
-		WSABUF *pBUF = NULL;
-		{
-			CAutoLock lock(&m_LockObject);
-			pContext->AddSendLength(dwBytesTransfered);
-			pBUF = pContext->GetSendWSABuf();
-		}
-
-		// 继续发送
-		if (pBUF != NULL)
-		{
-			DWORD dwSendLen(0);
-			int nRet = WSASend(pContext->m_hSocket, pBUF, 1, &dwSendLen, 0, &pContext->m_olSend, NULL);
-
-			if (SOCKET_ERROR == nRet)
-			{
-				SocketErrorHandle(true);
-			}
-		}
-		else
-		{
-			// 发送完成,修改标记
-			CAutoLock lock(&m_LockObject);
-			pContext->m_bSending = false;
-		}
-	}
-	else
-	{		
-		assert(pOverlapped == &pContext->m_olRecv);
-
-		int nPackageLen =0;
-		CCommPackage *ppkg = NULL;
-
-		// 同时只有一个线程处理接收回调,无需同步
-		pContext->m_nHasRecvLen += dwBytesTransfered;
-
-		// 检查包头是否完整
-		if (pContext->m_nHasRecvLen < sizeof(CPackageHeader))
-			goto receive;
-
-		// 提取整包长度
-		nPackageLen = GetPackageLenFromRecvBuf(pContext);
-		
-		// 重新分配接收缓冲区
-		if (nPackageLen > pContext->m_nRecvBufLen)
-		{
-			pContext->PrepareRecvBuf(nPackageLen);
-			goto receive;
-		}
-
-		if (pContext->m_nHasRecvLen < nPackageLen)
-			goto receive;
-
-		// 解析整包长度
-		ppkg = new CCommPackage(pContext->m_bHasAuthPass ? pContext->m_arrSessionKey : NULL, NULL);
-
-		if (ppkg->ParseRecvData((BYTE*)pContext->m_pRecvBuf, &nPackageLen))
-		{
-			// 从缓冲区删除完整包数据
-			pContext->RemovePackageData(nPackageLen);
-
-			if (!pContext->m_bHasAuthPass)
-			{
-				if (strcmp(ppkg->GetServiceCode().c_str(), "__AUTH__") ==0)
-				{
-					HandleAuthReqPackage(pContext, ppkg);
-					goto receive;
-				}
-				else if (strcmp(ppkg->GetServiceCode().c_str(), "_SHAKE_") ==0)
-				{
-					HandleShakeReqPackage(pContext, ppkg);
-					goto receive;
-				}
-			}
-
-			// 回调
-			try
-			{
-				m_pCallback->OnReceive(pContext->m_nConnectionID, ppkg);
-			}
-			catch(...){}
-		}
-		else	
-		{
-			// 解析失败
-			delete ppkg;
-
-			try
-			{
-				m_pCallback->OnError(pContext->m_nConnectionID, 0, "接收报文解析失败");
-			}
-			catch(...){}
-		}
-		
-receive:
-		// 继续接收	
-		WSABUF *pwbuf = pContext->GetRecvWSABuf();	
-		DWORD dwFlags = 0;
-		DWORD dwBytes = 0;
-
-		int nRet = WSARecv(pContext->m_hSocket, pwbuf, 1, &dwBytes, &dwFlags, &pContext->m_olRecv, NULL);
-
-		if (SOCKET_ERROR == nRet)
-		{
-			SocketErrorHandle(true);
-		}
-	}
-	
-	return true;
-}
-
-void CServerComm::HandleAuthReqPackage(CConnectionContext *pContext, IPackage *pReqPkg)
-{
-	bool bRet = false;
-	int nArrayNum =0;
-
-	IPackage *preplyPkg = CreateReplyPackage(pReqPkg);
-
-	int nBufLen = pReqPkg->GetStructLen("AUTH_REQ");
-	if (nBufLen != sizeof(CConnAuthReq))
-	{
-		char buf[64];
-		sprintf(buf, "鉴权请求结构[AUTH_REQ]长度有误: %d", nBufLen);
-
-		SafeCallbackOnError2(pContext->m_nConnectionID, "AUTH101", buf);
-		preplyPkg->SetErrMsg("AUTH101", buf);
-		
-		delete pReqPkg;
-		goto reply;
-	}
-
-	CConnAuthReq authReq;
-	memset(&authReq, 0, sizeof(authReq));
-	
-	bRet = pReqPkg->GetStructData("AUTH_REQ", (BYTE*)&authReq, &nBufLen, &nArrayNum);
-	delete pReqPkg;
-
-	if (!bRet)
-	{
-		SafeCallbackOnError2(pContext->m_nConnectionID, "AUTH102", "取鉴权请求结构[AUTHREQ]数据失败");
-		preplyPkg->SetErrMsg("AUTH102", "取鉴权请求结构[AUTHREQ]数据失败");
-		goto reply;
-	}
-	
-	
-	// 验证客户端Token及签名信息
-	bRet = VerifyAuthReqInfo(pContext, &authReq);
-	if (!bRet)
-	{
-		SafeCallbackOnError2(pContext->m_nConnectionID, "AUTH103", "验证客户端Token及签名失败");
-		preplyPkg->SetErrMsg("AUTH103", "验证客户端Token及签名失败");
-		goto reply;
-	}
-	else
-	{
-		// 生成临时会话密钥,并加密
-		CConnAuthRet authRet;
-		memset(&authRet, 0, sizeof(authRet));
-
-		if (!GenerateSessionKey(pContext, &authReq, &authRet))
-		{
-			SafeCallbackOnError2(pContext->m_nConnectionID, "AUTH104", "生成临时会话密钥失败");
-			preplyPkg->SetErrMsg("AUTH104", "生成临时会话密钥失败");
-			goto reply;
-		}
-		else
-		{
-			//pContext->m_bHasAuthPass = true;	// 由GenerateSessionKey设置
-			preplyPkg->AddStruct("AUTH_RET", false, false, (BYTE*)&authRet, sizeof(authRet));
-			goto reply;						
-		}
-	}
-
-reply:
-	Send(pContext->m_nConnectionID, preplyPkg);
-	delete preplyPkg;
-}
-
-void CServerComm::HandleShakeReqPackage(CConnectionContext *pContext, IPackage *pReqPkg)
-{
-	bool bRet = false;
-	int nArrayNum =0;
-	std::map<DWORD, CSessionItem*>::iterator it = m_CachedSessionKeys.end();
-	CSessionItem *pItem = NULL;
-	
-	IPackage *preplyPkg = CreateReplyPackage(pReqPkg);
-
-	int nBufLen = pReqPkg->GetStructLen("SHAKEREQ");
-	if (nBufLen != sizeof(CSessionShakeReq))
-	{
-		char buf[64];
-		sprintf(buf, "握手请求结构[SHAKEREQ]长度有误: %d", nBufLen);
-
-		SafeCallbackOnError2(pContext->m_nConnectionID, "SHAKE101", buf);
-		preplyPkg->SetErrMsg("SHAKE101", buf);
-		
-		delete pReqPkg;
-		goto reply;
-	}
-
-	CSessionShakeReq shakeReq;
-	memset(&shakeReq, 0, sizeof(shakeReq));
-	
-	bRet = pReqPkg->GetStructData("SHAKEREQ", (BYTE*)&shakeReq, &nBufLen, &nArrayNum);
-	delete pReqPkg;
-
-	if (!bRet)
-	{
-		SafeCallbackOnError2(pContext->m_nConnectionID, "SHAKE102", "取握手请求结构[SHAKEREQ]数据失败");
-		preplyPkg->SetErrMsg("SHAKE102", "取握手请求结构[SHAKEREQ]数据失败");
-		goto reply;
-	}
-		
-	// 验证TerminalNo及SessionID
-	{
-		CAutoLock lock(&m_LockObject);			
-		it = m_CachedSessionKeys.find(shakeReq.m_dwSessionID);
-	}
-
-	if (it == m_CachedSessionKeys.end())
-	{
-		char buf[64];
-		sprintf(buf, "找不到对应的SessionID: [%d]", shakeReq.m_dwSessionID);
-
-		SafeCallbackOnError2(pContext->m_nConnectionID, "SHAKE103", buf);
-		preplyPkg->SetErrMsg("SHAKE103", buf);
-		goto reply;
-	}
-
-	// 比较TokenHash是否一致
-	pItem = (CSessionItem*)(*it).second;
-	if (pItem->m_dwTokenHash != shakeReq.m_dwTokenHash)
-	{
-		char buf[64];
-		sprintf(buf, "令牌哈希值不符,握手失败");
-
-		SafeCallbackOnError2(pContext->m_nConnectionID, "SHAKE104", buf);
-		preplyPkg->SetErrMsg("SHAKE104", buf);
-		goto reply;
-	}
-
-	// 找到对应会话密钥,直接使用
-	memcpy(pContext->m_arrSessionKey, pItem->m_arrSessionKey, 16);
-	pContext->m_bHasAuthPass = true;
-
-reply:
-	Send(pContext->m_nConnectionID, preplyPkg);
-	delete preplyPkg;
-}
-
-int CServerComm::GetPackageLenFromRecvBuf(CConnectionContext *pContext)
-{
-	if (pContext->m_pRecvBuf == NULL || pContext->m_nRecvBufLen < sizeof(CPackageHeader) || pContext->m_nHasRecvLen < sizeof(CPackageHeader))
-		return 0;
-
-	CPackageHeader *pHead = (CPackageHeader*) pContext->m_pRecvBuf;
-	return pHead->m_nPackageLen;	
-}
-
-void CServerComm::EndService()
-{
-	if (!m_bHasInit)
-		return;
-
-	SetEvent(m_hExitEvent);
-	
-	for (int i = 0; i < m_nThreadCount; i++)
-	{
-		//Help threads get out of blocking - GetQueuedCompletionStatus()
-		PostQueuedCompletionStatus(m_hIOCompletionPort, 0, (DWORD) NULL, NULL);
-	}
-
-	WaitForSingleObject(m_hAcceptThread, INFINITE);
-	WaitForMultipleObjects(m_nThreadCount, m_pWorkThreads, TRUE, INFINITE);
-
-	std::map<DWORD, CConnectionContext*>::iterator it;
-	for(it = m_CnnContextMap.begin(); it != m_CnnContextMap.end(); it++)
-	{
-		delete (*it).second;
-	}
-	m_CnnContextMap.clear();
-
-	for (i = 0; i < m_nThreadCount; i++)
-	{
-		CloseHandle(m_pWorkThreads[i]);
-	}
-
-	delete[] m_pWorkThreads;
-	m_pWorkThreads = NULL;
-	
-	WSACloseEvent(m_hAcceptEvent);
-	m_hAcceptEvent = NULL;
-	CloseHandle(m_hAcceptThread);
-	m_hAcceptThread = NULL;
-
-	CloseHandle(m_hExitEvent);	
-	m_hExitEvent = NULL;
-
-	closesocket(m_hListenSocket);
-	m_hListenSocket = INVALID_SOCKET;
-
-	CloseHandle(m_hIOCompletionPort);
-	m_hIOCompletionPort = NULL;
-
-	m_bHasInit = false;
-}
-
-const string CServerComm::Send(int nConnectionID, const IPackage *pSendPkg)
-{
-	CCommPackage *pkg = (CCommPackage*) pSendPkg;
-	assert(pkg != NULL);
-
-	int nBufLen = pkg->GetPackageLen();
-	BYTE *pBuf = new BYTE[nBufLen];
-	memset(pBuf, 0, nBufLen);
-	pkg->GenerateSendData(pBuf, &nBufLen);
-
-	std::map<DWORD, CConnectionContext*>::iterator it;
-	{
-		CAutoLock lock(&m_LockObject, 1000);
-		it = m_CnnContextMap.find(nConnectionID);
-		assert(it != m_CnnContextMap.end());
-	}
-	
-	if (it == m_CnnContextMap.end())
-	{
-		try
-		{
-			m_pCallback->OnError(nConnectionID, 0, "连接标识无效");
-		}
-		catch(...){}
-
-		delete[] pBuf;
-		return "";
-	}
-
-	CConnectionContext *pContext = (*it).second;
-	{
-		CAutoLock lock(&m_LockObject);
-		pContext->AddSendBuf((char*)pBuf, nBufLen);
-	}
-
-	// 发送操作不能并发
-	if (pContext->m_bSending)
-		return pkg->GetPackageReqID();
-
-	{
-		CAutoLock lock(&m_LockObject);
-		
-		// 再次检查
-		if (pContext->m_bSending)
-			return pkg->GetPackageReqID();
-
-		pContext->m_bSending = true;
-	}
-
-	// 开始发送
-	WSABUF *pBUF = pContext->GetSendWSABuf();
-
-	DWORD dwSendLen(0);
-	int nRet = WSASend(pContext->m_hSocket, pBUF, 1, &dwSendLen, 0, &pContext->m_olSend, NULL);
-
-	if (SOCKET_ERROR == nRet)
-	{
-		// 避免并发,关闭处理全部移到工作线程中
-		SocketErrorHandle(false);
-	}
-
-	return pkg->GetPackageReqID();
-}
-
-IPackage* CServerComm::CreateSendPackage(int nConnectionID, const char *pServiceCode)
-{
-	// get sessionkey from connectionid
-	BYTE *pSessionKey = NULL;
-
-	std::map<DWORD, CConnectionContext*>::iterator it;
-	{
-		CAutoLock lock(&m_LockObject, 1000);
-		it = m_CnnContextMap.find(nConnectionID);
-		assert(it != m_CnnContextMap.end());
-	}
-
-	if (it != m_CnnContextMap.end() && (*it).second->m_bHasAuthPass)
-		pSessionKey = (*it).second->m_arrSessionKey;
-
-	return new CCommPackage(pSessionKey, pServiceCode);
-}
-
-IPackage* CServerComm::CreateReplyPackage(IPackage *pRecvPkg)
-{
-	return new CCommPackage((CCommPackage*)pRecvPkg);
-}
-
-int CServerComm::GetProcessorNum()
-{
-	static int nProcessors = 0;
-
-	if (0 == nProcessors)
-	{
-		SYSTEM_INFO si;
-		GetSystemInfo(&si);
-		nProcessors = si.dwNumberOfProcessors;
-	}
-
-	return nProcessors;
-}
-
-// 验证令牌有效性,提取客户端公钥,解密设备信息,验证客户端是否合法,并保存客户端公钥到上下文m_TempPubKey中
-bool CServerComm::VerifyAuthReqInfo(CConnectionContext *pContext, CConnAuthReq *pReq)
-{
-	// 用服务器公钥解密令牌
-	BYTE *pSource = pReq->m_arrVerifyToken;
-	
-	BYTE buf[256] = {0};
-	int nBufLen = 256;
-
-	if (!DecWithServerPubKey(pSource, 256, buf, &nBufLen))
-		return false;
-
-	assert(nBufLen == sizeof(CTokenInfo));
-	CTokenInfo *pToken = (CTokenInfo*) buf;
-	
-	// 计算Hash,并比较
-	BYTE md5[16];
-	MD5Hash(buf, sizeof(CTokenInfo) - 16, md5);
-
-	if (memcmp(pToken->m_arrHash, md5, 16) != 0)
-		return false;
-
-	// 使用客户端公钥解密设备信息
-	BYTE buf2[128] = {0};
-	nBufLen = 128;
-	if (!DecWithRsaPubKey(pReq->m_arrVerifyInfo, 128, buf2, &nBufLen, pToken->m_arrTempPubKey, 140))
-		return false;
-
-	if (nBufLen != sizeof(CVerifyInfo))
-		return false;
-
-	// 比较设备信息与令牌中信息是否一致
-	CVerifyInfo *pDevice = (CVerifyInfo*)buf2;
-	if (memcmp(pDevice->m_arrTerminalNo, pToken->m_arrTerminalNo, sizeof(pDevice->m_arrTerminalNo)) != 0)
-		return false;
-
-	if (memcmp(pDevice->m_arrIP, pToken->m_arrIP, sizeof(pDevice->m_arrIP)) != 0)
-		return false;
-
-	// 校验通过,保存客户端公钥到上下文
-	CAutoLock lock(&m_LockObject);
-	memcpy(pContext->m_arrTempPubKey, pToken->m_arrTempPubKey, 140);
-	
-	return true;
-}
-
-// 生成临时会话密钥,保存到上下文中,并使用客户端公钥加密后放入返回结构中
-bool CServerComm::GenerateSessionKey(CConnectionContext *pContext, CConnAuthReq *pReq, CConnAuthRet *pRet)
-{
-	// 使用随机数生成器生成会话密钥
-	BYTE buf[16];
-	memset(buf, 0 ,sizeof(buf));
-
-	int nRet = RAND_bytes(buf, 16);
-	if (nRet <0)
-		return false;
-
-	// 使用m_TempPubKey加密buf到pRet中
-	int nBufLen = 128;
-	if (!EncWithRsaPubKey(buf, 16, pRet->m_arrEncSessionKey, &nBufLen, pContext->m_arrTempPubKey, 140))
-		return false;
-
-	// 生成SessionID并保存
-	BYTE md5[16];
-	memset(md5, 0, 16);
-	MD5Hash(buf, 16, md5);
-	DWORD dwSessionID = ((DWORD)md5[0]) << 24 | ((DWORD)md5[1]) << 16 | ((DWORD)md5[2]) << 8 | ((DWORD)md5[3]);
-
-	// 生成TokenHash并保存
-	memset(md5, 0, 16);
-	MD5Hash(pReq->m_arrVerifyToken, sizeof(pReq->m_arrVerifyToken), md5);
-	DWORD dwTokenHash = ((DWORD)md5[0]) << 24 | ((DWORD)md5[1]) << 16 | ((DWORD)md5[2]) << 8 | ((DWORD)md5[3]);
-
-	CSessionItem *pItem = new CSessionItem();
-	pItem->m_dwTokenHash = dwTokenHash;
-	memcpy(pItem->m_arrSessionKey, buf, 16);
-
-	CAutoLock lock(&m_LockObject);
-	m_CachedSessionKeys[dwSessionID] = pItem;
-
-	// 保存会话密钥
-	memcpy(pContext->m_arrSessionKey, buf, 16);
-	pContext->m_bHasAuthPass = true;
-	
-	return true;
-}

+ 0 - 273
RVCComm/ServerComm.h

@@ -1,273 +0,0 @@
-// ServerComm.h: interface for the CServerComm class.
-//
-//////////////////////////////////////////////////////////////////////
-
-#if !defined(AFX_SERVERCOMM_H__FBCF4C33_4278_47B7_8EAB_6CC3C0D452B2__INCLUDED_)
-#define AFX_SERVERCOMM_H__FBCF4C33_4278_47B7_8EAB_6CC3C0D452B2__INCLUDED_
-
-#if _MSC_VER > 1000
-#pragma once
-#endif // _MSC_VER > 1000
-
-#pragma warning(disable:4786)
-
-#include "RVCComm.h"
-#include "autolock.h"
-
-#include <winsock2.h>
-#include <map>
-using namespace std;
-
-#define OP_SEND 1
-#define OP_RECV 2
-
-struct RVCOVERLAPPED  : WSAOVERLAPPED  
-{
-	int m_nOpCode;
-
-	bool IsSendOp()
-	{
-		return m_nOpCode == OP_SEND;
-	}
-};
-
-// 连接上下文对象,操作时需要保证互斥
-class CConnectionContext
-{
-public:
-	CConnectionContext()
-	{
-		memset(this, 0, sizeof(CConnectionContext));
-
-		m_olSend.m_nOpCode = OP_SEND;
-		m_olRecv.m_nOpCode = OP_RECV;
-		m_bSending = false;
-
-		m_bHasAuthPass = false;
-		memset(m_arrSessionKey, 0 ,16);
-	}
-
-	~CConnectionContext()
-	{
-		//Wait for the pending operations to complete
-		/*
-		while (!HasOverlappedIoCompleted(&m_olRecv)) 
-		{
-			Sleep(0);
-		}*/
-
-		closesocket(m_hSocket);
-		m_hSocket = INVALID_SOCKET;
-
-		//Cleanup
-		if (m_pSendBuf != NULL)
-		{
-			delete[] m_pSendBuf;
-			m_pSendBuf = NULL;
-		}
-
-		if (m_pRecvBuf != NULL)
-		{
-			delete[] m_pRecvBuf;
-			m_pRecvBuf = NULL;
-		}
-
-
-		if (m_SendBufs.size() >0)
-		{
-			std::vector<WSABUF*>::iterator it;
-
-			for(it = m_SendBufs.begin(); it!=m_SendBufs.end(); it++)
-			{
-				WSABUF *pwbuf = (*it);
-				delete[] pwbuf->buf;
-				delete pwbuf;
-			}
-
-			m_SendBufs.clear();
-		}
-	}
-
-	// 准备接收缓冲区,并保留上次接收数据
-	void PrepareRecvBuf(int nBufLen)
-	{
-		if (nBufLen <=0)
-			nBufLen = 8096;
-
-		// 改成1024倍数
-		if (nBufLen % 1024 != 0)
-			nBufLen = (nBufLen / 1024 + 1) * 1024;
-
-		if (m_nRecvBufLen >= nBufLen)
-			return;
-
-		char *pNewBuf = new char[nBufLen];
-		memset(pNewBuf, 0, nBufLen);
-
-		if (m_pRecvBuf != NULL && m_nHasRecvLen >0)
-			memcpy(pNewBuf, m_pRecvBuf, m_nHasRecvLen);
-
-		if (m_pRecvBuf != NULL)
-			delete[] m_pRecvBuf;
-
-		m_pRecvBuf = pNewBuf;
-		m_nRecvBufLen = nBufLen;
-	}
-
-	// 从缓冲区删除完整包数据
-	void RemovePackageData(int nPackageLen)
-	{
-		if (m_nHasRecvLen > nPackageLen)
-			memmove(m_pRecvBuf, m_pRecvBuf + nPackageLen, m_nHasRecvLen - nPackageLen);
-		
-		m_nHasRecvLen -= nPackageLen;
-	}
-
-	WSABUF* GetRecvWSABuf()
-	{
-		if (m_nRecvBufLen <=0)
-			PrepareRecvBuf(0);
-
-		m_WSARecvBuf.buf = m_pRecvBuf + m_nHasRecvLen;
-		m_WSARecvBuf.len = m_nRecvBufLen - m_nHasRecvLen;
-
-		return &m_WSARecvBuf;
-	}
-
-	WSABUF* GetSendWSABuf()
-	{
-		if (m_pSendBuf != NULL)
-		{
-			m_WSASendBuf.buf = m_pSendBuf + m_nHasSendLen;
-			m_WSASendBuf.len = m_nSendBufLen - m_nHasSendLen;
-
-			return &m_WSASendBuf;
-		}
-
-		return NULL;
-	}
-
-	void AddSendLength(int nLen)
-	{
-		m_nHasSendLen += nLen;
-
-		if (m_nHasSendLen < m_nSendBufLen)
-			return;
-
-		// 已发送完,重置发送变量
-		memset(&m_WSASendBuf, 0, sizeof(m_WSASendBuf));
-
-		m_nHasSendLen = 0;
-		m_nSendBufLen = 0;
-
-		delete[] m_pSendBuf;
-		m_pSendBuf = NULL;
-
-		if (m_SendBufs.size() <= 0)
-			return;
-
-		// 提取下一个发送包
-		WSABUF *pBUF = m_SendBufs.back();
-		m_SendBufs.pop_back();
-
-		m_pSendBuf = pBUF->buf;
-		m_nSendBufLen = pBUF->len;
-		delete pBUF;
-	}
-
-	// 设置发送缓冲区数据
-	void AddSendBuf(char *pBuf, int nSendLen)
-	{
-		if (m_pSendBuf == NULL)
-		{
-			m_pSendBuf = pBuf;
-			m_nSendBufLen = nSendLen;
-			m_nHasSendLen = 0;
-		}
-		else
-		{
-			WSABUF *pBUF = new WSABUF();
-			pBUF->buf = pBuf;
-			pBUF->len = nSendLen;
-			m_SendBufs.push_back(pBUF);
-		}
-	}
-	
-public:
-	DWORD  m_nConnectionID;
-	RVCOVERLAPPED m_olSend;	
-	RVCOVERLAPPED m_olRecv;
-	SOCKET m_hSocket;
-
-	BYTE   m_arrTempPubKey[140];	// 客户端公钥
-	BYTE   m_arrSessionKey[16];
-	bool   m_bHasAuthPass;
-
-	WSABUF m_WSASendBuf;
-	int    m_nHasSendLen;
-	int	   m_nSendBufLen;
-	char  *m_pSendBuf;
-	std::vector<WSABUF*> m_SendBufs;
-	bool   m_bSending;
-
-	WSABUF m_WSARecvBuf;
-	int	   m_nHasRecvLen;
-	int    m_nRecvBufLen;
-	char  *m_pRecvBuf;
-};
-
-struct CSessionItem
-{
-	DWORD m_dwTokenHash;
-	BYTE  m_arrSessionKey[16];
-};
-
-class CServerComm : public CServerCommBase  
-{
-public:
-	CServerComm(CServerCallback *pCallback);
-	virtual ~CServerComm();
-
-	bool BeginService(int nListenPort);
-	void EndService();
-	const string Send(int nConnectionID, const IPackage *pSendPkg);
-
-	IPackage* CreateSendPackage(int nConnectionID, const char *pServiceCode);
-	IPackage* CreateReplyPackage(IPackage *pRecvPkg);
-
-private:
-	int GetProcessorNum();
-	static UINT _stdcall WorkThreadFunc(void *pArg);
-	static UINT _stdcall AcceptThreadFunc(void *pArg);
-	void AcceptConnection();
-	bool WorkThreadProcess();
-	int GetPackageLenFromRecvBuf(CConnectionContext *pContext);
-	void HandleClose(CConnectionContext *pContext);
-	bool VerifyAuthReqInfo(CConnectionContext *pContext, CConnAuthReq *pReq);
-	bool GenerateSessionKey(CConnectionContext *pContext, CConnAuthReq *pReq, CConnAuthRet *pRet);
-	void HandleAuthReqPackage(CConnectionContext *pContext, IPackage *pReqPkg);	
-	void HandleShakeReqPackage(CConnectionContext *pContext, IPackage *pReqPkg);	
-
-private:
-	CServerCallback *m_pCallback;
-	
-	std::map<DWORD/*ConnectionID*/, CConnectionContext*> m_CnnContextMap;
-	std::map<DWORD/*SessionID*/, CSessionItem*> m_CachedSessionKeys;
-	
-	CLockObject m_LockObject;
-	DWORD  m_nLastConnectionID;
-
-	HANDLE m_hIOCompletionPort;
-	HANDLE m_hExitEvent;
-
-	int    m_nThreadCount;
-	HANDLE *m_pWorkThreads;
-	
-	SOCKET m_hListenSocket;
-	HANDLE m_hAcceptThread;
-	WSAEVENT m_hAcceptEvent;
-
-	bool m_bHasInit;
-};
-
-#endif // !defined(AFX_SERVERCOMM_H__FBCF4C33_4278_47B7_8EAB_6CC3C0D452B2__INCLUDED_)

+ 1 - 1
RVCComm/StdAfx.cpp

@@ -2,7 +2,7 @@
 //	RVCComm.pch will be the pre-compiled header
 //	stdafx.obj will contain the pre-compiled type information
 
-#include "stdafx.h"
+#include "./stdafx.h"
 
 // TODO: reference any additional headers you need in STDAFX.H
 // and not in this file

+ 1 - 1
RVCComm/StdAfx.h

@@ -25,7 +25,7 @@
 
 #define WINVER 0x0520
 
-#include <windows.h>
+#include <winpr/windows.h>
 
 
 //{{AFX_INSERT_LOCATION}}