Ai
3 Star 18 Fork 6

John Yet/SMSS安全通讯框架

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
sms_server.cpp 3.44 KB
一键复制 编辑 原始数据 按行查看 历史
John Yet 提交于 2021-01-02 19:21 +08:00 . 调整部分代码
#include "sms_server.h"
#include "event2/event.h"
#include <cstring>
#include <iostream>
#include <QDebug>
#include "threadmanager.h"
using namespace std;
void SmsServer::SConnListenerCb(struct evconnlistener *listen, evutil_socket_t sock, struct sockaddr *addr, int len, void *ctx)
{
// 解析客户端ip
char ip[16] = {0};
sockaddr_in *addr_in = (sockaddr_in *)addr;
evutil_inet_ntop(AF_INET, &addr_in->sin_addr, ip, sizeof(ip));
SmsServer *server = (SmsServer *)ctx;
// 不同的连接归属不同
auto it = server->listener_map_.find(listen);
if(it != server->listener_map_.end())
{
ServiceInfo si = it->second;
qInfo("[%s]连接应用[%s]成功", ip, si.name.c_str());
server->thread_manager_map_[si.name]->CreateConnection(sock);
}
}
SmsServer::SmsServer()
: backlog_(64)
{
}
SmsServer::~SmsServer()
{
Stop();
}
thread *SmsServer::GetThread() const
{
return dispatch_thread_;
}
bool SmsServer::Init()
{
// 创建事件循环
ev_base_ = event_base_new();
if (!ev_base_)
{
return false;
}
list<ServiceInfo> service_info_list = AppContext::GetInstance()->GetServices();
for(auto it = service_info_list.begin(); it != service_info_list.end(); it++)
{
ServiceInfo si = *it;
unsigned short port = si.port;
sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
// 创建对应端口的监听器
evconnlistener *listener = evconnlistener_new_bind(
ev_base_,
SConnListenerCb,
this,
LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE,
this->backlog_,
(sockaddr *)&sin,
sizeof(sin));
if (!listener)
{
return false;
}
ThreadManager *tm = new ThreadManager(si.thread_num);
if(!si.crt.empty() && !si.key.empty())
{
if(!tm->InitSSLCtx(si.crt.c_str(), si.key.c_str()))
{
return false;
}
}
if(!tm->Init())
{
return false;
}
thread_manager_map_[si.name] = tm;
listener_map_[listener] = si;
qInfo("%s 已经初始化, 线程数%d", si.name.c_str(), si.thread_num);
}
qInfo("服务端初始化完成,等待客户端连接...");
return true;
}
void SmsServer::Start()
{
if (!dispatch_thread_)
{
server_quit_ = false;
// 在线程中分发
dispatch_thread_ = new thread(&SmsServer::Dispatch, this);
}
}
void SmsServer::Stop()
{
if (dispatch_thread_)
{
// 退出线程和事件循环
server_quit_ = true;
dispatch_thread_->join();
delete dispatch_thread_;
dispatch_thread_ = nullptr;
}
for(auto it = thread_manager_map_.begin(); it != thread_manager_map_.end();)
{
ThreadManager* tm = it->second;
tm->ExitSafety();
thread_manager_map_.erase(it);
it++;
}
}
void SmsServer::Dispatch()
{
// 事件分发并循环处理
while (!server_quit_)
{
event_base_loop(ev_base_, EVLOOP_NONBLOCK);
this_thread::sleep_for(chrono::milliseconds(10));
}
for(auto it = listener_map_.begin(); it != listener_map_.end(); it++)
{
// 关闭listener
evconnlistener_free(it->first);
}
// 关闭event_base
event_base_free(ev_base_);
ev_base_ = nullptr;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/learnhow/encrypted_stream.git
git@gitee.com:learnhow/encrypted_stream.git
learnhow
encrypted_stream
SMSS安全通讯框架
2.0

搜索帮助