1 Star 0 Fork 0

周不才/cpp_linux study

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
TcpServer.hpp 3.13 KB
一键复制 编辑 原始数据 按行查看 历史
周不才 提交于 2025-03-26 19:15 +08:00 . NetworkComputer_CustomProtocol_V3
//服务端类声明和定义
#pragma once
#include <iostream>
#include <functional>
#include <pthread.h>//提供线程相关函数
#include "Socket.hpp"//提供socket编程接口
using namespace socket_ns;
class TcpServer
{
private:
uint16_t _port;//端口号
std::shared_ptr<Socket> _listensock;//Socket对象,包含监听套接字
bool _isrunning;
std::function<void(std::shared_ptr<Socket>,InetAddr)> _service;//业务处理函数(线程启动函数)
public:
//构造函数
TcpServer(uint16_t port,std::function<void(std::shared_ptr<Socket>,InetAddr)> service)
:_port(port),
_listensock(std::make_shared<TcpSocket>()),//子类对象传递给父类指针
_isrunning(false),
_service(service)
{
_listensock->StartListening(_port);//服务端开始监听
}
//内部类
class ThreadData
{
public:
TcpServer* _self;//TcpServer类指针,用于调用_service
std::shared_ptr<Socket> _readwritesock;//Socket对象,包含读写套接字
InetAddr _clientaddr;//客户端地址信息
public:
//有参构造函数
ThreadData(TcpServer* self, std::shared_ptr<Socket> readwritesock, InetAddr _clientaddr)
:_self(self),
_readwritesock(readwritesock),
_clientaddr(_clientaddr)
{}
};
//服务端循环执行
void Loop()
{
_isrunning=true;
while(_isrunning)
{
//服务端接收客户端连接
InetAddr clientaddr;//保存连接到的客户端地址信息
std::shared_ptr<Socket> readwritesock=_listensock->Accept(&clientaddr);//接收客户端连接,连接成功的话获取到Socket对象,包含读写套接字
if(readwritesock==nullptr)//连接失败,重新连接
{
continue;
}
//由于线程启动函数在类内定义必须设置为静态函数,但是静态函数无法调用非静态成员_service
//因此定义一个内部类,封装TcpServer类对象指针
//将该内部类作为参数传递给线程启动函数,让封装TcpServer类对象指针调用_service
//同时_service函数对象的参数要求是 Socket对象+客户端地址信息
//所以要将Socket对象(包含读写套接字文件描述符)和 连接到的客户端地址信息也封装到内部类中,一并传递给线程启动函数
//多线程执行
pthread_t tid;//线程id
ThreadData* td=new ThreadData(this,readwritesock,clientaddr);
pthread_create(&tid,nullptr,Execute,(void*)td);
}
_isrunning=false;
}
//线程启动函数
static void* Execute(void* args)
{
pthread_detach(pthread_self());//线程分离
ThreadData* td=static_cast<ThreadData*>(args);//强制类型转换
td->_self->_service(td->_readwritesock,td->_clientaddr);//线程调用业务处理函数
td->_readwritesock->CloseSocket();//业务处理完毕,关闭套接字
delete td;//销毁内部类对象
return nullptr;
}
};
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/yan0605/cpp_linux-study.git
git@gitee.com:yan0605/cpp_linux-study.git
yan0605
cpp_linux-study
cpp_linux study
master

搜索帮助