代码拉取完成,页面将自动刷新
//
// 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;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。