reactor介绍以及reactor实现自发自送TCP服务器
Reactor 的概念Reactor 是一种设计模式用于处理并发事件驱动的系统。它通过将事件分派给对应的处理程序Handler来响应多个并发请求通常用于网络服务器、高性能I/O框架等场景。核心思想是使用单线程或有限线程监听多个事件源如Socket连接通过事件循环Event Loop实现非阻塞处理。采用Reactor将并发请求从I/O管理转变为事件管理。主要通过采用不同的I/O事件对应不同的回调函数来实现。Reactor 的工作流程注册事件将事件源如Socket及其对应的处理器注册到事件多路复用器。事件循环循环调用事件多路复用器如epoll_wait监听就绪事件。事件分发将就绪事件分发给绑定的处理器执行具体逻辑如读取数据、处理请求。C通过Reactor实现TCP“回声”服务器以端口号8000为例通过reactor实现一个简单的TCP服务器实现“回声”功能将客户端发来的数据原样返回。#define PORT 8000 #define BUFFERLENGTH 1024 #define CONN_SIZE 1048576 typedef int(*RCALLBACK)(int fd); int epfd 0; int accept_cb(int fd); int send_cb(int fd); int recv_cb(int fd); struct conn{ int fd; char rbuffer[BUFFERLENGTH]; int rlength; char wbuffer[BUFFERLENGTH]; int wlength; // POLLOUT RCALLBACK send_callback; // POLLIN union{ RCALLBACK accept_callback; RCALLBACK recv_callback; }r_action; }; struct conn conn_list[CONN_SIZE] {0}; // 定义事件设定 int set_event(int fd, int event, int flag){ if(flag 1){ struct epoll_event ev; ev.events event; ev.data.fd fd; epoll_ctl(epfd, EPOLL_CTL_ADD, fd, ev); }else{ struct epoll_event ev; ev.events event; ev.data.fd fd; epoll_ctl(epfd, EPOLL_CTL_MOD, fd, ev); } } // 首先定义注册事件 int event_register(int fd, int event){ if(fd 0) return -1; conn_list[fd].fd fd; conn_list[fd].send_callback send_cb; conn_list[fd].r_action.recv_callback recv_cb; memset(conn_list[fd].rbuffer, 0, BUFFERLENGTH); conn_list[fd].rlength 0; memset(conn_list[fd].wbuffer, 0, BUFFERLENGTH); conn_list[fd].wlength 0; set_event(fd, event, 1); return 0; } // 设定接收客户端的回调函数 int accept_cb(int fd){ struct sockaddr_in clientaddr; socklen_t len sizeof(clientaddr); int clientfd accept(fd, (struct*) clientaddr, len); if(clientfd0) return -1; event_register(clientfd, EPOLLIN); return 0; } int recv_cb(int fd){ int count recv(fd, conn_list[fd].rbuffer, BUFFERLENGTH, 0); if(count 0){ close(fd); epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL); return 0; } conn_list[fd].rlength count; conn_list[fd].wlength conn_list[fd].rlength; memcpy(conn_list[fd].wbuffer, conn_list[fd].rbuffer, conn_list[fd].wlength); set_event(fd, EPOLLOUT, 0); return 0; } int send_cb(int fd){ memset(conn_list[fd].rbuffer, 0, BUFFERLENGTH); int count send(fd, conn_list[fd].wbuffer, conn_list[fd].wlength, 0); set_event(fd, EPOLLIN, 0); return count; } int init_server(unsigned short port){ int sockfd socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in serveraddr; serveraddr.sin_family AF_INET; serveraddr.sin_addr.s_addr htonl(INADDY_ANY); serveraddr.sin_port htons(port); if(-1 bind(sockfd, (struct sockaddr*)serveraddr, sizeof(struct sockaddr))){ printf(bind error:%s\n, strerror(errno)); return -1; } listen(sockfd, 10); return sockfd; } int main(){ epfd epoll_create(1); int sockfd init_server(PORT); conn_list[sockfd].fd sockfd; conn_list[sockfd].r_action.recv_callback accept_cb; set_event(sockfd, EPOLLIN, 0); while(1){ struct epoll_event events[1024] {0}; int nready epoll_wait(epfd, events, 1024, -1); int i; for(i 0;i nready; i){ int connfd events[i].data.fd; if(events[i].events EPOLLIN){ conn_list[connfd].r_action.recv_callback(connfd); } if(events[i].events EPOLLOUT){ conn_list[connfd].send_callback(connfd); } } } }首先定义reactor结构体包括fd、event、写入的参数rbuffer、rlength读取的参数wbuffer、rlength。以及包括接收新的客户端accept_callback发送数据的回调函数send_callback以及接收数据的回调函数recv_callback。首先创建epoll实例对目标端口进行监听。之后通过epoll_wait等待事件就绪从而实现TCP服务器自发自送。Reactor写法的优点高可扩展性通过回调函数如accept_cb、recv_cb分离协议处理新增协议或修改逻辑只需替换对应回调无需改动事件循环主体。连接状态管理每个连接独立持有状态缓冲区、数据长度、回调指针便于处理部分收发、连接级超时、多步协议等复杂场景避免数据丢失。统一的事件驱动模型所有 I/O 事件接受连接、读写、错误集中处理易于添加定时器、信号等额外事件源。

相关新闻

C++27 <mdspan>与USTRUCT内存布局冲突?UE6.5.3已静默修复但未文档化!附3行Patch代码+UnrealBuildTool自定义规则注入教程

C++27 <mdspan>与USTRUCT内存布局冲突?UE6.5.3已静默修复但未文档化!附3行Patch代码+UnrealBuildTool自定义规则注入教程

第一章&#xff1a;C27 与UE6.5.3 USTRUCT内存布局冲突的本质溯源核心矛盾&#xff1a;非标准对齐与隐式填充的不可调和性 C27 引入的 <mdspan> 要求底层容器提供连续、无间隙、按秩&#xff08;rank&#xff09;严格对齐的原始内存视图&#xff0c;其 layout_right 等策…

2026/7/5 4:40:45 阅读更多 →
基于javaweb和mysql的ssm公开课记录管理系统(java+ssm+html+javascript+jsp+mysql)

基于javaweb和mysql的ssm公开课记录管理系统(java+ssm+html+javascript+jsp+mysql)

基于javaweb和mysql的ssm公开课记录管理系统(javassmhtmljavascriptjspmysql) 私信源码获取及调试交流 私信源码获取及调试交流 运行环境 Java≥8、MySQL≥5.7、Tomcat≥8 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计&#xff0c;大作业&#xff0c…

2026/5/17 10:20:21 阅读更多 →
调用嵌入模型

调用嵌入模型

1、使用官方教程里调用嵌入模型的API的方式 https://docs.langchain.com/oss/python/integrations/text_embedding 2、下载ModelScope里的嵌入模型&#xff0c;本地调用 https://modelscope.cn/models

2026/5/17 10:20:18 阅读更多 →

最新新闻

反射型XSS漏洞实战:从原理到防御的完整攻防指南

反射型XSS漏洞实战:从原理到防御的完整攻防指南

1. 项目概述&#xff1a;一次关于Web安全核心威胁的深度剖析最近在内部安全审计和众测项目中&#xff0c;反射型XSS&#xff08;跨站脚本攻击&#xff09;依然是出现频率极高且危害巨大的漏洞。很多开发者&#xff0c;甚至是一些有一定经验的工程师&#xff0c;仍然会低估一个看…

2026/7/5 4:39:17 阅读更多 →
Codex实战指南:从环境配置到高阶用法,打造你的AI编程副驾

Codex实战指南:从环境配置到高阶用法,打造你的AI编程副驾

&#x1f680; 30款热门AI模型一站整合&#xff0c;DeepSeek/GLM/Qwen 随心用&#xff0c;限时 5 折。 &#x1f449; 点击领海量免费额度 最近在整理本地开发环境时&#xff0c;我翻出了几个几个月前写的脚本&#xff0c;发现里面有些函数逻辑写得相当“奔放”&#xff0c;…

2026/7/5 4:37:17 阅读更多 →
ParsecVDisplay终极指南:免费创建Windows虚拟显示器的完整方案

ParsecVDisplay终极指南:免费创建Windows虚拟显示器的完整方案

ParsecVDisplay终极指南&#xff1a;免费创建Windows虚拟显示器的完整方案 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 想要在Windows电脑上扩展显示空间却不想购买昂贵的物理…

2026/7/5 4:37:17 阅读更多 →
Ketcher架构深度解析:基于Web的化学结构编辑器技术实现与工程实践

Ketcher架构深度解析:基于Web的化学结构编辑器技术实现与工程实践

Ketcher架构深度解析&#xff1a;基于Web的化学结构编辑器技术实现与工程实践 【免费下载链接】ketcher Web-based molecule sketcher 项目地址: https://gitcode.com/gh_mirrors/ke/ketcher Ketcher作为一款现代化的Web化学结构编辑器&#xff0c;其技术架构体现了对复…

2026/7/5 4:33:16 阅读更多 →
抖店AI标题优化怎么用标题违规和低质标题怎么改

抖店AI标题优化怎么用标题违规和低质标题怎么改

抖店AI标题优化怎么用&#xff1f;标题违规和低质标题怎么改 抖店商品标题写不好&#xff0c;会影响审核、搜索理解和买家点击。很多商家从 1688 搬标题时&#xff0c;原标题里带批发词、品牌词、极限词、无关热词&#xff0c;直接上架容易违规&#xff0c;也不一定适合抖店买家…

2026/7/5 4:29:15 阅读更多 →
如何3分钟完成通达信缠论插件部署:终极自动化分析指南

如何3分钟完成通达信缠论插件部署:终极自动化分析指南

如何3分钟完成通达信缠论插件部署&#xff1a;终极自动化分析指南 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 还在为复杂的缠论分析而烦恼吗&#xff1f;面对繁琐的笔段划分和中枢识别&#xff0c;传…

2026/7/5 4:27:15 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools&#xff1a;5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里&#xff0c;参与了关于混合后量子密码学的讨论&#xff0c;应付端点攻击找茬的人&#xff0c;还参与留言板讨论后&#xff0c;发现“威胁模型”对多数人仍是陌生概念&#xff0c;且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”&#xff1a;我理解的渗透测试到底是什么&#xff1f;每次看到新闻里说某个大公司的数据被“黑”了&#xff0c;或者某个网站被攻击导致服务瘫痪&#xff0c;你是不是和我一样&#xff0c;心里会冒出两个念头&#xff1a;一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻