ソースを参照

1、net-service::on_message添加异常处理,目前只有zistream内部错乱引起的异常会触发
2、二进制日志移动到 znet.cpp中,crc检查之前
3、添加了crc代码的实现
4、上述错误会直接关闭分站连接

zzj 6 年 前
コミット
8611a0ca94
2 ファイル変更93 行追加73 行削除
  1. 76 71
      net-service.cpp
  2. 17 2
      znet.cpp

+ 76 - 71
net-service.cpp

@@ -47,83 +47,88 @@ void net_service::on_timer()
 
 void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t len)
 {
-	logn_bin(1,clt->name().c_str(),data,len);//输出二进制日志
-
-	zistream is(data,len-2);
-	uint16_t cmd;
-	is>>skip(2)>>cmd;
-	switch(cmd)
+	try
 	{
-		case CHAR_LOCATEDATA_TOF_EXTEND://tof-扩展
-			{
-				uint32_t site_id;
-				uint8_t  power;
-				is>>site_id>>skip(11)>>power;
-                auto site_ptr = sit_list::instance()->get(static_cast<int32_t>(site_id));
-                if(!site_ptr)
-                {
-                    log_error("在全局分站列表中找不到分站:分站id=%d", site_id);
-                    break;
-                }
-                site_ptr->set_client(clt);
-                site_ptr->on_power_status((power&1)==0);
-
-				struct timeval tv;
-				gettimeofday(&tv,NULL);
-				uint64_t t = tv.tv_sec*1000 + tv.tv_usec/1000;
-				int index=0;
-				while(!is.eof())
+		zistream is(data,len-2);
+		uint16_t cmd;
+		is>>skip(2)>>cmd;
+		switch(cmd)
+		{
+			case CHAR_LOCATEDATA_TOF_EXTEND://tof-扩展
 				{
-					uint64_t tstamp = t -1000 + 50 + index* 45;
-					index++;
-					task*t=task::alloc<message_locinfo>();
-					message_locinfo&m=t->body<message_locinfo>();
-					m.load(is,false);
-					m.m_time_stamp=tstamp;
-					m.m_site_id=site_id;
-					//t_site->m_site_data = 0;
+					uint32_t site_id;
+					uint8_t  power;
+					is>>site_id>>skip(11)>>power;
+					auto site_ptr = sit_list::instance()->get(static_cast<int32_t>(site_id));
+					if(!site_ptr)
+					{
+						log_error("在全局分站列表中找不到分站:分站id=%d", site_id);
+						break;
+					}
+					site_ptr->set_client(clt);
+					site_ptr->on_power_status((power&1)==0);
 
-					t->m_cmd_code=cmd;
-					t->m_hash_id=m.m_card_id;
-					m_loc_worker->request(t);
-					if(m.m_card_type==5)
-						mine_business::inst()->make_reverse_condition(m.m_card_type,m.m_card_id,m.m_ant_id,m.m_card_ct,m.m_tof,m.m_site_id);
+					struct timeval tv;
+					gettimeofday(&tv,NULL);
+					uint64_t t = tv.tv_sec*1000 + tv.tv_usec/1000;
+					int index=0;
+					while(!is.eof())
+					{
+						uint64_t tstamp = t -1000 + 50 + index* 45;
+						index++;
+						task*t=task::alloc<message_locinfo>();
+						message_locinfo&m=t->body<message_locinfo>();
+						m.load(is,false);
+						m.m_time_stamp=tstamp;
+						m.m_site_id=site_id;
+						//t_site->m_site_data = 0;
+
+						t->m_cmd_code=cmd;
+						t->m_hash_id=m.m_card_id;
+						m_loc_worker->request(t);
+						if(m.m_card_type==5)
+							mine_business::inst()->make_reverse_condition(m.m_card_type,m.m_card_id,m.m_ant_id,m.m_card_ct,m.m_tof,m.m_site_id);
+					}
+				}
+				break;
+			case CHAR_LOCATEDATA_TDOA_EXTEND://tdoa
+				{
+					uint32_t site_id;
+					is>>site_id>>skip(12);
+					while(!is.eof())
+					{
+						task*t=task::alloc<message_locinfo>();
+						message_locinfo&m=t->body<message_locinfo>();
+						m.load(is,true);
+						m.m_site_id=site_id;
+						t->m_cmd_code=cmd;
+						t->m_hash_id=m.m_card_id;
+						m_sync_worker->translate(m);
+						m_loc_worker->request(t);
+					}
 				}
-			}
-			break;
-		case CHAR_LOCATEDATA_TDOA_EXTEND://tdoa
-			{
-				uint32_t site_id;
-				is>>site_id>>skip(12);
-				while(!is.eof())
+				break;
+			case CHAR_TDOA_READER_SYNC_TIME://time sync
 				{
-					task*t=task::alloc<message_locinfo>();
-					message_locinfo&m=t->body<message_locinfo>();
-					m.load(is,true);
-					m.m_site_id=site_id;
-					t->m_cmd_code=cmd;
-					t->m_hash_id=m.m_card_id;
-					m_sync_worker->translate(m);
-					m_loc_worker->request(t);
+					message_tdoasync m;
+					m.load(is);
+					m_sync_worker->on_message(m);
 				}
-			}
-			break;
-		case CHAR_TDOA_READER_SYNC_TIME://time sync
-			{
-				message_tdoasync m;
-				m.load(is);
-				m_sync_worker->on_message(m);
-			}
-			//site_message::on_sync(this,t.m_param1);
-			break;
-		case CHAR_LOCATEDATAHIS_TOF_EXTEND://tof his
-		case CHAR_LOCATEDATAHIS_TDOA_EXTEND://tdoa his
-			break;
-		case CHAR_CTRL_READER_CMD://ctrl site message
-			break;
-		case CHAR_ADHOC://自组网数据
-			break;
+				//site_message::on_sync(this,t.m_param1);
+				break;
+			case CHAR_LOCATEDATAHIS_TOF_EXTEND://tof his
+			case CHAR_LOCATEDATAHIS_TDOA_EXTEND://tdoa his
+				break;
+			case CHAR_CTRL_READER_CMD://ctrl site message
+				break;
+			case CHAR_ADHOC://自组网数据
+				break;
+		}
+	}
+	catch(const std::exception&e)
+	{
+		log_error("parse site message error,will close the connection:%s",clt->name().c_str());
+		clt->close();
 	}
 }
 
-

+ 17 - 2
znet.cpp

@@ -18,6 +18,8 @@
 #include <worker.h>
 
 #include "config_file.h"
+#include "crc.h"
+
 extern config_file config;
 struct client_ex:client
 {
@@ -332,10 +334,16 @@ struct sock_client:fd_io,client_ex
 			if(m_clen<msg_len)
 				break;
 
+			logn_bin(1,name().c_str(),m_b,msg_len);//输出二进制日志
 			if(check_crc(m_b,msg_len))
+			{
 				on_message(m_b,msg_len);
+			}
 			else
-				log_errno("check_crc_error.");
+			{
+				log_errno("check_crc_error,socket close... site=%s.",m_name.c_str());
+				return -1;
+			}
 
 			memmove(m_b,&m_b[msg_len],m_clen-msg_len);
 			m_clen-=msg_len;
@@ -431,7 +439,14 @@ struct sock_client:fd_io,client_ex
 
 	bool check_crc(const char*b,size_t mlen)
 	{
-		return true;
+		uint16_t crc=b[mlen-2];
+		crc<<=8;
+		crc|=b[mlen-1];
+
+		if(do_crc((unsigned char*)b,mlen)==crc)
+			return true;
+
+		return false;
 	}
 
 	void on_message(const char*m,int mlen)