Browse Source

Merge branch 'master' of http://local.beijingyongan.com:3000/linux-dev/ya-serv

chensongchao 6 years ago
parent
commit
6f6e83f113

+ 25 - 2
ant.h

@@ -9,6 +9,7 @@
 #include <deque>
 #include <tuple>
 #include <memory>
+#include <memory.h>
 #include <algorithm>
 #include <sstream>
 #include "log.h"
@@ -100,8 +101,8 @@ struct ant :point
                 v.push_back(pt);
                 //std_info("get_sol:x:%.2f,y:%.2f",pt.x,pt.y);
             }
-            else
-                std_error(".%s","ant::getsol empty path..");
+            //else
+             //   std_error("ant[%d]::getsol empty path..",);
         }
         return std::move(v);
     }
@@ -148,6 +149,28 @@ struct site:point,std::enable_shared_from_this<site>
     site(int id=-1);
 
 
+	char m_timestamp[8]={0};
+	bool check_timestamp(const char*time)
+	{
+		//秒、分、时、天、周、月、年, 脑残的设计
+		
+		char buf[6];
+		buf[0]=time[6];
+		buf[1]=time[5];
+		buf[2]=time[3];
+		buf[3]=time[2];
+		buf[4]=time[1];
+		buf[5]=time[0];
+
+		if(memcmp(m_timestamp,buf,6)<=0)
+		{
+			memcpy(m_timestamp,buf,6);
+			return true;
+		}
+		return false;
+	}
+
+
     int index()const;
     const algo_config&config()const;
     int id()const

+ 1 - 0
card_base.cpp

@@ -64,6 +64,7 @@ void card_location_base::on_message(zloop<task*> * loop,const message_locinfo&lo
 
 	if(site_ptr->is_up_site())
 	{
+        log_info("%d被井上分站[%d]收到",m_id,site_ptr->id());
 		auto area_tool=get_area_tool();
 		area_tool->set(site_ptr);
 		area_tool->on_point(shared_from_this(),point(1,1));

+ 37 - 45
card_message_handle.cpp

@@ -13,12 +13,13 @@
 struct one_ct_message_handle
 {
 	static loc_tool_main m_loc_tool;
-	ev::timer *m_min_timer=nullptr,*m_max_timer=nullptr;
+	ev::timer m_min_timer,m_max_timer;
 	//loc_message.
 	std::vector<loc_message> m_msg_list;
 	card_location_base*m_card;
 	const algo_config*m_ac=nullptr;
 	int  m_ct;
+	bool m_min_timeout=false;
 	ev::dynamic_loop * m_loop = nullptr;
 	one_ct_message_handle(card_location_base*card)
 	{
@@ -26,51 +27,52 @@ struct one_ct_message_handle
 		m_ct=-1;
 	}
 
-	~one_ct_message_handle()
+	void reset()
 	{
-		delete m_min_timer;
-		delete m_max_timer;
+		m_ct=-1;
+		m_min_timeout=false;
+		m_msg_list.clear();
 	}
 
 	void on_min_timer()
 	{
+		m_min_timer.stop();
+
 		if((int)m_msg_list.size()>=m_ac->best_msg_cnt)
 		{
-			m_max_timer->stop();
+			m_max_timer.stop();
 			calc_location();
+			return;
 		}
+		m_min_timeout=true;
 	}
 
 	void on_max_timer()
 	{
+		m_max_timer.stop();
 		calc_location();
 	}
 
 	void set(ev::dynamic_loop * loop)
 	{
-		m_loop=loop;
-		m_min_timer=new ev::timer(*loop);
-		m_min_timer->set<one_ct_message_handle,&one_ct_message_handle::on_min_timer>(this);
-		m_max_timer=new ev::timer(*loop);
-		m_max_timer->set<one_ct_message_handle,&one_ct_message_handle::on_max_timer>(this);
+		m_loop = loop;
+
+		m_min_timer.set(*m_loop);
+		m_min_timer.set<one_ct_message_handle,&one_ct_message_handle::on_min_timer>(this);
+		m_max_timer.set(*m_loop);
+		m_max_timer.set<one_ct_message_handle,&one_ct_message_handle::on_max_timer>(this);
 	}
 
 	void on_message(ev::dynamic_loop *loop,const message_locinfo&loc)
 	{
-		if(loop==nullptr)
-			return;
-
-		if(m_loop == nullptr)
+		if(m_loop == nullptr && loop!=nullptr)
 			set(loop);
-
-		if(m_ct==loc.m_card_ct && m_max_timer->remaining()<0) //超过max_timer的点,抛弃
+		else if(loop == nullptr)
 			return;
-
-		if(!m_msg_list.empty() && m_ct!=loc.m_card_ct) //ct已经回绕,重置
+		if(!m_msg_list.empty()&& m_ct!=loc.m_card_ct)
 		{
 			m_msg_list.clear();
 		}
-
 		auto sitPtr = sit_list::instance()->get(loc.m_site_id);
 		if(sitPtr==nullptr)
 		{
@@ -78,32 +80,36 @@ struct one_ct_message_handle
 			return;
 		}
 		auto s=sit_list::instance()->get(loc.m_site_id);
-		//这里构造loc_message 保存数据
-		m_msg_list.push_back(loc_message(s,loc.m_tof,loc.m_time_stamp,loc.m_card_id,
-					loc.m_card_ct,loc.m_card_type,loc.m_ant_id,loc.m_rav,loc.m_acc,
-					loc.m_sync_ct,loc.m_rssi));
-
-		if(m_msg_list.size()==1)//第一个点
+		if(m_msg_list.empty())
 		{
 			m_ct=loc.m_card_ct;
 			m_ac=&s->config();
+			m_min_timeout=false;
+			//这里构造loc_message 保存数据
+			m_msg_list.push_back(loc_message(s,loc.m_tof,loc.m_time_stamp,loc.m_card_id,
+						loc.m_card_ct,loc.m_card_type,loc.m_ant_id,loc.m_rav,loc.m_acc,
+						loc.m_sync_ct,loc.m_rssi));
 
 			//启动本CT的最小、最大两个定时器
-			m_min_timer->start(m_ac->min_wait_time);
-			m_max_timer->start(m_ac->max_wait_time);
+			m_min_timer.start(m_ac->min_wait_time);
+			m_max_timer.start(m_ac->max_wait_time);
 			return;
 		}
 
-		if(m_min_timer->remaining()<0 && (int)m_msg_list.size()>=m_ac->best_msg_cnt)
+		m_msg_list.push_back(loc_message(s,loc.m_tof,loc.m_time_stamp,loc.m_card_id,
+					loc.m_card_ct,loc.m_card_type,loc.m_ant_id,loc.m_rav,loc.m_acc,
+					loc.m_sync_ct,loc.m_rssi));
+
+		if(m_min_timeout && (int)m_msg_list.size()>=m_ac->best_msg_cnt)
 		{
 			calc_location();
-			m_max_timer->stop();
+			m_max_timer.stop();
 		}
 	}
 
 	void calc_location()
 	{
-		auto&v = m_msg_list;
+		auto v = m_msg_list;
 		if(v.empty())
 		{
 			return;
@@ -116,7 +122,7 @@ struct one_ct_message_handle
 
 		if(!rc.empty()) m_card->on_location(std::move(rc),v);
 
-		m_msg_list.clear();
+		reset();
 		log_info("calc_location_end:card_id=%d",m_card->m_id);
 	}
 };
@@ -143,20 +149,6 @@ card_message_handle::~card_message_handle()
 
 void card_message_handle::on_message(zloop<task*> * loop,const message_locinfo&loc,bool is_history)
 {
-#ifndef _RELEASE_
-	if(m_first_call)
-	{
-		m_first_call=false;
-		m_first_call_thread=std::this_thread::get_id();
-	}
-
-	if(m_first_call_thread!=std::this_thread::get_id())
-	{
-		log_error("%s\n","card_message_handle::on_message 无法支持多线程调用");
-		assert(false);
-	}
-#endif 
-
 	if(is_history)
 	{
 		log_warn("%s","当前代码没有处理历史消息记录。");

+ 0 - 1
card_person.cpp

@@ -58,7 +58,6 @@ void person::site_hover(int sid)
 //虹膜识别入库功能	
 void person::IKSDK_DB(int sid)
 {
-	printf("person::IKSDK_DB : card=%d,Sid=%d \n",m_id,sid);
 	time_t now = time(0);
 	if(now - m_iris_recognition_timeval > 5)
 	{

+ 1 - 0
db/db_api/CDBConnPool.cpp

@@ -327,6 +327,7 @@ namespace YADB
 		_ASYNC_SQL_* pData = new _ASYNC_SQL_;
 		if ( !pData )
 		{
+            logn_error(2,"PushAsync new pData失败");
 			return false;
 		}
 

+ 1 - 1
db/db_tool.cpp

@@ -16,7 +16,7 @@ namespace db_tool
         logn_info(2,"sql:[%s]",sql);
         if(!sDBConnPool.PushAsync(sql))
         {
-            log_error( "PushAsync记录到队列中失败\n");
+            logn_error(2,"PushAsync记录到队列中失败");
         }
     }
 

+ 0 - 4
event.cpp

@@ -357,10 +357,6 @@ std::string event_list::evs_to_json(std::vector<std::shared_ptr<ya_event>> arr)
     for(;it!=arr.end();++it)
     {
         _ev_to_node(*it, allocator, data);
-       // if((*it)->m_is_display)
-       // {
-       //     _ev_to_node(*it, allocator, data);
-       // }
     }
 
     doc.AddMember(JSON_ROOT_KEY_CMD,JSON_CMD_VALUE_EVENT, allocator);

+ 8 - 0
main.cpp

@@ -70,6 +70,12 @@ struct Init_Setting
             exit(0);
         }
 
+		if(0)
+		{
+			std::vector<char> b(1024*1024);
+			usleep(1000*1000);
+		}
+
 		CYaSetting::Init_sys_setting();
         sit_list::instance()->load_from_db();
         card_list::instance()->init_card_from_db();
@@ -97,7 +103,9 @@ struct Init_Setting
         dp.PoolSize=DBSetting.PoolSize;
 		init_three_rates(dp);
 
+
         log_info("Init_Setting::init  Success. \n" );
+
     }
 
 	void init_three_rates(const db_para& dbs)

+ 1 - 1
message.cpp

@@ -54,7 +54,7 @@ void message_locinfo::load(zistream&is,bool tdoa)
 	uint16_t sp1=0,sp2=0;
 	is>>sp1>>sp2;
 	m_rssi=10*log10(1.*sp1*(1<<17)/pow(sp2-64.,2))-121.74;
-	log_info("timestamp=%llu,type:%d,card_id:%d,ct:%d,status:%d,acc=%d,tof=%llu,ant_id:%d,spq=%d",m_time_stamp,m_card_type,m_card_id,m_card_ct,m_batty_status,m_acc,m_tof,m_ant_id,m_rssi);
+	log_info("timestamp=%llu,type:%d,card_id:%d,site:%d,ct:%d,status:%d,acc=%d,tof=%llu,ant_id:%d,spq=%d",m_time_stamp,m_card_type,m_card_id,m_site_id,m_card_ct,m_batty_status,m_acc,m_tof,m_ant_id,m_rssi);
 }
 
 void message_tdoasync::zero_this()

+ 1 - 0
message.h

@@ -6,6 +6,7 @@
 struct zistream;
 
 #define CHAR_LOCATEDATA_TOF_EXTEND 0x843b			// TOF实时定位数据,请求、应答
+#define CHAR_LOCATEDATASMALL_TOF_EXTEND 0x753b		// TOF实时小分站定位数据,请求、应答
 #define CHAR_LOCATEDATAHIS_TOF_EXTEND 0x853b		// TOF历史定位数据,请求、应答
 #define CHAR_LOCATEDATA_TDOA_EXTEND 0x863b			// TDOA实时定位数据,请求、应答
 #define CHAR_LOCATEDATAHIS_TDOA_EXTEND 0x873b		// TDOA历史定位数据,请求、应答

+ 10 - 45
module_service/area_business_person_attendance.cpp

@@ -47,6 +47,7 @@ void area_business_person_attendance::on_leave(const std::shared_ptr<area_hover>
     if(!mine_tool_ptr->m_is_attendance)
         return;
 
+    log_info("on_leave_person_att:%d",card_ptr->m_id);
     //考勤结束
     mine_tool_ptr->m_is_attendance=false;
 
@@ -90,66 +91,30 @@ void area_business_person_attendance::handle_up_mine(sio::message::ptr const& da
         return;
     }
 
-//    rapidjson::Document doc(rapidjson::kObjectType);
-//    rapidjson::Value datas(rapidjson::kArrayType);
-//    rapidjson::Document::AllocatorType& allocator=doc.GetAllocator();
-
     std::vector<sio::message::ptr>::const_iterator it_card = card_vec.begin();
     int type = 0;
     std::string s_card_id;
     for(; it_card != card_vec.end(); ++it_card)
     {
         if(!tool_map::try_get_value(s_card_id, JSON_KEY_CALL_CARD_CARD_ID, (*it_card))
-                ||!tool_map::try_get_value(type, JSON_KEY_CALL_CARD_CARD_TYPE_ID, (*it_card)))
+            ||!tool_map::try_get_value(type, JSON_KEY_CALL_CARD_CARD_TYPE_ID, (*it_card))
+            )
         {
             log_error("手工升井,web发来的数据 card_id 或 card_type格式不对");
             continue;
         }
-
-        uint32_t id = tool_other::id64_to_id(s_card_id);
-        auto card_ptr = card_list::instance()->get(tool_other::type_id_to_u64(type, id));
-        if(card_ptr && card_ptr->is_person())
+        log_info("handle_up_card:%s,接收到手动升井的请求",s_card_id.c_str());
+        if(!tool_other::is_person(type))
+            continue;
+        auto card_ptr = card_list::instance()->get(tool_other::card_id_to_u64(s_card_id));
+        if(card_ptr && STATUS_LOST == card_ptr->m_biz_stat)
         {
-            std_debug("手工升井,处理,卡id=%d,卡type=%d", id, type);
-            log_info("手工升井,处理,卡id=%d,卡type=%d", id, type);
-
+            log_info("handle_up_card:%s 手工升井,处理",s_card_id.c_str());
             module_meta_date_changed::clear_card(card_ptr);
-            //            auto rea_tool = card_ptr->get_area_tool();
-            //            rea_tool->on_leave(card_ptr);
-            //card_ptr->clear();
-
-            //            auto mine_tool_ptr = card_ptr->get_mine_tool();
-            //            if(mine_tool_ptr->m_is_attendance)
-            //            {
-            //                //考勤结束
-            //                mine_tool_ptr->m_is_attendance=false;
-
-            //                //作为一条结束考勤记录保存到数据库
-            //                db_tool::save_attendance(card_ptr);
-            //            }
-
-            //检查井下是否超员--是否需要取消
-            //CMineCardManager::instance()->OnPersonUp(card_ptr);
-
-            //            auto rea_tool = card_ptr->get_area_tool();
-            //			rea_tool->on_leave(card_ptr);
-            //			card_ptr->clear();
         }
         else
-        {
-            log_error("手工升井,在全局列表中找不到卡,卡id=%d,卡type=%d", id, type);
-        }
+            log_warn("handle_up_card:%s,手动升井的卡找不到,或者该卡不在盲区",s_card_id.c_str());
     }
-
-//    //升井json发给web
-//    if(datas.Size() > 0)
-//    {
-//        doc.AddMember(JSON_ROOT_KEY_CMD,JSON_CMD_VALUE_UP_MINE, allocator);
-//        //doc.AddMember(JSON_ROOT_KEY_VERSION,INTERFACE_VERSION, allocator);
-//        doc.AddMember(JSON_ROOT_KEY_DATA, datas, allocator);
-
-//        swsClientMgr.send(JSON_CMD_VALUE_PUSH, tool_json::doc_to_json(doc));
-//    }
 }
 
 ///升井json

+ 2 - 29
module_service/module_meta_date_changed.cpp

@@ -110,36 +110,9 @@ void module_meta_date_changed::accept(sio::message::ptr const& data)
 
 ///3.清除卡相关信息,区域相关,分站相关,考勤相关,清除定时器,
 ///速度,状态 呼救 呼叫 告警相关。即保留基础信息,其他的重置。
-void module_meta_date_changed::clear_card(std::shared_ptr<card_location_base> card_ptr)
+void module_meta_date_changed::clear_card(const std::shared_ptr<card_location_base>& card_ptr)
 {
-    auto rea_tool = card_ptr->get_area_tool();
-    rea_tool->on_leave(card_ptr);
-    //card_ptr->clear();
-
-    //    //删除
-    //    //card_ptr->del_card_pos();
-    // 升井 删除所有报警信息
-    for(int i=0; i < CARD_EVENT_COUNT_MAX; i++ )
-    {
-        if (i == EVENT_TYPE::ET_CARD_LOW_POWER_SERIOUS)
-        {
-            continue;
-        }
-
-        uint64_t id = tool_other::type_id_to_u64(card_ptr->m_type, card_ptr->m_id);
-        event_tool::instance()->handle_event(OT_CARD, static_cast<EVENT_TYPE>(i), id, 0, 0, false);
-
-        //        auto ev_ptr = event_list::instance()->get_event_card(
-        //                card_ptr->m_id, card_ptr->m_type, static_cast<EVENT_TYPE>(i));
-        //        if(ev_ptr && !ev_ptr->is_end()) //
-        //        {
-        //            event_list::copy_event(card_ptr, ev_ptr);
-
-        //            ev_ptr->m_status = ES_END;
-
-        //            event_list::save_event(ev_ptr);
-        //        }
-    }
+    card_ptr->get_area_tool()->on_leave(card_ptr);
 }
 /*
  * 修改车及卡的数据

+ 1 - 1
module_service/module_meta_date_changed.h

@@ -40,7 +40,7 @@ public:
 
     ///3.清除卡相关信息,区域相关,分站相关,考勤相关,清除定时器,
     ///速度,状态 呼救 呼叫 告警相关。即保留基础信息,其他的重置。
-    static void clear_card(std::shared_ptr<card_location_base> card_ptr);
+    static void clear_card(const std::shared_ptr<card_location_base> &card_ptr);
 
 private:
     /*

+ 18 - 8
net-service.cpp

@@ -57,15 +57,11 @@ void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t
 		switch(cmd)
 		{
 			case CHAR_LOCATEDATA_TOF_EXTEND://tof-扩展
+            case CHAR_LOCATEDATASMALL_TOF_EXTEND:
 				{
-					if(!clt->check_timestamp(data+10))
-					{
-						logn_error(1,"分站数据时间戳错误:%s",clt->name().c_str());
-						break;
-					}
-
 					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)
@@ -73,6 +69,20 @@ void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t
 						logn_error(1,"在全局分站列表中找不到分站:%d", site_id);
 						break;
 					}
+
+					if(!site_ptr->check_timestamp(data+10))
+					{
+						logn_error(1,"分站数据时间戳错误:%s,sid=%d,tm=%s,sct=%d",clt->name().c_str());
+						break;
+					}
+
+					{
+						char timebuf[64];
+						unsigned char*t=(unsigned char*)data+10;
+						sprintf(timebuf,"%d-%d %d:%d:%d",*(t+4)+1,*(t+3),*(t+2),*(t+1),*(t+0));
+						logn_info(1,"分站数据信息: net=%s,sid=%d,tm=%s,sct=%d",clt->name().c_str(),site_id,timebuf,((*t-2)<<8)|*(t-1));
+					}
+
 					site_ptr->set_client(clt);
 					site_ptr->on_power_status((power&1)==0);
 
@@ -87,14 +97,14 @@ void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t
 						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;
+						m.m_time_stamp=tstamp;
 						//t_site->m_site_data = 0;
 
 						t->m_cmd_code=cmd;
 						t->m_hash_id=m.m_card_id;
 						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);
+						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);
 						m_loc_worker->request(t);
 					}
 				}

+ 1 - 1
select_tool.h

@@ -350,7 +350,7 @@ struct car_point_filter:select_point_object
 		//sit_location.set(sit->x,sit->y);
 		sit_location = sit->get_dstp(m_turning_pt);
 		if(sit_location.empty())
-		  std_error("get_dstp point error.....");
+		  std_error("%d get_dstp point error.....",sit->m_id);
 		double dist1=sit_location.dist(rpt);
 		double dist2=sit_location.dist(m_turning_pt);
 		double dist3=m_turning_pt.dist(rpt);	// dist1 is supposed to be = dist2+dist3

+ 3 - 3
websocket/wsClient.cpp

@@ -96,7 +96,6 @@ namespace YA
 
 	void wsClient::login()
 	{
-		char szError[512] = { 0 };
 
 		if ( !IsConnected() )
 		{
@@ -121,7 +120,6 @@ namespace YA
 
 		std::this_thread::sleep_for( std::chrono::milliseconds( _LOGIN_SLEEP_TIME_ ) );
 		
-		int nRet = 0;
 		YA::_JS_LOGIN_ Login;
 		Login.user_name = JSON_VALUE_USERNAME;
 		Login.user_password = JSON_VALUE_PASSWORD;
@@ -130,8 +128,10 @@ namespace YA
 		strLogin += "\n";
 		sio::socket::ptr skt_ptr;
 		skt_ptr = __wsclient.socket();
-		skt_ptr->emit( JSON_CMD_VALUE_USER, strLogin, [&]( sio::message::list const& msglist )
+		skt_ptr->emit( JSON_CMD_VALUE_USER, strLogin, [this]( sio::message::list const& msglist )
 		{
+		    int nRet = 0;
+		    char szError[512] = { 0 };
 			sio::message::ptr msg_ptr = msglist[0];
 			nRet = ( int ) msg_ptr->get_map()["code"]->get_int();
 			if ( 0 == nRet )

+ 5 - 13
websocket/wsTimerThread.cpp

@@ -10,11 +10,6 @@ namespace YA
 	wsTimerThread::wsTimerThread()
 	{
 		__Reset();
-
-		__LastSendTime = { 0 };
-		__LastSendTime.tm_year = 1970 - 1900;
-		__LastSendTime.tm_mon  = 1;
-		__LastSendTime.tm_mday = 1;
 	}
 
 	wsTimerThread::~wsTimerThread()
@@ -37,7 +32,7 @@ namespace YA
         }
         __Thread->interrupt();
         __Running = false;
-		std::cout << "::Stop() begin" << std::endl;
+		std::cout << "wsTimerThread::Stop() begin" << std::endl;
 
 		__Enable = false;
 
@@ -50,7 +45,7 @@ namespace YA
 		__Reset();
         __Thread=nullptr;
 
-		std::cout << "::Stop() end" << std::endl;
+		std::cout << "wsTimerThread::Stop() end" << std::endl;
 	}
 
 	void wsTimerThread::__Reset()
@@ -82,16 +77,13 @@ namespace YA
 	{	
 		while ( pOwner->__Enable )
 		{
-			std::tm *Now;
-			std::time_t t;
-			t = time( 0 );
-			Now = localtime( &t );
-			int seconds = (int)std::difftime( mktime( Now ), mktime( &__LastSendTime ) );
+			std::time_t t = time( 0 );
+			int seconds = (int)std::difftime( t, __LastSendTime );
 
 			if ( seconds >= pOwner->__Config.SendInterval )
 			{
 				pOwner->__SendCardPos();
-				__LastSendTime = *Now;
+				__LastSendTime = t;
 			}
 
 			boost::this_thread::sleep( boost::posix_time::millisec( 1 ) );

+ 1 - 1
websocket/wsTimerThread.h

@@ -47,7 +47,7 @@ namespace YA
 		boost::mutex __ExitMutex;//锁(配合__ExitCond)
 		_THREAD_CONFIG_ __Config;//线程配置
 		thread_safe_map<uint64_t, _CARD_POS_> __CardPosList;//卡位置列表
-		std::tm __LastSendTime;//上一次发送的时间
+        std::time_t  __LastSendTime{0};//上一次发送的时间
 		jsonBuilder __jsBuilder;//json构造器类
 	private:
 		/**

+ 49 - 29
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;
@@ -202,7 +202,7 @@ struct sock_client:fd_io,client_ex
 	size_t m_opos=0;
 	bool   m_can_write{false};
 
-	char m_timestamp[8];
+//	char m_timestamp[8];
 
 	sock_client(io_context&ic,const char*name,int fd,int recv_time_out,int max_package_size)
 		:fd_io(ic,fd,EV_READ|EV_WRITE)
@@ -229,7 +229,7 @@ struct sock_client:fd_io,client_ex
 //		m_send_timer.start();
 
 		m_b=(char*)malloc(m_size);
-		m_timestamp[0]=0;
+//		m_timestamp[0]=0;
 	}
 
 	~sock_client()
@@ -237,7 +237,7 @@ struct sock_client:fd_io,client_ex
 		free(m_b);
 	}
 
-
+#if 0
 	bool check_timestamp(const char*time)
 	{
 		//秒、分、时、天、周、月、年, 脑残的设计
@@ -257,6 +257,7 @@ struct sock_client:fd_io,client_ex
 		}
 		return false;
 	}
+#endif
 
 	int type()
 	{
@@ -294,12 +295,12 @@ struct sock_client:fd_io,client_ex
 		buf[p++]=(tv.tv_usec/1000)&0xff;
 
 		//为防止分站重启时发送上来过大的时间
-		m_timestamp[5]=buf[p++]=t->tm_sec;
-		m_timestamp[4]=buf[p++]=t->tm_min;
-		m_timestamp[3]=buf[p++]=t->tm_hour;
-		m_timestamp[2]=buf[p++]=t->tm_mday;
-		m_timestamp[1]=buf[p++]=t->tm_mon;
-		m_timestamp[0]=buf[p++]=t->tm_year;
+		buf[p++]=t->tm_sec;
+		buf[p++]=t->tm_min;
+		buf[p++]=t->tm_hour;
+		buf[p++]=t->tm_mday;
+		buf[p++]=t->tm_mon;
+		buf[p++]=t->tm_year;
 
 		uint16_t ccrc=do_crc((unsigned char*)buf+2,10);
 
@@ -391,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;

+ 1 - 1
znet.h

@@ -14,7 +14,7 @@ struct client:std::enable_shared_from_this<client>
 	virtual void close()=0;
 	virtual void send(std::vector<char>&&b)=0;
 
-	virtual bool check_timestamp(const char*)=0;
+//	virtual bool check_timestamp(const char*)=0;
 
 	virtual ~client(){}
 };

+ 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;