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/7/5 5:27:06 阅读更多 →
调用嵌入模型

调用嵌入模型

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

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

最新新闻

深度实战指南:君正T31平台OpenIPC固件部署与优化技巧

深度实战指南:君正T31平台OpenIPC固件部署与优化技巧

深度实战指南&#xff1a;君正T31平台OpenIPC固件部署与优化技巧 【免费下载链接】firmware Alternative IP Camera firmware from an open community 项目地址: https://gitcode.com/gh_mirrors/fir/firmware OpenIPC是一款基于Buildroot的开源IP摄像头固件项目&#x…

2026/7/5 5:29:41 阅读更多 →
5个核心功能全面解析:LSLib工具包助你轻松处理神界原罪与博德之门3游戏文件

5个核心功能全面解析:LSLib工具包助你轻松处理神界原罪与博德之门3游戏文件

5个核心功能全面解析&#xff1a;LSLib工具包助你轻松处理神界原罪与博德之门3游戏文件 【免费下载链接】lslib Tools for manipulating Divinity Original Sin and Baldurs Gate 3 files 项目地址: https://gitcode.com/gh_mirrors/ls/lslib LSLib是一个强大的开源工具…

2026/7/5 5:27:40 阅读更多 →
终极Koodo Reader故障排除指南:15个常见问题快速解决方案

终极Koodo Reader故障排除指南:15个常见问题快速解决方案

终极Koodo Reader故障排除指南&#xff1a;15个常见问题快速解决方案 【免费下载链接】koodo-reader A modern ebook manager and reader with sync and backup capacities for Windows, macOS, Linux, Android, iOS and Web 项目地址: https://gitcode.com/GitHub_Trending/…

2026/7/5 5:25:40 阅读更多 →
3步搭建个人哔咔漫画离线图书馆:告别网络卡顿,下载速度提升300%

3步搭建个人哔咔漫画离线图书馆:告别网络卡顿,下载速度提升300%

3步搭建个人哔咔漫画离线图书馆&#xff1a;告别网络卡顿&#xff0c;下载速度提升300% 【免费下载链接】picacomic-downloader 哔咔漫画 picacomic pica漫画 bika漫画 PicACG 多线程下载器&#xff0c;带图形界面 带收藏夹&#xff0c;已打包exe 下载速度飞快 项目地址: htt…

2026/7/5 5:21:40 阅读更多 →
MySQL数据视图学习笔记

MySQL数据视图学习笔记

1. 什么是视图&#xff1f;视图是数据库的虚拟表&#xff0c;不存储真实数据&#xff0c;仅保存一条预编译的SELECT查询语句。每次查询视图时&#xff0c;数据库会动态执行这条SQL&#xff0c;从关联的底层数据表中实时计算并返回结果。视图相当于给底层数据表开了一扇“观景窗…

2026/7/5 5:19:36 阅读更多 →
DDrawCompat完整指南:如何让经典Windows游戏在现代系统上流畅运行

DDrawCompat完整指南:如何让经典Windows游戏在现代系统上流畅运行

DDrawCompat完整指南&#xff1a;如何让经典Windows游戏在现代系统上流畅运行 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirror…

2026/7/5 5:19:36 阅读更多 →

日新闻

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 阅读更多 →

月新闻