C++项目 | 集群聊天服务器 | 客户端异常退出业务

1.clientCloseExecption

客户端异常退出处理函数要干两件事:

1.从map中删除用户的连接信息,因为要把底层的socket资源释放掉

2.更新用户状态信息 user表中状态改为offline

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//chatservice.cpp
//处理客户端异常退出
void ChatService::clientCloseExecption(const TcpConnectionPtr &conn)
{
User user;
//1.从map中删除用户的连接信息
{
lock_guard<mutex> lock(_connMutex);
for(auto it=_userConnMap.begin();it!=_userConnMap.end();++it)
{
if(it->second==conn)
{
user.setId(it->first);
_userConnMap.erase(it);
break;
}
}
}
//2.更新用户状态信息 user表中状态改为offline
if(user.getId() != -1)
{
user.setState("offline");
_userModel.updateState(user);
}
}

2.onConnection

1
2
3
4
5
6
7
8
9
10
11
12
//chatserver.cpp
//上报连接创建关闭相关信息的回调函数
void ChatServer::onConnection(const TcpConnectionPtr& conn)
{
//用户断开连接的情况
if(!conn->connected())
{
ChatService::instance()->clientCloseExecption(conn);
//释放sockfd资源
conn->shutdown();
}
}

3.测试

启动Chatserver后

在另一个终端输入以下内容

1
2
3
4
5
telnet 127.0.0.1 6000
{"msgid":1,"id":1,"password":"123456"}
ctrl+]//模拟异常退出
回车
quit

image-20250119175733000

image-20250119175741497

在登录后,状态变为online

异常退出后状态变为offline

image-20250119175951799

4.记录一下gdb使用

1
2
3
4
gdb ChatServer
break chatservice.cpp:135
# 源文件:断点行号
r #运行