Ver código fonte

继续优化服务端

张洋 5 anos atrás
pai
commit
8f107bd79d

+ 23 - 18
lewaimai_pos_windows_server/network/CClientSession.cpp

@@ -42,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了,后面就会内存越界
 }
@@ -68,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;
 	}
@@ -104,12 +115,6 @@ void CClientSession::handle_read(const boost::system::error_code& error,
 					boost::asio::placeholders::error,
 					boost::asio::placeholders::bytes_transferred));
 
-/*
-			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));*/
-
             return;
         }
 
@@ -138,12 +143,6 @@ void CClientSession::handle_read(const boost::system::error_code& error,
 			boost::bind(&CClientSession::handle_read, this,
 				boost::asio::placeholders::error,
 				boost::asio::placeholders::bytes_transferred));
-
-/*
-        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));*/
     }
     else
     {
@@ -152,14 +151,20 @@ void CClientSession::handle_read(const boost::system::error_code& error,
 
 		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;
@@ -167,8 +172,8 @@ void CClientSession::handle_read(const boost::system::error_code& error,
 		}
 		else
 		{
-			//这个是服务端断开了链接
-			//LOG_ERROR("服务端断开了链接");
+			//这个是服务端断开了链接,已经调用过close了
+			LOG_INFO("handle_read error,服务端断开了链接");
 			delete this;
 		}
     }

+ 10 - 3
lewaimai_pos_windows_server/network/CServer.cpp

@@ -319,10 +319,17 @@ 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;