浏览代码

1、将IOCPModel改名为SATTCPServer;
2、将protocol改名为SATProtocol;

scbc.sat2 5 年之前
父节点
当前提交
1c5039de23

+ 61 - 0
SATService/SATService/SATProtocol.h

@@ -0,0 +1,61 @@
+#ifndef __PROTOCOL__
+#define __PROTOCOL__
+
+#pragma once
+
+#pragma pack(push)
+#pragma pack(1)
+
+typedef struct _DATAHEADER_ {
+	// 葵累깃街륜;
+	byte protocol;
+	// 뎠품繫斤관돨낀똑;// header낀똑+buf낀똑;
+	unsigned int len;
+	// 츱즈잚謹;
+	byte cmd;
+}DataHeader, *pDataHeader;
+
+// 헝헹관
+typedef struct _PACKAGE_
+{
+	DataHeader header;
+	byte	buf[4]; // 야竟코휭(寧濾뒈囹);
+}Package;
+#pragma pack(pop)
+
+// 야竟葵累寧즈;
+enum ProtocolCMD
+{
+	// 되쩌、되놔;
+	CMD_LOGIN					= 0,
+	CMD_LOGOUT					= 1,
+	// �구;
+	CMD_ADD_DEVICE				= 2,
+	CMD_DEL_DEVICE				= 3,
+	CMD_QUERY_DEVICES			= 4,
+};
+
+typedef struct __TPLOGIN__
+{
+	char		szUserName[MAX_PATH];
+	char		szPassword[MAX_PATH];
+}TPLogin, *pTPLogin;
+
+typedef struct _REQUEST_JSON_
+{
+	int			device_id;
+	std::string device_name;
+	std::string device_cmd;
+	int device_timeout; 
+}RequestJson;
+
+
+typedef struct _RESPONSE_JSON_
+{
+	int			device_id;
+	std::string device_name;
+	std::string device_cmd_result;	// 츱즈獵契써벎;
+}ResponseJson;
+
+
+#endif // __PROTOCOL__

+ 5 - 4
SATService/SATService/SATService.cpp

@@ -6,6 +6,7 @@
 #include "MainProcess.h"
 #include "SATExecutor.h"
 #include "SATDevices.h"
+#include "IOCPModel.h"
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -60,11 +61,11 @@ int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
 		Global::GetIniInfo();
 #ifdef _DEBUG
 		//WorkStart();
-		printf(Global::GetLocalAddress().c_str());
-		system("pause");
-		return 0;
+		//CSATDevices::GetInstance()->StartWork();
+		CSATTCPServer iocp;
+		iocp.LoadSocketLib();
+		iocp.Start(5588);
 
-		CSATDevices::GetInstance()->StartWork();
 		while (true)
 		{
 			Sleep(1000);

+ 6 - 2
SATService/SATService/SATService.vcproj

@@ -361,11 +361,15 @@
 			Name="TCP"
 			>
 			<File
-				RelativePath=".\IOCPModel.cpp"
+				RelativePath=".\protocol.h"
 				>
 			</File>
 			<File
-				RelativePath=".\IOCPModel.h"
+				RelativePath=".\SATTCPServer.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\SATTCPServer.h"
 				>
 			</File>
 		</Filter>

+ 39 - 44
SATService/SATService/IOCPModel.cpp → SATService/SATService/SATTCPServer.cpp

@@ -1,5 +1,5 @@
 #include "StdAfx.h"
-#include "IOCPModel.h"
+#include "SATTCPServer.h"
 //#include "MainDlg.h"
 
 // 每一个处理器上产生多少个线程(为了最大限度的提升服务器性能,详见配套文档)
@@ -21,7 +21,7 @@
 
 
 
-CIOCPModel::CIOCPModel(void):
+CSATTCPServer::CSATTCPServer(void):
 							m_nThreads(0),
 							m_hShutdownEvent(NULL),
 							m_hIOCompletionPort(NULL),
@@ -35,7 +35,7 @@ CIOCPModel::CIOCPModel(void):
 }
 
 
-CIOCPModel::~CIOCPModel(void)
+CSATTCPServer::~CSATTCPServer(void)
 {
 	// 确保资源彻底释放
 	this->Stop();
@@ -49,10 +49,10 @@ CIOCPModel::~CIOCPModel(void)
 //         也就是每当完成端口上出现了完成数据包,就将之取出来进行处理的线程
 ///////////////////////////////////////////////////////////////////
 
-DWORD WINAPI CIOCPModel::_WorkerThread(LPVOID lpParam)
+DWORD WINAPI CSATTCPServer::_WorkerThread(LPVOID lpParam)
 {    
 	THREADPARAMS_WORKER* pParam = (THREADPARAMS_WORKER*)lpParam;
-	CIOCPModel* pIOCPModel = (CIOCPModel*)pParam->pIOCPModel;
+	CSATTCPServer* pIOCPModel = (CSATTCPServer*)pParam->pIOCPModel;
 	int nThreadNo = (int)pParam->nThreadNo;
 
 	pIOCPModel->_ShowMessage(_T("工作者线程启动,ID: %d."),nThreadNo);
@@ -165,7 +165,7 @@ DWORD WINAPI CIOCPModel::_WorkerThread(LPVOID lpParam)
 
 ////////////////////////////////////////////////////////////////////
 // 初始化WinSock 2.2
-bool CIOCPModel::LoadSocketLib()
+bool CSATTCPServer::LoadSocketLib()
 {    
 	WSADATA wsaData;
 	int nResult;
@@ -182,7 +182,7 @@ bool CIOCPModel::LoadSocketLib()
 
 //////////////////////////////////////////////////////////////////
 //	启动服务器
-bool CIOCPModel::Start(unsigned int port)
+bool CSATTCPServer::Start(unsigned int port)
 {
 	// 初始化线程互斥量
 	InitializeCriticalSection(&m_csContextList);
@@ -221,7 +221,7 @@ bool CIOCPModel::Start(unsigned int port)
 
 ////////////////////////////////////////////////////////////////////
 //	开始发送系统退出消息,退出完成端口和线程资源
-void CIOCPModel::Stop()
+void CSATTCPServer::Stop()
 {
 	if( m_pListenContext!=NULL && m_pListenContext->m_Socket!=INVALID_SOCKET )
 	{
@@ -250,7 +250,7 @@ void CIOCPModel::Stop()
 
 ////////////////////////////////
 // 初始化完成端口
-bool CIOCPModel::_InitializeIOCP()
+bool CSATTCPServer::_InitializeIOCP()
 {
 	// 建立第一个完成端口
 	m_hIOCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0 );
@@ -285,7 +285,7 @@ bool CIOCPModel::_InitializeIOCP()
 
 /////////////////////////////////////////////////////////////////
 // 初始化Socket
-bool CIOCPModel::_InitializeListenSocket(unsigned int port)
+bool CSATTCPServer::_InitializeListenSocket(unsigned int port)
 {
 	// AcceptEx 和 GetAcceptExSockaddrs 的GUID,用于导出函数指针
 	GUID GuidAcceptEx = WSAID_ACCEPTEX;  
@@ -409,7 +409,7 @@ bool CIOCPModel::_InitializeListenSocket(unsigned int port)
 
 ////////////////////////////////////////////////////////////
 //	最后释放掉所有资源
-void CIOCPModel::_DeInitialize()
+void CSATTCPServer::_DeInitialize()
 {
 	// 删除客户端列表的互斥量
 	DeleteCriticalSection(&m_csContextList);
@@ -444,7 +444,7 @@ void CIOCPModel::_DeInitialize()
 
 //////////////////////////////////////////////////////////////////
 // 投递Accept请求
-bool CIOCPModel::_PostAccept( PER_IO_CONTEXT* pAcceptIoContext )
+bool CSATTCPServer::_PostAccept( PER_IO_CONTEXT* pAcceptIoContext )
 {
 	ASSERT( INVALID_SOCKET!=m_pListenContext->m_Socket );
 
@@ -484,7 +484,7 @@ bool CIOCPModel::_PostAccept( PER_IO_CONTEXT* pAcceptIoContext )
 // 总之你要知道,传入的是ListenSocket的Context,我们需要复制一份出来给新连入的Socket用
 // 原来的Context还是要在上面继续投递下一个Accept请求
 //
-bool CIOCPModel::_DoAccpet( PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT* pIoContext )
+bool CSATTCPServer::_DoAccpet( PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT* pIoContext )
 {
 	SOCKADDR_IN* ClientAddr = NULL;
 	SOCKADDR_IN* LocalAddr = NULL;  
@@ -564,7 +564,7 @@ bool CIOCPModel::_DoAccpet( PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT*
 
 ////////////////////////////////////////////////////////////////////
 // 投递接收数据请求
-bool CIOCPModel::_PostRecv( PER_IO_CONTEXT* pIoContext )
+bool CSATTCPServer::_PostRecv( PER_IO_CONTEXT* pIoContext )
 {
 	// 初始化变量
 	DWORD dwFlags = 0;
@@ -589,7 +589,7 @@ bool CIOCPModel::_PostRecv( PER_IO_CONTEXT* pIoContext )
 
 /////////////////////////////////////////////////////////////////
 // 在有接收的数据到达的时候,进行处理
-bool CIOCPModel::_DoRecv( PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT* pIoContext )
+bool CSATTCPServer::_DoRecv( PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT* pIoContext )
 {
 	// 先把上一次的数据显示出现,然后就重置状态,发出下一个Recv请求
 	SOCKADDR_IN* ClientAddr = &pSocketContext->m_ClientAddr;
@@ -625,7 +625,7 @@ bool CIOCPModel::_DoRecv( PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT* pI
 
 /////////////////////////////////////////////////////
 // 将句柄(Socket)绑定到完成端口中
-bool CIOCPModel::_AssociateWithIOCP( PER_SOCKET_CONTEXT *pContext )
+bool CSATTCPServer::_AssociateWithIOCP( PER_SOCKET_CONTEXT *pContext )
 {
 	// 将用于和客户端通信的SOCKET绑定到完成端口中
 	HANDLE hTemp = CreateIoCompletionPort((HANDLE)pContext->m_Socket, m_hIOCompletionPort, (DWORD)pContext, 0);
@@ -651,7 +651,7 @@ bool CIOCPModel::_AssociateWithIOCP( PER_SOCKET_CONTEXT *pContext )
 
 //////////////////////////////////////////////////////////////
 // 将客户端的相关信息存储到数组中
-void CIOCPModel::_AddToContextList( PER_SOCKET_CONTEXT *pHandleData )
+void CSATTCPServer::_AddToContextList( PER_SOCKET_CONTEXT *pHandleData )
 {
 	EnterCriticalSection(&m_csContextList);
 
@@ -662,7 +662,7 @@ void CIOCPModel::_AddToContextList( PER_SOCKET_CONTEXT *pHandleData )
 
 ////////////////////////////////////////////////////////////////
 //	移除某个特定的Context
-void CIOCPModel::_RemoveContext( PER_SOCKET_CONTEXT *pSocketContext )
+void CSATTCPServer::_RemoveContext( PER_SOCKET_CONTEXT *pSocketContext )
 {
 	EnterCriticalSection(&m_csContextList);
 
@@ -681,7 +681,7 @@ void CIOCPModel::_RemoveContext( PER_SOCKET_CONTEXT *pSocketContext )
 
 ////////////////////////////////////////////////////////////////
 // 清空客户端信息
-void CIOCPModel::_ClearContextList()
+void CSATTCPServer::_ClearContextList()
 {
 	EnterCriticalSection(&m_csContextList);
 
@@ -707,7 +707,7 @@ void CIOCPModel::_ClearContextList()
 
 ////////////////////////////////////////////////////////////////////
 // 获得本机的IP地址
-CString CIOCPModel::GetLocalIP()
+CString CSATTCPServer::GetLocalIP()
 {
 	// 获得本机主机名
 	char hostname[MAX_PATH] = {0};
@@ -731,7 +731,7 @@ CString CIOCPModel::GetLocalIP()
 
 ///////////////////////////////////////////////////////////////////
 // 获得本机中处理器的数量
-int CIOCPModel::_GetNoOfProcessors()
+int CSATTCPServer::_GetNoOfProcessors()
 {
 	SYSTEM_INFO si;
 
@@ -742,7 +742,7 @@ int CIOCPModel::_GetNoOfProcessors()
 
 /////////////////////////////////////////////////////////////////////
 // 在主界面中显示提示信息
-void CIOCPModel::_ShowMessage(const CString szFormat,...) const
+void CSATTCPServer::_ShowMessage(const CString szFormat,...) const
 {
 	// 根据传入的参数格式化字符串
 	CString   strMessage;
@@ -766,11 +766,11 @@ void CIOCPModel::_ShowMessage(const CString szFormat,...) const
 #endif
 }
 
-#define PAK_LEN sizeof(ProHeader)
-void CIOCPModel::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT* pIoContext)
+#define PAK_LEN sizeof(DataHeader)
+void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT* pIoContext)
 {
 	// 小于包头;
-	ProHeader* phead = NULL;
+	DataHeader* phead = NULL;
 	if (pSocketContext->lastData.size() == 0)
 	{
 		// 不足包头;
@@ -781,13 +781,14 @@ void CIOCPModel::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT
 		}
 		else
 		{
-			phead = (ProHeader*)pIoContext->m_wsaBuf.buf;
+			// 包头充足;
+			phead = (DataHeader*)pIoContext->m_wsaBuf.buf;
 
 			// 完整的包;
 			if (phead->len == pIoContext->m_Overlapped.InternalHigh)
 			{
 				OutputDebugString("A:完整的包;\n");
-				_DeviceProc(pIoContext, (Package*)pIoContext->m_wsaBuf.buf);
+				_TaskProcess(pIoContext, (Package*)pIoContext->m_wsaBuf.buf);
 			}
 			// 小包;
 			else if (phead->len > pIoContext->m_Overlapped.InternalHigh)
@@ -800,7 +801,7 @@ void CIOCPModel::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT
 			{
 				OutputDebugString("A:超包;\n");
 				pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf + phead->len, pIoContext->m_Overlapped.InternalHigh - phead->len);
-				_DeviceProc(pIoContext, (Package*)pIoContext->m_wsaBuf.buf);
+				_TaskProcess(pIoContext, (Package*)pIoContext->m_wsaBuf.buf);
 			}
 		}
 	}
@@ -809,14 +810,14 @@ void CIOCPModel::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT
 		int lastlen = pIoContext->m_Overlapped.InternalHigh;
 		if (pSocketContext->lastData.size() >= PAK_LEN)
 		{
-			phead = (ProHeader*)pSocketContext->lastData.data();
+			phead = (DataHeader*)pSocketContext->lastData.data();
 			if (phead->len <= pSocketContext->lastData.size() + pIoContext->m_Overlapped.InternalHigh)
 			{
 				if ( phead->len <= pSocketContext->lastData.size() )
 				{
 					OutputDebugString("C:超包;\n");
 					// 完整包;
-					_DeviceProc(pIoContext, (Package*)pSocketContext->lastData.substr(0, phead->len).data());
+					_TaskProcess(pIoContext, (Package*)pSocketContext->lastData.substr(0, phead->len).data());
 
 					pSocketContext->lastData = pSocketContext->lastData.substr(phead->len);
 					pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf, pIoContext->m_Overlapped.InternalHigh);
@@ -827,7 +828,7 @@ void CIOCPModel::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT
 					lastlen = pSocketContext->lastData.size() + pIoContext->m_Overlapped.InternalHigh - phead->len;
 					pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf, pIoContext->m_Overlapped.InternalHigh - lastlen);
 					// 完整包;
-					_DeviceProc(pIoContext, (Package*)pSocketContext->lastData.data());
+					_TaskProcess(pIoContext, (Package*)pSocketContext->lastData.data());
 					// 剩余包;
 					pSocketContext->lastData.clear();
 					if (lastlen)
@@ -854,14 +855,14 @@ void CIOCPModel::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT
 			{
 				// 拼成完整包头;
 				pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf, diflen);
-				phead = (ProHeader*)pSocketContext->lastData.data();
+				phead = (DataHeader*)pSocketContext->lastData.data();
 
 				// 完整包;
 				if ( phead->len == PAK_LEN + pIoContext->m_Overlapped.InternalHigh - diflen )
 				{
 					OutputDebugString("B:完整包;\n");
 					pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf + diflen, pIoContext->m_Overlapped.InternalHigh - diflen);
-					_DeviceProc(pIoContext, (Package*)pSocketContext->lastData.data());
+					_TaskProcess(pIoContext, (Package*)pSocketContext->lastData.data());
 					pSocketContext->lastData.clear();
 				}
 				// 小包;
@@ -876,7 +877,7 @@ void CIOCPModel::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT
 					OutputDebugString("B:超包;\n");
 					// 组完成包;
 					pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf + diflen, phead->len - PAK_LEN);
-					_DeviceProc(pIoContext, (Package*)pSocketContext->lastData.data());
+					_TaskProcess(pIoContext, (Package*)pSocketContext->lastData.data());
 					pSocketContext->lastData.clear();
 					int last = pIoContext->m_Overlapped.InternalHigh - diflen - phead->len + PAK_LEN;
 					if (last)
@@ -889,20 +890,15 @@ void CIOCPModel::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT
 	}
 }
 
-void CIOCPModel::_DeviceProc(PER_IO_CONTEXT* pIoContext, Package* pak)
+void CSATTCPServer::_TaskProcess(PER_IO_CONTEXT* pIoContext, Package* pak)
 {
-	if ( pak->header.version != 0xAA )
-	{
-		return;
-	}
-
 	cJSON* pJson = cJSON_Parse((const char*)&pak->buf);
 	if ( pJson == NULL )
 	{
 		return;
 	}
 
-	RequesJson reqj;
+	RequestJson reqj;
 	reqj.device_id = cJSON_GetObjectItem(pJson, "device_id") ? cJSON_GetObjectItem(pJson, "device_id")->valueint : 0;
 	reqj.device_name = cJSON_GetObjectItem(pJson, "device_name") ? cJSON_GetObjectItem(pJson, "device_name")->valuestring : "";
 	reqj.device_cmd = cJSON_GetObjectItem(pJson, "device_cmd") ? cJSON_GetObjectItem(pJson, "device_cmd")->valuestring : "";
@@ -913,7 +909,6 @@ void CIOCPModel::_DeviceProc(PER_IO_CONTEXT* pIoContext, Package* pak)
 		cJSON_Delete(pJson);
 		pJson = NULL;
 	}
-
 }
 
 /////////////////////////////////////////////////////////////////////
@@ -921,7 +916,7 @@ void CIOCPModel::_DeviceProc(PER_IO_CONTEXT* pIoContext, Package* pak)
 // 使用的方法是尝试向这个socket发送数据,判断这个socket调用的返回值
 // 因为如果客户端网络异常断开(例如客户端崩溃或者拔掉网线等)的时候,服务器端是无法收到客户端断开的通知的
 
-bool CIOCPModel::_IsSocketAlive(SOCKET s)
+bool CSATTCPServer::_IsSocketAlive(SOCKET s)
 {
 	int nByteSent=send(s,"",0,0);
 	if (-1 == nByteSent) return false;
@@ -930,7 +925,7 @@ bool CIOCPModel::_IsSocketAlive(SOCKET s)
 
 ///////////////////////////////////////////////////////////////////
 // 显示并处理完成端口上的错误
-bool CIOCPModel::HandleError( PER_SOCKET_CONTEXT *pContext,const DWORD& dwErr )
+bool CSATTCPServer::HandleError( PER_SOCKET_CONTEXT *pContext,const DWORD& dwErr )
 {
 	// 如果是超时了,就再继续等吧  
 	if(WAIT_TIMEOUT == dwErr)  

+ 10 - 41
SATService/SATService/IOCPModel.h → SATService/SATService/SATTCPServer.h

@@ -5,48 +5,17 @@
 #include <MSWSock.h>
 //#include <ws2tcpip.h>
 #pragma comment(lib,"ws2_32.lib")
+#include "protocol.h"
 
 // 缓冲区长度 (1024*8)
 // 之所以为什么设置8K,也是一个江湖上的经验值
 // 如果确实客户端发来的每组数据都比较少,那么就设置得小一些,省内存
 #define MAX_BUFFER_LEN        8192  
 // 默认端口
-#define DEFAULT_PORT          12345    
+#define DEFAULT_PORT          5588    
 // 默认IP地址
 #define DEFAULT_IP            _T("127.0.0.1")
 
-#pragma pack(push)
-#pragma pack(1)
-
-typedef struct _PRO_HEADER_
-{
-	byte	version;
-	unsigned int len; // header长度+buf长度;
-}ProHeader;
-
-// 请求包
-typedef struct _PACKAGE_
-{
-	ProHeader header;
-	byte	buf[4]; // json格式;
-}Package;
-#pragma pack(pop)
-
-typedef struct _REQUEST_JSON_
-{
-	int			device_id;
-	std::string device_name;
-	std::string device_cmd;
-	int	device_timeout;
-}RequesJson;
-
-typedef struct _RESPONSE_JSON_
-{
-	int			device_id;
-	std::string device_name;
-	std::string device_cmd_result;	// 命令执行结果;
-}ResponseJson;
-
 
 //////////////////////////////////////////////////////////////////
 // 在完成端口上投递的I/O操作的类型
@@ -172,25 +141,25 @@ typedef struct _PER_SOCKET_CONTEXT
 
 //====================================================================================
 //
-//				CIOCPModel类定义
+//				CSATTCPServer类定义
 //
 //====================================================================================
 
 // 工作者线程的线程参数
-class CIOCPModel;
+class CSATTCPServer;
 typedef struct _tagThreadParams_WORKER
 {
-	CIOCPModel* pIOCPModel;                                   // 类指针,用于调用类中的函数
+	CSATTCPServer* pIOCPModel;                                   // 类指针,用于调用类中的函数
 	int         nThreadNo;                                    // 线程编号
 
 } THREADPARAMS_WORKER,*PTHREADPARAM_WORKER; 
 
-// CIOCPModel
-class CIOCPModel
+// CSATTCPServer
+class CSATTCPServer
 {
 public:
-	CIOCPModel(void);
-	~CIOCPModel(void);
+	CSATTCPServer(void);
+	~CSATTCPServer(void);
 
 public:
 
@@ -266,7 +235,7 @@ protected:
 	void _ShowMessage( const CString szFormat,...) const;
 
 	void _RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT* pIoContext);
-	void _DeviceProc(PER_IO_CONTEXT* pIoContext, Package *pak);
+	void _TaskProcess(PER_IO_CONTEXT* pIoContext, Package *pak);
 private:
 
 	HANDLE                       m_hShutdownEvent;              // 用来通知线程系统退出的事件,为了能够更好的退出线程