zhangyang 5 лет назад
Родитель
Сommit
c544eec2d9

+ 2 - 2
zhipuzi_pos_windows_server/helper/CAliyunMNS.cpp

@@ -81,13 +81,13 @@ std::string CAliyunMNS::getMessage()
     catch(MNSServerException& me)
     {
         cout << "Request Failed: " << me.GetErrorCode().c_str() << endl;
-        //LOG_DEBUG("Request Failed: " << me.GetErrorCode().c_str());
+        LOG_INFO("Request Failed: " << me.GetErrorCode().c_str());
         return "error!";
     }
     catch(MNSExceptionBase& mb)
     {
         cout << "Request Failed: " << mb.ToString().c_str() << endl;
-        //LOG_DEBUG("Request Failed: " << mb.ToString().c_str());
+        LOG_INFO("Request Failed: " << mb.ToString().c_str());
         return "error!";
     }
 }

+ 1 - 1
zhipuzi_pos_windows_server/helper/CConfigReader.cpp

@@ -19,7 +19,7 @@ void CConfigReader::ReadConfigFile()
 {
 	ifstream configFile;
 
-	string path = "../conf/zhipuzi_pos_windows_server.conf";
+	string path = "/usr/local/zhipuzi_pos_windows_server/conf/zhipuzi_pos_windows_server.conf";
 
 	configFile.open(path.c_str());
 	string str_line;

+ 3 - 1
zhipuzi_pos_windows_server/main.cpp

@@ -25,8 +25,10 @@ int main()
 	catch (std::exception& e)
 	{
 		std::cerr << "Exception: " << e.what() << "\n";
-		LOG_INFO("Exception: " << e.what());
+		LOG_ERROR("Exception: " << e.what());
 	}
 
+	LOG_ERROR("ready to exit program");
+
 	return 0;
 }

+ 46 - 11
zhipuzi_pos_windows_server/network/CClientSession.cpp

@@ -12,6 +12,8 @@ CClientSession::~CClientSession()
 
 void CClientSession::start()
 {
+	m_pos_message.clear();
+
 	boost::asio::async_read(socket_, boost::asio::buffer(&m_pos_message, sizeof(PosMessage)),
 		boost::bind(&CClientSession::handle_read, this,
 			boost::asio::placeholders::error,
@@ -40,10 +42,19 @@ void CClientSession::stop()
 	//返回给接入层的消息
 	std::string login_out_msg = buffer.GetString();
 
-	send_message(login_out_msg);
+	bool ret = send_message(login_out_msg);
 
-	//然后关闭socket
-	socket_.close();
+	if (ret)
+	{
+		//然后关闭socket
+		LOG_INFO("in stop, send_message success!");
+		socket_.close();
+	}
+	else
+	{
+		LOG_ERROR("in stop, send_message failed!");
+		//如果同步写数据失败,说明socket已经失效了,这里不要调用关闭操作,等待异步读返回错误就好
+	}
 
 	//注意这里不能调用delete this,因为后面会异步返回,要判断状态,如果这里delete了,后面就会内存越界
 }
@@ -66,6 +77,8 @@ bool CClientSession::send_message(std::string msg)
 	{
 		std::string err = e.what();
 
+		LOG_ERROR("send_message error, message:" << err.c_str());
+
 		//注意这里是同步发送消息,这里不要处理socket的关闭和delete操作,让后面的异步读错误处理
 		return false;
 	}
@@ -85,13 +98,23 @@ void CClientSession::handle_read(const boost::system::error_code& error,
     {
         //读到客户端发过来的内容,进行绑定
         std::string msg = m_pos_message.data;
-		LOG_INFO("client handle read msg:" << msg.c_str());
 
         rapidjson::Document document;
         document.Parse(msg.c_str());
         if(!document.IsObject())
         {
-            LOG_INFO("message 非法!");
+            LOG_ERROR("message 非法! msg:" << msg.c_str());
+			LOG_ERROR("msg length:" << m_pos_message.m_length);
+			LOG_ERROR("ip:" << socket_.remote_endpoint().address().to_string());
+
+			//处理完了,重新读取
+			m_pos_message.clear();
+
+			boost::asio::async_read(socket_, boost::asio::buffer(&m_pos_message, sizeof(PosMessage)),
+				boost::bind(&CClientSession::handle_read, this,
+					boost::asio::placeholders::error,
+					boost::asio::placeholders::bytes_transferred));
+
             return;
         }
 
@@ -104,6 +127,8 @@ void CClientSession::handle_read(const boost::system::error_code& error,
 
 		if (is_login == "1")
 		{
+			//LOG_INFO("get client login message:" << msg.c_str());
+
 			//获取到用户名了,进行绑定
 			m_server->BindUsername(username, this);
 
@@ -112,25 +137,34 @@ void CClientSession::handle_read(const boost::system::error_code& error,
 		}
 
         //处理完了,重新读取
-        socket_.async_read_some(boost::asio::buffer(&m_pos_message, sizeof(PosMessage)),
-                                boost::bind(&CClientSession::handle_read, this,
-                                            boost::asio::placeholders::error,
-                                            boost::asio::placeholders::bytes_transferred));
+		m_pos_message.clear();
+
+		boost::asio::async_read(socket_, boost::asio::buffer(&m_pos_message, sizeof(PosMessage)),
+			boost::bind(&CClientSession::handle_read, this,
+				boost::asio::placeholders::error,
+				boost::asio::placeholders::bytes_transferred));
     }
     else
     {
 		std::string err = error.message();
+		//LOG_ERROR("handle_read error, err message:" << err.c_str());
 
 		if (socket_.is_open())
 		{
+			socket_.close();
+
 			//这个是客户端断开了链接
 			if (m_username == "")
 			{
-				//说明这个socket还没获取过用户名
+				//说明这个socket还没获取过用户名,直接销毁对象即可
+				LOG_ERROR("111 handle_read error, err message:" << err.c_str());
 				delete this;
 			}
 			else
 			{
+				//说明这个socket已经绑定过用户名了,先从map中删除,再销毁对象
+				LOG_ERROR("222 handle_read error, err message:" << err.c_str());
+				LOG_ERROR("222 username:" << m_username.c_str());
 				m_server->DeleteClient(m_username);
 
 				delete this;
@@ -138,7 +172,8 @@ void CClientSession::handle_read(const boost::system::error_code& error,
 		}
 		else
 		{
-			//这个是服务端断开了链接
+			//这个是服务端断开了链接,已经调用过close了
+			LOG_INFO("handle_read error,服务端断开了链接");
 			delete this;
 		}
     }

+ 46 - 16
zhipuzi_pos_windows_server/network/CServer.cpp

@@ -10,16 +10,21 @@ CServer::CServer()
 
 CServer::~CServer()
 {
+	LOG_ERROR("start ~CServer");
 	delete acceptor_;
 
 	if (m_db != NULL)
 	{
 		sqlite3_close(m_db);
 	}
+
+	LOG_ERROR("end ~CServer");
 }
 
 void CServer::Init()
 {
+	LOG_ERROR("start Init()");
+
 	//初始化数据库
 	InitSqlLite();
 
@@ -31,7 +36,6 @@ void CServer::Init()
 	start_accept();
 
 	int n_cpu = CSystem::get_CPU_core_num();
-	LOG_INFO("cpu num:" << n_cpu);
 
 	//开始接受和处理mns的消息
 	for (int i = 0; i < n_cpu * 2; i++)
@@ -61,8 +65,19 @@ void CServer::Init()
 		t.detach();
 	}
 
-	//开始异步执行
-	io_context_.run();
+	LOG_ERROR("ready to run");
+
+	try
+	{
+		//开始异步执行
+		io_context_.run();
+	}
+	catch (std::exception& e)
+	{
+		LOG_ERROR("io_context Exception: " << e.what());
+	}
+
+	LOG_ERROR("stop run");
 }
 
 void CServer::InitSqlLite()
@@ -82,20 +97,20 @@ void CServer::InitSqlLite()
 	m_rc = sqlite3_open(s_path.c_str(), &m_db);
 #else
 	std::string db_path = CSystem::getAbsopath() + "../db/pos.db";
-	LOG_INFO("db path:" << db_path.c_str());
+	//LOG_INFO("db path:" << db_path.c_str());
 
 	m_rc = sqlite3_open(db_path.c_str(), &m_db);
 #endif
 
 	if (m_rc)
 	{
-		LOG_INFO("Can't open database: " << sqlite3_errmsg(m_db));
+		LOG_ERROR("Can't open database: " << sqlite3_errmsg(m_db));
 		return;
 	}
 
 	else
 	{
-		LOG_INFO("Opened database successfully");
+		//LOG_INFO("Opened database successfully");
 	}
 
 	//初始化数据表
@@ -281,12 +296,15 @@ void CServer::start_accept()
 void CServer::handle_accept(CClientSession* new_session,
 	const boost::system::error_code& error)
 {
+	//LOG_INFO("new client, handle_accept!");
+
 	if (!error)
 	{
 		new_session->start();
 	}
 	else
 	{
+		LOG_ERROR("handle_accept error");
 		delete new_session;
 	}
 
@@ -301,15 +319,24 @@ void CServer::BindUsername(std::string username, CClientSession* session)
 {
 	m_map_mutex.lock();
 
-	if (m_clients_map.find(username) != m_clients_map.end() && m_clients_map[username]->GetNum() < session->GetNum())
+	if (m_clients_map.find(username) != m_clients_map.end())
 	{
-		//之前已经存在了一个,先把之前的关闭掉(这个是服务器端主动的关闭)
-		m_clients_map[username]->stop();
+		if (m_clients_map[username]->GetNum() < session->GetNum())
+		{
+			//之前已经存在了一个,先把之前的关闭掉(这个是服务器端主动的关闭)
+			m_clients_map[username]->stop();
+		}
+		else
+		{
+			LOG_ERROR("异常情况,不应该出现");
+		}
 	}
 
 	m_clients_map[username] = session;
 
 	m_map_mutex.unlock();
+
+	LOG_INFO("绑定新客户端成功,当前客户端数量:" << m_clients_map.size());
 }
 
 void CServer::DeleteClient(std::string username)
@@ -322,6 +349,8 @@ void CServer::DeleteClient(std::string username)
 	}
 
 	m_map_mutex.unlock();
+
+	LOG_INFO("删除客户端成功,当前客户端数量:" << m_clients_map.size());
 }
 
 /*
@@ -337,7 +366,7 @@ void CServer::ReceiveMNSMessage()
         return;
     }
 
-	LOG_INFO("Init AliyunMNS success!");
+	//LOG_INFO("Init AliyunMNS success!");
 
     while(true)
     {
@@ -348,7 +377,7 @@ void CServer::ReceiveMNSMessage()
             continue;
         }
 
-        //LOG_INFO("get new message:" << message.c_str());
+		//LOG_INFO("new msn message:" << message.c_str());
 
         //获取到了新的消息,开始进行处理
         rapidjson::Document document;
@@ -356,6 +385,7 @@ void CServer::ReceiveMNSMessage()
         if(!document.IsObject())
         {
             LOG_INFO("message 非法!");
+			LOG_INFO("get new message:" << message.c_str());
             continue;
         }
 
@@ -389,7 +419,7 @@ void CServer::ReceiveMNSMessage()
 		if (time(NULL) > atoi(timestamp.c_str()) + atoi(use_time.c_str()))
 		{
 			//消息过了有效期,直接丢弃
-			LOG_INFO("message due date!");
+			//LOG_INFO("message due date!");
 			continue;
 		}		
 
@@ -445,7 +475,7 @@ void CServer::SendMessageToClient()
 		{
 			m_map_mutex.unlock();
 
-			LOG_INFO("can not find client, save to db, username:"<<username.c_str());
+			//LOG_INFO("can not find client, save to db, username:"<<username.c_str());
 
 			//客户端不在线,操作存数据库
 			AddMessageToDB(username, due_time, data);
@@ -460,13 +490,13 @@ void CServer::SendMessageToClient()
 			bool ret = session->send_message(data);
 			if (ret == false)
 			{
-				LOG_INFO("send to client fail, save it to db, username:" << username.c_str());
+				//LOG_INFO("send to client fail, save it to db, username:" << username.c_str());
 				//如果发送失败了,把消息存回到数据库
 				AddMessageToDB(username, due_time, data);
 			}
 			else
 			{
-				LOG_INFO("send to client success, username:" << username.c_str());
+				//LOG_INFO("send to client success, username:" << username.c_str());
 			}
 		}
 	}	
@@ -485,4 +515,4 @@ void CServer::HandleCleanupDueMessage()
 
 		CSystem::my_sleep(60 * 30);
 	}
-}
+}

+ 5 - 0
zhipuzi_pos_windows_server/network/PosMessage.h

@@ -7,4 +7,9 @@ public:
 	char data[max_length];
 
 	int m_length;
+
+	void clear()
+	{
+		memset(this, 0, sizeof(PosMessage));
+	}
 };