基于epoll的TCP服务器端(C++)
网络编程——C++实现socket通信(TCP)高并发之epoll模式_tcp通信c++ 多客户端epoll_n大橘为重n的博客-CSDN博客
网络编程——C++实现socket通信(TCP)高并发之select模式_n大橘为重n的博客-CSDN博客
server.cpp
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <ctype.h>
#include <sys/epoll.h> //epoll头文件#define MAXSIZE 1024
#define IP_ADDR "127.0.0.1"
#define IP_PORT 8888int main()
{int i_listenfd, i_connfd;struct sockaddr_in st_sersock;char msg[MAXSIZE];int nrecvSize = 0;struct epoll_event ev, events[MAXSIZE];int epfd, nCounts; //epfd:epoll实例句柄, nCounts:epoll_wait返回值if((i_listenfd = socket(AF_INET, SOCK_STREAM, 0) ) < 0) //建立socket套接字{printf("socket Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}memset(&st_sersock, 0, sizeof(st_sersock));st_sersock.sin_family = AF_INET; //IPv4协议st_sersock.sin_addr.s_addr = htonl(INADDR_ANY); //INADDR_ANY转换过来就是0.0.0.0,泛指本机的意思,也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思。st_sersock.sin_port = htons(IP_PORT);if(bind(i_listenfd,(struct sockaddr*)&st_sersock, sizeof(st_sersock)) < 0) //将套接字绑定IP和端口用于监听{printf("bind Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}if(listen(i_listenfd, 20) < 0) //设定可同时排队的客户端最大连接个数{printf("listen Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}if((epfd = epoll_create(MAXSIZE)) < 0) //创建epoll实例{printf("epoll_create Error: %s (errno: %d)\n", strerror(errno), errno);exit(-1);}ev.events = EPOLLIN;ev.data.fd = i_listenfd;if(epoll_ctl(epfd, EPOLL_CTL_ADD, i_listenfd, &ev) < 0){printf("epoll_ctl Error: %s (errno: %d)\n", strerror(errno), errno);exit(-1);}printf("======waiting for client's request======\n");//准备接受客户端连接while(1){if((nCounts = epoll_wait(epfd, events, MAXSIZE, -1)) < 0){printf("epoll_ctl Error: %s (errno: %d)\n", strerror(errno), errno);exit(-1);}else if(nCounts == 0){printf("time out, No data!\n");}else{for(int i = 0; i < nCounts; i++){int tmp_epoll_recv_fd = events[i].data.fd;if(tmp_epoll_recv_fd == i_listenfd) //有客户端连接请求{if((i_connfd = accept(i_listenfd, (struct sockaddr*)NULL, NULL)) < 0) //阻塞等待客户端连接{printf("accept Error: %s (errno: %d)\n", strerror(errno), errno);// continue;} else{printf("Client[%d], welcome!\n", i_connfd);}ev.events = EPOLLIN;ev.data.fd = i_connfd;if(epoll_ctl(epfd, EPOLL_CTL_ADD, i_connfd, &ev) < 0){printf("epoll_ctl Error: %s (errno: %d)\n", strerror(errno), errno);exit(-1);}}else //若是已连接的客户端发来数据请求{//接受客户端发来的消息并作处理(小写转大写)后回写给客户端memset(msg, 0 ,sizeof(msg));if((nrecvSize = read(tmp_epoll_recv_fd, msg, MAXSIZE)) < 0){printf("read Error: %s (errno: %d)\n", strerror(errno), errno);continue;}else if( nrecvSize == 0) //read返回0代表对方已close断开连接。{printf("client has disconnected!\n");epoll_ctl(epfd, EPOLL_CTL_DEL, tmp_epoll_recv_fd, NULL);close(tmp_epoll_recv_fd); //continue;}else{printf("recvMsg:%s", msg);for(int i=0; msg[i] != '\0'; i++){msg[i] = toupper(msg[i]);}if(write(tmp_epoll_recv_fd, msg, strlen(msg)+1) < 0){printf("write Error: %s (errno: %d)\n", strerror(errno), errno);}}}}}}//whileclose(i_listenfd);close(epfd);return 0;
}
client.cpp
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <signal.h>
#include <arpa/inet.h>#define MAXSIZE 1024
#define IP_ADDR "127.0.0.1"
#define IP_PORT 8888int i_sockfd = -1;void SigCatch(int sigNum) //信号捕捉函数(捕获Ctrl+C)
{if(i_sockfd != -1){close(i_sockfd);}printf("Bye~! Will Exit...\n");exit(0);
}int main()
{struct sockaddr_in st_clnsock;char msg[1024];int nrecvSize = 0;signal(SIGINT, SigCatch); //注册信号捕获函数if((i_sockfd = socket(AF_INET, SOCK_STREAM, 0) ) < 0) //建立套接字{printf("socket Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}memset(&st_clnsock, 0, sizeof(st_clnsock));st_clnsock.sin_family = AF_INET; //IPv4协议//IP地址转换(直接可以从物理字节序的点分十进制 转换成网络字节序)if(inet_pton(AF_INET, IP_ADDR, &st_clnsock.sin_addr) <= 0){printf("inet_pton Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}st_clnsock.sin_port = htons(IP_PORT); //端口转换(物理字节序到网络字节序)if(connect(i_sockfd, (struct sockaddr*)&st_clnsock, sizeof(st_clnsock)) < 0) //主动向设置的IP和端口号的服务端发出连接{printf("connect Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}printf("======connect to server, sent data======\n");while(1) //循环输入,向服务端发送数据并接受服务端返回的数据{fgets(msg, MAXSIZE, stdin);printf("will send: %s", msg);if(write(i_sockfd, msg, MAXSIZE) < 0) //发送数据{printf("write Error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}memset(msg, 0, sizeof(msg));if((nrecvSize = read(i_sockfd, msg, MAXSIZE)) < 0) //接受数据{printf("read Error: %s (errno: %d)\n", strerror(errno), errno);}else if(nrecvSize == 0){printf("Service Close!\n");}else{printf("Server return: %s\n", msg);}}return 0;
}
相关文章:
基于epoll的TCP服务器端(C++)
网络编程——C实现socket通信(TCP)高并发之epoll模式_tcp通信c 多客户端epoll_n大橘为重n的博客-CSDN博客 网络编程——C实现socket通信(TCP)高并发之select模式_n大橘为重n的博客-CSDN博客 server.cpp #include <stdio.h> #include <sys/types.h> #include <…...
实时安全分析监控加强网络安全
网络犯罪分子只需几分钟,有时甚至几秒钟即可泄露敏感数据。但是,IT 团队可能无法在数周内发现这些违规行为。通常,这些违规行为是由外部方或客户发现的,到那时为时已晚。随着网络漏洞的激增,对安全分析的需求空前高涨。…...
基于ipad协议的gewe框架进行微信群组管理(二)
友情链接 geweapi.com 点击访问即可。 获取群组详情 小提示: 该接口可以一次查询20个群组查询出来的信息是不带公告的 请求URL: http://域名地址/api/group/detail 请求方式: POST 请求头: Content-Type:applica…...
大数据-玩转数据-Flink网页埋点PV统计
一、说明 衡量网站流量一个最简单的指标,就是网站的页面浏览量(Page View,PV)。用户每次打开一个页面便记录1次PV,多次打开同一页面则浏览量累计。 一般来说,PV与来访者的数量成正比,但是PV并不…...
什么是伪类选择器?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 伪类选择器⭐ 一些常见的伪类选择器示例::hover:active:focus:nth-child(n):first-child 和 :last-child ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何…...
PLY模型格式详解【3D】
本文介绍PLY 多边形文件格式,这是一种用于存储被描述为多边形集合的图形对象。 PLY文件格式的目标是提供一种简单且易于实现但通用的格式足以适用于各种模型。 PLY有两种子格式:易于入门的 ASCII 表示形式和用于紧凑存储和快速保存和加载的二进制格式。 …...
Java的反射机制、Lambda表达式和枚举
Java的反射机制、Lambda表达式和枚举 文章目录 Java的反射机制、Lambda表达式和枚举1.反射机制反射的概念、用途、优缺点反射相关的类及使用(重要!!)相关类Class类:代表类实体,表示类和接口Field类…...
数据结构:堆的实现
1.堆的概念 如果有一个关键码的集合 K { k1 ,k2 ,k3 ,…,kn },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并且 k(i) < k(i*21) 和 k(i) < k(i*22), i 0 ÿ…...
zabbix-6.4 监控 MySQL
目录 1、rpm安装zabbix_agentd服务 2、编写zabbix_agentd.conf文件 3、编写模板文件 4、创建mysql用户并赋权限 5、创建.my.cnf文件 6、将规则添加到SELinux策略中 注意: 若模板无法读取.my.cnf 信息,从而导致监控报错,可以尝试修改模…...
深入探索:解读创意的力量——idea的下载、初步使用
目录 编辑 1.IDEA的简介 2.IDEA的下载 2.1下载路径https://www.jetbrains.com/zh-cn/idea/download/?sectionwindows编辑 2.2下载的步骤 3 idea的初步使用 3.1新建一个简单的Java项目 3.1.1首先需要创建一个新的工程 3.1.2创建一个新的项目(模块&am…...
Redis详解
Redis 简介 Redis(Remote Dictionary Server)是一个开源的高性能键值对存储数据库,最初由 Salvatore Sanfilippo 开发,它在内存中存储数据,并提供了持久化功能,可以将数据保存到磁盘中,是一种N…...
【Linux】高级IO
目录 IO的基本概念 钓鱼五人组 五种IO模型 高级IO重要概念 同步通信 VS 异步通信 阻塞 VS 非阻塞 其他高级IO 阻塞IO 非阻塞IO IO的基本概念 什么是IO? I/O(input/output)也就是输入和输出,在著名的冯诺依曼体系结构当中…...
动态HTTP代理与竞争情报收集的关联
Hey,各位爬友们!作为一名专业的爬虫HTTP代理提供者,今天我要和大家聊一聊动态HTTP代理与竞争情报收集之间的关联。在这篇文章中,我将向大家解释怎么使用动态HTTP代理完成在竞争中的情报收集,并分享一些实用的技巧。 首…...
kafka基本概念及操作
kafka介绍 Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的 (replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各…...
分享个试卷去笔迹什么软件,几个步骤轻松擦除
试卷擦去笔迹是一项非常关键的技能,它可以帮助你更好地管理你的笔记和文件。不管是小伙伴们想重新测试试卷或者是将试卷输出为电子版,都可以实现的。在这篇文章中,我将分享一些方法和软件,帮助你更好地进行试卷擦除。有需要的小伙…...
ClickHouse(十八):Clickhouse Integration系列表引擎
进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 &…...
日常BUG——代码提交到了本地但是没有push,删除了本地分支如何恢复
😜作 者:是江迪呀✒️本文关键词:日常BUG、BUG、问题分析☀️每日 一言 :存在错误说明你在进步! 一、问题描述 代码在本地提交了,但是没有push到远程,然后删除了本地的分支。想要恢…...
Markdown语法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Markdown语法目录 前言1.标题2.文本样式3.列表四.图片5.链接6.目录7.代码片7.表格8.注脚9.注释10.自定义列表11.LaTeX数学公式12.插入甘特图13.插入UML图14.插入Merimaid流程…...
vue3表格,编辑案例
index.vue <script setup> import { onMounted, ref } from "vue"; import Edit from "./components/Edit.vue"; import axios from "axios";// TODO: 列表渲染 const list ref([]); const getList async () > {const res await ax…...
SQL Server Reporting Services 报错:报表服务器无法访问服务帐户的私钥
解决这个问题,有小伙伴提到可以使用命令 exec DeleteEncryptedContent 但这对这边的环境时行不通的,我在【服务账户】的配置和【数据库】的配置中到使用了域账户,试了几次都不行。改成使用内置账户就好了。具体原因还没扒拉(欢迎…...
[资料整理]魔法师传奇 MagicMayhem
魔法师传奇 Magic&Mayhem魔法师传奇中文站网站魔法师传奇2023版介绍魔法师传奇中文站网站 网站地址:魔法师传奇中文站 http://zb.l4d.top:1983/magic 备用链接:http://zb.my.to:1983/magic 论坛地址:魔法师传奇中文论坛 http://zb.l4d.t…...
零基础玩转CentOS:快马AI生成新手友好型系统管理教程
作为一个Linux新手,第一次接触CentOS系统确实有点手足无措。记得我刚安装完CentOS 8最小化系统时,面对那个黑乎乎的终端界面,完全不知道从哪里开始配置。好在最近发现了InsCode(快马)平台,它生成的CentOS入门教程特别适合我这样的…...
[具身智能-218]:针对不同编程语言和应用场景,AI自动编程擅长与不擅长之处?
AI自动编程的能力在不同编程语言和应用场景下表现出显著差异。选择合适组合,能让AI成为强大的“加速器”,反之则可能带来风险。 核心原则是:AI对主流语言和标准化任务的支持最好,而在处理底层、高性能或复杂业务逻辑时则需要人工…...
单轮车辆ABS防抱死控制Simulink仿真模型 1.可控制切换冰雪路面和开关ABS系统控制 2.仿真输出时域下的车速/轮速/制动距离/滑移率/控制信号曲线,可以配置车重/滑移率-摩擦系数曲线/主缸
单轮车辆ABS防抱死控制Simulink仿真模型 1.可控制切换冰雪路面和开关ABS系统控制 2.仿真输出时域下的车速/轮速/制动距离/滑移率/控制信号曲线,可以配置车重/滑移率-摩擦系数曲线/主缸压力/制动效能因数等参数。 3.有基础说明文档单轮车辆ABS防抱死控制Simulink仿真…...
吉他弹唱资源合集(第二辑)
吉他谱 文件大小: -内容特色: 海量吉他谱打包下载,流行经典一网打尽适用人群: 吉他初学者到进阶玩家核心价值: 省去找谱时间,直接打印练习下载链接: https://pan.quark.cn/s/7b801feec9f3 吉他教程合集 文件大小: -内容特色: 系统吉他教学视频谱例&am…...
Webpacker终极集成指南:如何与React、Vue、TypeScript完美协作
Webpacker终极集成指南:如何与React、Vue、TypeScript完美协作 【免费下载链接】webpacker Use Webpack to manage app-like JavaScript modules in Rails 项目地址: https://gitcode.com/gh_mirrors/we/webpacker Webpacker是Rails生态系统中一个革命性的工…...
从 OData 元数据到强类型前端:SAP UI5 与 TypeScript 生成服务类型定义的完整实践
在 UI5 项目里引入 TypeScript,很多团队已经能享受到编辑器补全、静态检查、重构安全这些直接收益。可一旦应用开始真正处理业务数据,一个很现实的问题就会出现:UI5 的官方类型定义覆盖了控件、模型、事件、基类 API,但你自己服务里的实体结构,像 Person、SalesOrder、Bus…...
Label Studio ML Backend架构设计与高可用机器学习服务实现深度解析
Label Studio ML Backend架构设计与高可用机器学习服务实现深度解析 【免费下载链接】label-studio-ml-backend Configs and boilerplates for Label Studios Machine Learning backend 项目地址: https://gitcode.com/gh_mirrors/la/label-studio-ml-backend Label Stu…...
5分钟快速上手:AI视频生成工具完整指南
5分钟快速上手:AI视频生成工具完整指南 【免费下载链接】auto-video-generateor 自动视频生成器,给定主题,自动生成解说视频。用户输入主题文字,系统调用大语言模型生成故事或解说的文字,然后进一步调用语音合成接口生…...
网站页面标题和描述如何设置更有利于SEO_网站标题、标题标签、副标题如何设置
网站页面标题和描述如何设置更有利于SEO_网站标题、标题标签、副标题如何设置 在当今数字化时代,网站的SEO(搜索引擎优化)至关重要。如何设置网站的页面标题和描述,不仅能提升网站的可见度,还能吸引更多的点击和流量。…...
