Prechádzať zdrojové kódy

校验包头是否损坏;

scbc.sat2 5 rokov pred
rodič
commit
5265e83301

+ 33 - 1
SATService/SATService/SATTCPServer.cpp

@@ -784,6 +784,11 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 		{
 			// 包头充足;
 			phead = (SATProtocol::DataHeader*)pIoContext->m_wsaBuf.buf;
+			if ( !CheckDataHeader(phead) )
+			{
+				OutputDebugString("A:包头损坏;\n");
+				return;
+			}
 
 			// 完整的包;
 			if (phead->len == pIoContext->m_Overlapped.InternalHigh)
@@ -812,6 +817,13 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 		if (pSocketContext->lastData.size() >= PAK_LEN)
 		{
 			phead = (SATProtocol::DataHeader*)pSocketContext->lastData.data();
+			if ( !CheckDataHeader(phead) )
+			{
+				OutputDebugString("C:包头损坏;\n");
+				pSocketContext->lastData.clear();
+				return;
+			}
+
 			if (phead->len <= pSocketContext->lastData.size() + pIoContext->m_Overlapped.InternalHigh)
 			{
 				if ( phead->len <= pSocketContext->lastData.size() )
@@ -857,6 +869,12 @@ void CSATTCPServer::_RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONT
 				// 拼成完整包头;
 				pSocketContext->lastData.append(pIoContext->m_wsaBuf.buf, diflen);
 				phead = (SATProtocol::DataHeader*)pSocketContext->lastData.data();
+				if ( !CheckDataHeader(phead) )
+				{
+					OutputDebugString("B:包头损坏;\n");
+					pSocketContext->lastData.clear();
+					return;
+				}
 
 				// 完整包;
 				if ( phead->len == PAK_LEN + pIoContext->m_Overlapped.InternalHigh - diflen )
@@ -901,13 +919,15 @@ void CSATTCPServer::_TaskProcess(PER_IO_CONTEXT* pIoContext, SATProtocol::Packag
 		return;
 
 	if ( pHeader->protocol == 0xAA ) {
-		if ( pHeader->cmd == SATProtocol::CMD_LOGIN ) {// 登录;
+		if ( pHeader->cmd == SATProtocol::CMD_LOGIN ) {
+			// 登录;
 			SATProtocol::UserInfo *pLogin = (SATProtocol::UserInfo*)pak->buf;
 			bool bRet = CSATExecutor::GetInstance()->Login(pLogin->szUserName, pLogin->szPassword);
 
 			// 计算数据包长度;
 			long len = sizeof(SATProtocol::DataHeader)+sizeof(SATProtocol::LoginResp);
 			byte *pbuff = new byte[len];
+			memset(pbuff, 0, len);
 			SATProtocol::Package *pSendPak = (SATProtocol::Package *)pbuff;
 			pSendPak->header.protocol = 0xAA;
 			pSendPak->header.cmd = SATProtocol::CMD_LOGIN;
@@ -927,6 +947,10 @@ void CSATTCPServer::_TaskProcess(PER_IO_CONTEXT* pIoContext, SATProtocol::Packag
 
 			// 发送,无须判断是否发送成功;
 			send(pIoContext->m_sockAccept, (const char*)pbuff, len, 0);
+
+			// 释放内存;
+			delete []pbuff;
+			pbuff = NULL;
 		}
 		else if ( pHeader->cmd == SATProtocol::CMD_LOGOUT ) {// 登出;
 
@@ -950,6 +974,14 @@ void CSATTCPServer::_TaskProcess(PER_IO_CONTEXT* pIoContext, SATProtocol::Packag
 	}	
 }
 
+bool CSATTCPServer::CheckDataHeader(SATProtocol::DataHeader* header)
+{
+	if ( header->protocol != 0xAA )
+		return false;
+
+	return true;
+}
+
 /////////////////////////////////////////////////////////////////////
 // 判断客户端Socket是否已经断开,否则在一个无效的Socket上投递WSARecv操作会出现异常
 // 使用的方法是尝试向这个socket发送数据,判断这个socket调用的返回值

+ 1 - 0
SATService/SATService/SATTCPServer.h

@@ -236,6 +236,7 @@ protected:
 
 	void _RecvProcess(PER_SOCKET_CONTEXT* pSocketContext, PER_IO_CONTEXT* pIoContext);
 	void _TaskProcess(PER_IO_CONTEXT* pIoContext, SATProtocol::Package *pak);
+	bool CheckDataHeader(SATProtocol::DataHeader* header);
 private:
 
 	HANDLE                       m_hShutdownEvent;              // 用来通知线程系统退出的事件,为了能够更好的退出线程

+ 14 - 12
SATService/tcp_client.py

@@ -11,7 +11,7 @@ import binascii
 # 定义:
 DataHeader = np.dtype({'names': ['protocol', 'len', 'cmd'], 'formats': ['u1', 'u4', 'u1']}, align=False)
 UserInfo = np.dtype({'names': ['userName', 'password'], 'formats': ['|S260', '|S260']}, align=False)
-
+LoginResp = np.dtype({'names': ['bStatus', 'szMessage'], 'formats': ['?', '|S260']}, align=False)
 
 class BaseClient(object):
     __metaclass__ = abc.ABCMeta
@@ -88,12 +88,12 @@ class BaseClient(object):
             print "respone:" + binascii.hexlify(respone)
             '''小端<I, 大端>I, 网络端 !'''
             protocol, len, cmd = struct.unpack('<BIB', phead)
-            loginresult = int(struct.unpack('<c', respone))
+            status, message = int(struct.unpack('<c', respone))
             '''返回头是否有效'''
             if protocol != 0xAA and len != data.__len__():
                 return None
             
-            return loginresult
+            return status
         except Exception, e:
             print "BaseClient=> recv Error:", e
             return None
@@ -161,14 +161,14 @@ class SATClient(object):
             print "BaseClient=> send Error:", e
             self.disconnect()
             self.connect()
-            return None
+            return False
 
         '''接收返回数据'''
         try:
             # 等待数据返回;(串口若请求失败,超时值应该设置在3秒以上)
             self.sock.settimeout(10)
             data = bytes(self.sock.recv(1024 * 8))
-            print "recv:" + binascii.hexlify(data)
+            # print "recv:" + binascii.hexlify(data)
             self.sock.settimeout(None)
 
             phead = data[0: np.array([(0xAA, 0, 0x01)], dtype=DataHeader).itemsize]
@@ -176,21 +176,22 @@ class SATClient(object):
 
             '''
             注意:坑!
-                respone此时是16进制字符 '\x01',Python的字符与C++的不一样,字符就是字符;
+                如果respone此时只返回16进制字符 '\x01',Python的字符与C++的不一样,字符就是字符;
                 要将16进制字符转成整型,使用ord函数
             '''
-            print "respone:" + binascii.hexlify(respone), ord(respone)
+            # print "respone:" + binascii.hexlify(respone)
             '''小端<I, 大端>I, 网络端 !'''
             protocol, len, cmd = struct.unpack('<BIB', phead)
-            loginresult = ord(struct.unpack('<c', respone)[0])
+            # loginresult = ord(struct.unpack('<c', respone)[0])
+            status, message = struct.unpack('<?260s', respone)
             '''返回头是否有效'''
             if protocol != 0xAA and len != data.__len__():
-                return None
+                return False
 
-            return loginresult
+            return status
         except Exception, e:
             print "BaseClient=> recv Error:", e
-            return None
+            return False
 
     '''断开连接'''
 
@@ -204,6 +205,7 @@ class SATClient(object):
 
 if __name__ == "__main__":
     bc = SATClient()
-    bc.sendmsg()
+    while 1:
+        print bc.sendmsg()
 
     print "ok!"