C++搭建集群聊天室(十一):客户端 || 服务器 异常退出解决方案
2023-09-14 09:15:27 时间
客户端异常退出
此前我们对客户端退出的操作仅仅就是将连接释放掉,但是既然加入了新的业务,受业务影响,客户端的退出就不能是这么简单的处理了。
打开 chatserver.cpp ,原先是这样的:
void ChatServer::onConnection(const TcpConnectionPtr &conn){
if(!conn->connected()){ //用户断开连接
conn->shutdown();
}
}
现在是这样的:
void ChatServer::onConnection(const TcpConnectionPtr &conn){
if(!conn->connected()){ //用户断开连接
ChatService::instance()->clientCloseException(conn);
conn->shutdown();
}
}
打开 chatservice.cpp ,实现 clientCloseException 函数,函数声明该加的自己加。
void ChatService::clientCloseException(const TcpConnectionPtr &conn){
User user;
{
//以conn从哈希表中倒查主键id
lock_guard<mutex> lock(_connMutex);
for(auto it = _userConnMap.begin();it!=_userConnMap.end();){
if(it->second == conn){
//更改用户状态
user.setID(it->first);
//从hash表删除用户信息
_userConnMap.erase(it);
break;
}
else{
it++;
}
}
}
//数据持久化
if(user.getID() != -1){
user.setstate("offline"); //再细一点
_usermodel.updateState(user);
}
}
客户端的异常退出影响相对较小,顶多就是一台客户端的再连接异常,但是服务器的异常退出问题就大了,那会是一批客户端的再链接异常。
服务端异常退出
在 usermodel 里面写一个重置的函数。
void UserModel::resetstate()
{
// 1.组装sql语句
char sql[1024] = "update user set state = 'offline' where state = 'online'";
MySQL mysql;
if (mysql.connect())
{
mysql.update(sql);
}
}
函数声明里面自行配置。
在chatservice中去调用这个方法:
void ChatService::reset(){
//把所有online状态的用户转为offline
_usermodel.resetstate();
}
函数声明里面自行配置。
在main函数中设置信号捕捉:
#include<iostream>
#include<signal.h>
#include "chatserver.hpp"
#include "chatservice.hpp"
using namespace std;
void resetHandler(int){ //这个int就算你不用也加上
ChatService::instance()->reset();
exit(0);
}
int main(){
//捕捉 Ctrl+C 信号
signal(SIGINT,resetHandler);
EventLoop loop;
InetAddress addr("127.0.0.1",7000);
ChatServer server(&loop,addr,"ChatServer");
server.start();
loop.loop();
return 0;
}
相关文章
- C++虚析构函数的使用
- 服务器设计笔记(2)-----定时器的实现(C++)
- About Cast in C++(C++中的类型转换)
- linux C++ 获取服务器外网IP地址(使用系统调用system)
- EasyDSS RTMP流媒体服务器的HTTP接口query url的C++实现方法
- C++ <windows.h>库函数探究初步续一:键鼠操作
- C/C++每日一练(20230326) 二叉树专场(3)
- C/C++ 取整函数ceil(),floor()
- windows-qt 使用mingw编译c++boost并使用
- C++ STL算法
- Ubuntu20.04下,qt交叉编译报错::15: warning: identifier ‘nullptr‘ is a keyword in C++11 [-Wc++0x-compat]
- C++之epoll监听输入(替代select)(七十九)
- C++ Primer读书笔记——3.字符串、向量和数组
- C/C++学习笔记十二 Input and Output (I/O)(5)
- OpenCV5(C++)版本docker容器服务器配置分享
- C/C++/Linux/PostgreSQL 高性能服务器开发技术博文分类汇总(持续更新...)
- C/C++学习路线总结与分享
- C#、C++、Java、Python选择哪个好?