|
|
@@ -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;
|
|
|
}
|
|
|
}
|