加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
TcpServer.cpp 1.74 KB
一键复制 编辑 原始数据 按行查看 历史
cvPorter 提交于 2024-06-26 16:00 . 提交版
//
// Created by 22100 on 2024/5/13.
//
#include <sys/socket.h>
#include "TcpServer.h"
#include "exceptionTip.h"
#include <arpa/inet.h>
#include "Log.h"
#include "TcpConnection.h"
TcpServer::TcpServer(unsigned short port, int threadNum) {
//m_lfd = -1;
m_port = port;
m_mainLoop = new EventLoop;
m_threadNum = threadNum;
m_threadPool = new ThreadPool(m_mainLoop, threadNum);
setListen();
}
void TcpServer::setListen() {
// 1 创建监听的fd
m_lfd = socket(AF_INET, SOCK_STREAM, 0);
exceptionTip(m_lfd, "socket");
// 2 设置端口复用
int opt = 1;
int ret = setsockopt(m_lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof opt);
exceptionTip(ret, "setsockopt");
// 3 绑定ip, 端口
struct sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(m_port);
addr.sin_addr.s_addr = INADDR_ANY;
ret = bind(m_lfd, (struct sockaddr*) &addr, sizeof addr);
exceptionTip(ret, "bind");
// 4 设置监听
ret = listen(m_lfd, 128);
exceptionTip(ret, "listen");
}
void TcpServer::run() {
Debug("服务器程序已经启动");
m_threadPool->run(); // 启动线程池
// 添加检测任务
auto* channel = new Channel(m_lfd, FDEvent::ReadEvent, acceptConnection, nullptr, nullptr, this);
m_mainLoop->addTask(channel, ElemType::ADD);
// 启动反应堆模型
m_mainLoop->run();
}
int TcpServer::acceptConnection(void *arg) {
auto* tcpServer = static_cast<TcpServer*>(arg);
// 和客户端建立连接
int cfd = accept(tcpServer->m_lfd, NULL, NULL);
// 从线程池取出一个子线程的反应堆实例, 去处理这个cfd
EventLoop* evLoop = tcpServer->m_threadPool->takeWorkerEventLoop();
// TODO 将cfd放到TcpConnection中进行处理 这里后序如何对资源的释放?
new TcpConnection(cfd, evLoop);
return 0;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化