当前位置: 首页 > news >正文

C++基于select和epoll的TCP服务器

select版本

服务器

#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <string>
#include <pthread.h>
#include <sys/select.h>
#include <stdio.h>
int main()
{int flag=0;struct sockaddr_in saddr;saddr.sin_port = htons(8999);saddr.sin_addr.s_addr = INADDR_ANY;saddr.sin_family = AF_INET;int sfd = socket(AF_INET, SOCK_STREAM, 0);if (sfd == -1){perror("socket error");return 1;}int optvalue;setsockopt(sfd, SOL_SOCKET, SO_REUSEPORT, &optvalue,sizeof(int));//设置端口复用flag = bind(sfd, (struct sockaddr*)&saddr, sizeof(struct sockaddr_in));if (flag == -1){perror("bind error");return 1;}flag=listen(sfd, 100);if(flag==-1){perror("listen error");return 1;}fd_set readset,tmp;FD_ZERO(&readset);FD_SET(sfd,&readset);int nfds=sfd;while (1){tmp=readset;//每一次tmp的值都会被内核修改,所以要用readset重制flag=select(nfds+1,&tmp,NULL,NULL,NULL);//异常和写集合一般不检测if(flag==-1){perror("select error");continue;}for(int i=sfd;i<=nfds;i++)//i可以从0开始,但是会做几次多余判断{int port;if(i==sfd&&FD_ISSET(i,&tmp))//判断监听套接字是否满足条件{struct sockaddr_in caddr;int clen=sizeof(caddr);int cfd = accept(sfd, (struct sockaddr*)&caddr, (socklen_t*)&clen);port=ntohs(caddr.sin_port);if (cfd == -1){perror("accept error");continue;}char ip[1024]={'\0'};//必须加上,不然解析IP会失败printf("接收到了客户端%s:%d的连接\n",inet_ntop(AF_INET,&caddr.sin_addr,ip,1024),port);FD_SET(cfd,&readset);//将通信套接字加入文件描述符表nfds=nfds>cfd?nfds:cfd;//更新ndfs}else//判断是否有满足条件的通信套接字{if(FD_ISSET(i,&tmp)){char buf[1024] = {'\0'};flag = recv(i, buf, 1024, 0);if (flag==-1){perror("read error");break;}else if(flag==0){printf("连接断开\n");FD_CLR(i,&readset);close(i);}else{printf("从客户端收到数据:%s\n",buf);std::string sendstr="服务器收到了"+std::to_string(port)+"的数据";flag = send(i, sendstr.c_str(), sendstr.length(), 0);if (flag == -1){perror("send error");}memset(buf, 0, 1024);}}}}}close(sfd);return 0;
}

客户端

#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <string>int main()
{int flag;struct sockaddr_in* caddr=(struct sockaddr_in*)malloc(sizeof(struct sockaddr_in));inet_pton(AF_INET, "192.168.101.231", &caddr->sin_addr.s_addr);caddr->sin_family = AF_INET;caddr->sin_port = htons(8999);int cfd = socket(AF_INET, SOCK_STREAM, 0);if (cfd == -1){perror("socket error");return 1;}int addrlen=sizeof(struct sockaddr);int i=0;flag= connect(cfd, (struct sockaddr*)caddr, addrlen);//caddr就是指针类型if (flag == -1){perror("connect error");return 1;}while(1){char buf[1024] = {'\0'};std::string sendstr="我是客户端"+std::to_string(getpid())+"发送了数据"+std::to_string(i);flag = send(cfd,  sendstr.c_str(), sendstr.length(),0);if (flag == -1){perror("send error");continue;}printf("send:%s\n", sendstr.c_str());flag = recv(cfd, buf, 1024, 0);if (flag == -1){perror("recv error");continue;}printf("客户端收到数据:%s\n", buf);memset(buf, 0, 1024);i++;sleep(1);}close(cfd);return 0;
}

epoll

服务器

int main()
{int flag=0;struct sockaddr_in saddr;saddr.sin_port = htons(8999);saddr.sin_addr.s_addr = INADDR_ANY;saddr.sin_family = AF_INET;int sfd = socket(AF_INET, SOCK_STREAM, 0);if (sfd == -1){perror("socket error");return 1;}int optvalue;setsockopt(sfd, SOL_SOCKET, SO_REUSEPORT, &optvalue,sizeof(int));//设置端口复用flag = bind(sfd, (struct sockaddr*)&saddr, sizeof(struct sockaddr_in));if (flag == -1){perror("bind error");return 1;}flag=listen(sfd, 100);if(flag==-1){perror("listen error");return 1;}int epfd=epoll_create(1);struct epoll_event ev;ev.data.fd=sfd;ev.events=EPOLLIN;flag=epoll_ctl(epfd,EPOLL_CTL_ADD,sfd,&ev);struct epoll_event revents[1024];while (1){int num=epoll_wait(epfd,revents,1024,-1);if(num==-1){perror("epoll wait error");continue;}for(int i=0;i<num;i++){int port;int curfd=revents[i].data.fd;if(curfd==sfd)//判断监听套接字是否满足条件{struct sockaddr_in caddr;int clen=sizeof(caddr);int cfd = accept(sfd, (struct sockaddr*)&caddr, (socklen_t*)&clen);port=ntohs(caddr.sin_port);if (cfd == -1){perror("accept error");continue;}char ip[1024]={'\0'};//必须加上,不然解析IP会失败printf("接收到了客户端%s:%d的连接\n",inet_ntop(AF_INET,&caddr.sin_addr,ip,1024),port);ev.data.fd=cfd;ev.events=EPOLLIN;epoll_ctl(epfd,EPOLL_CTL_ADD,cfd,&ev);}else//判断是否有满足条件的通信套接字{char buf[1024] = {'\0'};flag = recv(curfd, buf, 1024, 0);if (flag==-1){perror("recv error");break;}else if(flag==0){printf("连接断开\n");epoll_ctl(epfd,EPOLL_CTL_DEL,curfd,NULL);close(curfd);}else{printf("从客户端收到数据:%s\n",buf);std::string sendstr="服务器收到了"+std::to_string(port)+"的数据";flag = send(curfd, sendstr.c_str(), sendstr.length(), 0);if (flag == -1){perror("send error");}memset(buf, 0, 1024);}}}}close(sfd);return 0;
}

相关文章:

C++基于select和epoll的TCP服务器

select版本 服务器 #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <string> #include <pthread.h> #include <sys/select…...

SpringBoot 读取配置文件的4种方式

文章目录 1. Value 注解读取单个属性2. 使用 ConfigurationProperties 注解3. 通过 Environment 对象读取属性4. 使用 PropertySource 注解加载额外的配置文件 在 Spring Boot 中&#xff0c;application.yml 文件用于配置应用程序的属性&#xff0c;Spring Boot 默认会从 src/…...

【车载开发系列】ParaSoft单元测试环境配置(三)

【车载开发系列】ParaSoft单元测试环境配置(三) 【车载开发系列】ParaSoft单元测试环境配置(三) 【车载开发系列】ParaSoft单元测试环境配置(三)一. 去插桩设置Step1:静态解析代码Step2:编辑Parasoft文件Step3:确认去插桩二. 新增测试用例Step1:生成测试用例Step2:执…...

如何让Threejs的canvas背景透明?

在Three.js中&#xff0c;要让Canvas的背景透明&#xff0c;只显示场景中的模型或物体&#xff0c;有两个关键点&#xff1a; 一、对渲染器&#xff08;Renderer&#xff09;进行alpha为true配置&#xff1b; 二、通过CSS设置&#xff0c;使canvas设定为透明背景模式。 以下是代…...

Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法

Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法 Text-to-SQL 任务旨在将自然语言查询转换为结构化查询语言(SQL),从而使非专业用户能够便捷地访问和操作数据库。近期,阿里云的 OpenSearch 引擎凭借其一致性对齐技术,在当前极具影响力的 Text-to-SQL 任务…...

[性能]高速收发的TCP/MQTT通信

Nagle算法‌是一种TCP/IP协议中的优化算法&#xff0c;旨在减少小数据包的数量&#xff0c;从而减少网络拥塞的可能性。该算法规定&#xff0c;在一个TCP连接上最多只能有一个未被确认的小分组。当数据被发送后&#xff0c;如果收到确认&#xff08;ACK&#xff09;之前&#x…...

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3568移植案例(下)

往期知识点记录&#xff1a; OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——轻量系统STM32F407芯片移植案例 OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——Combo解决方案之W800芯片移植案例 OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——小型系统STM32M…...

网络安全学习(五)Burpsuite实战

bp功能确实强大&#xff0c;记录一个bp手机验证码的实例。 当然&#xff0c;首先要打开bp&#xff0c;设置好浏览器的代理。 浏览器访问实例网址www.xxx.com&#xff08;隐藏真实网址&#xff09;。 真实网址有个注册功能&#xff0c;需要手机验证码。 好的&#xff0c;我们…...

ego-planner开源代码之simulator.xml介绍分析

ego-planner开源代码之simulator.xml介绍&分析 1. 源由2. simulator配置2.1 配置入参2.2 mockamap_node 地图生成节点2.3 quadrotor_simulator_so3 四旋翼仿真节点2.4 Nodelet机制 四旋翼控制节点2.5 odom_visualization 里程计数据2.6 pcl_render_node 本地感知 3. 总结 1…...

论文阅读笔记 --- 图模互补:知识图谱与大模型融合综述 --- 按参考文献整理

Large Language Models’ Understanding of Math: Source Criticism and Extrapolation Submitted on 12 Nov 2023大模型在处理结构化推理方面&#xff08;如解决数学问题[99]&#xff09;表现不佳 Tree of Thoughts: Deliberate Problem Solving with Large Language Models S…...

Cpp类和对象(上)(3)

文章目录 前言一、面向过程与面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及类的封装类的访问限定符类的封装 五、类的作用域(类域)六、类的实例化七、类对象模型如何计算类对象的大小类对象的存储方式猜测 八、this指针this指针的引出this指针的特性 九、C语言…...

【微信小程序】连续拍照功能实现

前言&#xff1a; 最近在使用uniapp开发微信小程序&#xff0c;遇到这样一个需求&#xff0c;用户想要连续拍照&#xff0c;拍完之后可以删除照片&#xff0c;保留自己想要的照片&#xff0c;然后上传到服务器上。由于原生的方法只能一个个拍照上传&#xff0c;所以只能自己通过…...

JavaSE:11、内部类

学习 资源1 学习资源 2 1、成员内部类 import com.test.*;public class Main {public static void main(String [] argv){Person personnew Person();//Person构造函数Person.Woman womanperson.new Woman();//woman构造函数} }package com.test;public class Person {publ…...

VTD激光雷达(7)——07_OptiX_Variables_Advanced

文章目录 前言一、总结 前言 一、 1 和上图蓝绿的区别在于 总结...

运维工程师面试整理-自动化运维

自动化运维是现代运维工作中不可或缺的一部分,它可以大幅提升效率,减少人为错误,并使得大规模环境管理变得可行。在面试中,面试官通常会通过自动化运维相关的问题来评估你在自动化工具使用、脚本编写、CI/CD 实践以及系统监控等方面的能力。以下是关于自动化运维的详细内容…...

【JAVA基础】实现Tomcat基本功能

文章目录 TCP/IP协议Socket编程ServletTomcat 在搜索了两三天之后&#xff0c;也是大概弄懂了Tomcat是个什么东西&#xff0c;我们在说Tomcat之前&#xff0c;先来了解一下下面这三个东西&#xff1a; TCP/IP协议 TCP/IP 是互联网通信的基础协议。TCP&#xff08;传输控制协议…...

风力发电叶片缺陷检测数据集

风力发电叶片缺陷检测数据集】nc: 4 names: [Burn Mark, Coating_defects, Crack, EROSION ] 名称&#xff1a;【烧伤痕迹, 涂层缺陷, 裂缝&#xff0c;侵蚀】共1095张&#xff0c;8:1:1比例划分&#xff0c;&#xff08;train;876张&#xff0c;val&#xff1a;109张&#xff…...

数据类型自动转换的解决方案

数据类型自动转换的解决方案 java8、jdk8背景 为方便测试框架数据处理以及方便查看一些数据&#xff0c;弄了一个工具类&#xff0c;部分要点简要说明。 主要涉及到字符串与其他类型的相互转换&#xff0c;无其他类型之间的相互转换。 轻量测试框架实现与使用的总篇可见此文…...

大厂校招:唯品会Java面试题及参考答案

SortedSet 的原理 SortedSet 是一个有序的集合接口,它继承自 Set 接口。在 Java 中,常见的实现类有 TreeSet。 TreeSet 实现了 SortedSet 接口,它使用红黑树来维护集合中元素的有序性。红黑树是一种自平衡的二叉搜索树,具有以下特点: 每个节点要么是红色,要么是黑色。根节…...

Qt常用控件——QLCDNumber

文章目录 QLCDNumber核心属性倒计时小程序倒计时小程序相关问题 QLCDNumber核心属性 QLCDNumber是专门用来显示数字的控件&#xff0c;类似于这样&#xff1a; 属性说明intValue获取的数字值(int).value获取的数字值(double)和intValue是联动的例如value设为1.5&#xff0c;in…...

实时口罩检测系统性能优化:从算法到工程全链路调优

实时口罩检测系统性能优化&#xff1a;从算法到工程全链路调优 1. 引言 在公共场所疫情防控中&#xff0c;实时口罩检测系统发挥着重要作用。但在实际部署中&#xff0c;很多开发者会遇到性能瓶颈&#xff1a;检测速度跟不上视频流帧率、GPU资源占用过高、误报漏报频发等问题…...

祝贺电影《得闲谨制》荣获2026亚洲艺术电影节 六项提名

电影《得闲谨制》荣获2026亚洲艺术电影节「金海燕奖」主竞赛单元六项提名&#xff1a; 祝贺导演孔笙 提名最佳导演&#xff1b; 祝贺编剧伍千万里四十八 提名最佳编剧&#xff1b; 祝贺演员肖战 提名最佳男主角&#xff1b; 祝贺演员尹正 提名最佳男配角&#xff1b; 祝贺美术指…...

AI浪潮冲击下,前端该何去何从

&#x1f30a; 初级前端工程师&#xff1a;向“深水区”扎根技能树与学习路径定位&#xff1a;面向初级前端开发工程师&#xff0c;聚焦底层原理、工程化思维与可验证的实战输出&#xff0c;构建 AI 时代不可替代的技术护城河。&#x1f4d0; 核心原则&#xff08;避坑指南&…...

Neeshck-Z-lmage_LYX_v2多场景落地:LoRA动态加载赋能数字人直播背景实时生成系统

Neeshck-Z-lmage_LYX_v2多场景落地&#xff1a;LoRA动态加载赋能数字人直播背景实时生成系统 1. 项目简介&#xff1a;一个专为本地绘画优化的轻量级工具 如果你对AI绘画感兴趣&#xff0c;特别是想体验国产的Z-Image文生图模型&#xff0c;但又被复杂的部署流程、繁琐的参数…...

突破限速:8大网盘直链解析方案全解析

突破限速&#xff1a;8大网盘直链解析方案全解析 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改&#xff08;改自6.1.4版本&#xff09; &#xff0c;自用&#xff0c;去推广&#xff0c;无需输入“…...

foobar2000皮肤焕新:用foobox-cn打造沉浸式音乐体验

foobar2000皮肤焕新&#xff1a;用foobox-cn打造沉浸式音乐体验 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 作为音乐爱好者&#xff0c;你是否也曾因foobar2000默认界面的单调乏味而却步&#xf…...

QT5实战:如何用QTreeView打造层级分明的下拉菜单(附完整代码)

QT5实战&#xff1a;用QTreeView构建层级下拉菜单的工程化实现 在桌面应用开发中&#xff0c;标准的下拉菜单往往难以应对复杂的层级数据展示需求。想象一下文件浏览器中的树形目录、多级分类的商品筛选器&#xff0c;或是组织架构中的部门-人员选择场景——这些都需要更强大的…...

5分钟搞定!Clipy剪贴板管理神器让Mac效率翻倍

5分钟搞定&#xff01;Clipy剪贴板管理神器让Mac效率翻倍 【免费下载链接】Clipy Clipboard extension app for macOS. 项目地址: https://gitcode.com/gh_mirrors/cl/Clipy 还在为macOS只能记住最后一次复制内容而烦恼吗&#xff1f;Clipy是一款专为Mac用户设计的剪贴板…...

别再让单片机‘死机’!手把手教你用TPV6823设计一个靠谱的硬件看门狗电路

嵌入式系统守护者&#xff1a;TPV6823硬件看门狗电路实战指南 当电机控制板在工厂车间突然停止响应&#xff0c;或是工业传感器在雷雨天气后持续报错&#xff0c;许多工程师的第一反应往往是"程序又跑飞了"。这种嵌入式系统运行失控的现象&#xff0c;就像一台无人看…...

终极指南:如何利用 babel-loader 与 @babel/preset-env 实现现代浏览器智能编译

终极指南&#xff1a;如何利用 babel-loader 与 babel/preset-env 实现现代浏览器智能编译 【免费下载链接】babel-loader &#x1f4e6; Babel loader for webpack 项目地址: https://gitcode.com/gh_mirrors/ba/babel-loader 在现代前端开发中&#xff0c;JavaScript …...