Переглянути джерело

添加报文太大、太小时报错及关闭连接的功能

zzj 6 роки тому
батько
коміт
7692dbbdd0
4 змінених файлів з 43 додано та 21 видалено
  1. 1 0
      main.cpp
  2. 1 1
      net-service.cpp
  3. 39 20
      znet.cpp
  4. 2 0
      zstream.h

+ 1 - 0
main.cpp

@@ -70,6 +70,7 @@ struct Init_Setting
             exit(0);
         }
 
+		if(0)
 		{
 			std::vector<char> b(1024*1024);
 			usleep(1000*1000);

+ 1 - 1
net-service.cpp

@@ -59,9 +59,9 @@ void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t
 			case CHAR_LOCATEDATA_TOF_EXTEND://tof-扩展
             case CHAR_LOCATEDATASMALL_TOF_EXTEND:
 				{
-
 					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)

+ 39 - 20
znet.cpp

@@ -190,7 +190,7 @@ struct sock_client:fd_io,client_ex
 	char  *m_b{0};
 	int   m_clen{0};
 	int   m_size{1<<16};
-	int   m_max_package_size{4096};
+	int   m_max_package_size{2048};
 
 	ev::timer  m_recv_timer;
 	ev::timer  m_sync_timer;
@@ -392,30 +392,49 @@ struct sock_client:fd_io,client_ex
 		if(read_clt()<0)
 			return -1;
 
-		int msg_len;
-		for(;m_clen>=2;)
+		try
 		{
-			msg_len=calc_length((uint8_t*)m_b)+2;
+			int msg_len;
+			for(;m_clen>=2;)
+			{
+				msg_len=calc_length((uint8_t*)m_b)+2;
 
-			if(msg_len>m_max_package_size)
-				return -1;
+				if(msg_len>m_max_package_size)
+				{
+					logn_error(1,"package too big:%d/%d,close socket. site=%s.",msg_len,m_max_package_size,m_name.c_str());
+					return -1;
+				}
 
-			if(m_clen<msg_len)
-				break;
+				if(msg_len<=8)
+				{
+					logn_error(1,"package too small:%d,close socket. site=%s.",msg_len,m_name.c_str());
+					return -1;
+				}
 
-			logn_bin(1,name().c_str(),m_b,msg_len);//输出二进制日志
-			if(check_crc(m_b,msg_len))
-			{
-				on_message(m_b,msg_len);
-			}
-			else
-			{
-				logn_error(1,"check_crc_error,close socket. site=%s.",m_name.c_str());
-				return -1;
-			}
 
-			memmove(m_b,&m_b[msg_len],m_clen-msg_len);
-			m_clen-=msg_len;
+
+				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
+				{
+					logn_error(1,"check_crc_error,close socket. site=%s.",m_name.c_str());
+					return -1;
+				}
+
+				memmove(m_b,&m_b[msg_len],m_clen-msg_len);
+				m_clen-=msg_len;
+			}
+		}
+		catch(const std::exception&e)
+		{
+			logn_error(1,"package error,close socket. site=%s,err_info=%s",m_name.c_str(),e.what());
+			return -1;
 		}
 
 		return 0;

+ 2 - 0
zstream.h

@@ -208,6 +208,7 @@ public:
 	{ 
 		if(is.m_np <= 0)
 			return is;
+
 		is.load(x,is.m_np);
 		is.m_np.reset();
 
@@ -216,6 +217,7 @@ public:
 
 	friend zistream& operator>>(zistream&is, const skip&s)
 	{ 
+		is.assert_buff_size(s.m_count);
 		is.m_pos+=s.m_count;
 
 		return is;