epoll服务端和客户端示例代码
epoll 服务端demo
#include <stdio.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <netdb.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>#define MAX_EVENTS 20
#define BUFFER_LEN 512
#define IP_ADDR "192.168.1.3"
#define SERVER_PORT 8081static int set_socket_non_blocking(int f) {int flags, s;flags = fcntl(f, F_GETFL, 0);if (-1 == flags) {perror("get fd status error");return -1;}flags |= O_NONBLOCK;s = fcntl(f, F_SETFL, flags);if (s == -1){perror("set fd status error");return -1;}return 0;
}int main() {int listenfd = 0, epfd = 0;int result = 0;struct epoll_event ev, events[MAX_EVENTS];struct sockaddr_in server_addr = {0};listenfd = socket(AF_INET, SOCK_STREAM, 0);if (-1 == listenfd) {perror("open listen socket");return -1;}int on = 1;result = setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));if (-1 == result) {perror("set socket");return -1;}server_addr.sin_family = AF_INET;inet_aton(IP_ADDR, &(server_addr.sin_addr));server_addr.sin_port = htons(SERVER_PORT);result = bind(listenfd, (const struct sockaddr*)&server_addr, sizeof(server_addr));if (result == -1) {perror("bind socket");return -1;}result = set_socket_non_blocking(listenfd);if (result == -1) {printf("set socket non blocking failed\n");return -1;}result = listen(listenfd, 200);if (-1 == result) {perror("start listen");return -1;}epfd = epoll_create1(0);if (1 == epfd) {perror("create epoll instance");return -1;}ev.data.fd = listenfd;ev.events = EPOLLIN | EPOLLET;result = epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &ev);if (-1 == result) {perror("set epoll ctl");return -1;}for (; ;) {int wait_count = 0;wait_count = epoll_wait(epfd, events, MAX_EVENTS, -1);for (int i = 0; i < wait_count; i++) {uint32_t event = events[i].events;char host_buf[NI_MAXHOST];char port_buf[NI_MAXSERV];int _result;if ((event & EPOLLERR) || (event & EPOLLHUP) || (!(event & EPOLLIN))) {printf("epoll has error\n");close(events[i].data.fd);continue;} else if (listenfd == events[i].data.fd) {for (; ;) {struct sockaddr in_addr = {0};socklen_t in_addr_len = sizeof(in_addr);int accp_fd = accept(listenfd, &in_addr, &in_addr_len);if (-1 == accp_fd) {perror("accept");break;}_result = getnameinfo(&in_addr, sizeof(in_addr),host_buf, sizeof(host_buf) / sizeof(host_buf[0]),port_buf, sizeof(port_buf) / sizeof(port_buf[0]),NI_NUMERICHOST | NI_NUMERICSERV);if (!_result) {printf("new connection: host = %s, port = %s\n", host_buf, port_buf);}_result = set_socket_non_blocking(accp_fd);if (-1 == _result) {printf("set accept fd failed\n");return 0;}ev.data.fd = accp_fd;ev.events = EPOLLIN | EPOLLET;_result = epoll_ctl(epfd, EPOLL_CTL_ADD, accp_fd, &ev);if (-1 == _result) {perror("epoll ctl");return 0;}}continue;} else {int done = 0;for ( ; ; ) {ssize_t result_len = 0;char buf[BUFFER_LEN] = {0};result_len = read(events[i].data.fd, buf, sizeof(buf) / sizeof(buf[0]));if (-1 == result_len) {if (EAGAIN != errno) {perror("read data");done = 1;}break;} else if (!result_len) {done = 1;break;}if (strlen(buf) == 0)continue;for (int m = 0; buf[m] != '\0'; m++) {buf[m] = toupper(buf[m]);}write(events[i].data.fd, buf, result_len);}if (done) {printf("closed connection\n");close(events[i].data.fd);}}}}close(epfd);return 0;
}
epoll客户端demo
#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 <arpa/inet.h>
#include <signal.h>#define BUFFER_SIZE 1024
#define IP_ADDR "192.168.1.2"
#define SERVER_PORT 8081int sockfd = -1;
void sigctl(int sig) {if (sockfd != -1) {close(sockfd);}printf("bye, will exit ...\n");exit(0);
}int main() {struct sockaddr_in st_clnsock;char msg[BUFFER_SIZE] = {0};int recv_size = 0;signal(SIGINT, sigctl);if ((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;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(SERVER_PORT);if (connect(sockfd, (struct sockaddr *)&st_clnsock, sizeof(st_clnsock)) < 0) {printf("connect error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}while (1) {memset(msg, 0, sizeof(msg));fgets(msg, BUFFER_SIZE, stdin);if (write(sockfd, msg, sizeof(msg)) < 0) {printf("write error: %s (errno: %d)\n", strerror(errno), errno);exit(0);}memset(msg, 0, sizeof(msg));if ((recv_size = read(sockfd, msg, BUFFER_SIZE)) < 0) {printf("read error: %s (errno: %d)\n", strerror(errno), errno);} else if (recv_size == 0) {printf("server closed\n");} else {printf("server return: %s\n", msg);}}return 0;
}
相关文章:
epoll服务端和客户端示例代码
epoll 服务端demo #include <stdio.h> #include <sys/epoll.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <fcntl.h> #include <unistd.h> #include <ne…...
最大乘积和-第13届蓝桥杯省赛Python真题精选
[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第85讲。 最大乘积和&#…...
探索C嘎嘎的奇妙世界:第四关---引用与内联函数
1 引用: 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 #include<iostream> using namespace std;int main() {int a 0;// 引用:…...
DLS平台:惠誉全球经济展望——今年调增至2.6%,明年调减!
摘要 尽管全球货币政策逐渐转向宽松,惠誉国际评级(Fitch Ratings)在最新的《全球经济展望》中对2024年全球经济增长进行了上调。然而,由于美国经济增速放缓和其他因素的影响,2025年的全球经济增长预期则被下调。这篇文…...
数据结构习题
第一章 绪论 与数据元素本身的形式、内容、相对位置、个数无关的是数据的 逻辑结构。 第二章 线性表 在一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为 63.5。 n/2 单链表的存储密度 小于1。 创建一个包括n个结点的有序单链…...
交通银行软件开发工程师校招面试经历
本文介绍2024届春招中,交通银行总行的软件开发工程师岗位1场面试的基本情况、提问问题等。 2024年04月投递了交通银行总行的软件开发工程师岗位,暂时不清楚所在部门。目前完成了一面,并进入体检阶段;在这里记录一下面试的相关经历…...
bashrc和profile区别
作用与目的: .bashrc:这个文件主要用于配置和自定义用户的终端环境和行为。每次启动新的终端时,.bashrc文件都会被执行,加载用户设置的环境变量、别名、函数等。这使得用户能够根据自己的喜好和需求来定制终端的行为和外观。profi…...
BC153 [NOIP2010]数字统计
数字统计 一.题目描述二.输入描述:三.输出描述:四.数字范围五.题目思路六.代码实现 一.题目描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。 比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次…...
浅谈LavelDB
简介 LevelDB 是一个开源的轻量级键值存储库,由 Google 开发,用于提供快速的键值存储和支持读写大量数据。LevelDB 具有高性能、快速的读取和写入速度以及支持原子操作的特点,适合用于需要高效存储和检索键值数据的场景。 LevelDB 主要特点…...
Google Earth Engine(GEE)——NDVI的时间序列分析和在线出图
函数: ui.Chart.array.values(array, axis, xLabels) Generates a Chart from an array. Plots separate series for each 1-D vector along the given axis. - X-axis = Array index along axis, optionally labeled by xLabels. - Y-axis = Value. - Series = Vector, d…...
谈吐的艺术(三)
不是要逼人屈服,而只是想请人遵守规定。 0可能遇到的问题 在快餐店买到的汉堡和薯条都是凉的,跟店员理论的时候对方却说味道没有不对。怎么说才能维护自己的权利呢? 更好的说法:“我想问一下,按照你们的规定,食品退换…...
pop链详细分析、构造(以[NISACTF 2022]babyserialize为例)
目录 [NISACTF 2022]babyserialize (一)理清pop链(链尾 链头),标注步骤 1. 先找eval、flag这些危险函数和关键字样(这是链尾) 2.往eval()上面看 3.往$bb()上面看 4.往strtolower()上面看 …...
使用超声波麦克风阵列预测数控机床刀具磨损
预测性维护是使用传感器数据来推断机器状态,并从这些传感器数据中检测出在故障发生之前存在的缺陷或故障的过程。预测性维护在所有工业领域都是一种日益增长的趋势,包括轴承故障检测、齿轮磨损检测或往复式机器中的活塞磨损等许多其他例子。在预测性维护…...
怎么控制多个存储设备的访问权限?数据安全存储方案来了
数据安全存储是指将数据以安全的方式存储在存储系统中,以确保数据的机密性、完整性和可用性。要控制数据安全存储的权限以保障安全,可以采取以下措施: 访问控制列表(ACLs):使用ACLs来定义对存储数据的访问权…...
麒麟系统mate_indicators进程占用内存资源高
一、问题现象 故障现象:环境出现内存溢出 操作系统:KYlin10-SP2 二、问题定位 发现mate-indicators进程占用内存资源达到节点总内存40%,导致服务出现内存熔断 临时解决 systemctl restart lightdm.service systemctl set-default multi-u…...
Docker高级篇之轻量化可视化工具Portainer
文章目录 1. 简介2. Portainer安装 1. 简介 Portianer是一款轻量级的应用,它提供了图形化界面,用于方便管理Docker环境,包括单机环境和集成环境。 2. Portainer安装 官网:https://www.portainer.io 这里我们使用docker命令安装&…...
Vue32-挂载流程
一、init阶段 生命周期本质是函数。 1-1、beforeCreate函数 注意: 此时vue没有_data,即:data中的数据没有收到。 1-2、create函数 二、生成虚拟DOM阶段 注意: 因为没有template选项,所以,整个div root都…...
算法金 | 一个强大的算法模型:t-SNE !!
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种用于降维和数据可视化的非线性算法。它被广泛应用于…...
用IAST工具强化“越权检测”能力,提升系统安全性
什么是越权漏洞 越权漏洞是一种常见的逻辑安全漏洞。越权漏洞指的是攻击者利用系统中的漏洞,获得超过其正常权限的访问权限,执行未授权操作。 越权漏洞主要分为两种类型:水平越权(横向越权)和垂直越权(纵…...
VirtualStudio配置QT开发环境
环境 VirtualStudio2022Qt5.12.10 安装msvc工具链(这一步不是必须的) 打开virtual studio,打开Virtual Studio Installer界面选择要安装的msvc版本,点击安装 安装VirtualStudio扩展 在线安装 打开virtual Studio,…...
给嵌入式新手的ST7789驱动避坑指南:从SPI模式到RGB565显示的完整配置流程
给嵌入式新手的ST7789驱动避坑指南:从SPI模式到RGB565显示的完整配置流程 第一次接触ST7789液晶驱动芯片时,面对厚厚的数据手册和复杂的时序图,很多嵌入式新手都会感到无从下手。本文将带你一步步拆解ST7789的驱动过程,从SPI模式配…...
从协作机器人到手术刀:深入拆解阻抗/导纳控制在真实工业与医疗场景下的选型指南
从协作机器人到手术刀:深入拆解阻抗/导纳控制在真实工业与医疗场景下的选型指南 当UR10e协作机器人的机械臂以0.1毫米的重复定位精度在汽车底盘上完成螺栓锁付时,当达芬奇手术机器人的EndoWrist器械在跳动的心脏表面完成微米级血管缝合时,背后…...
Qwen2.5-VL-Ollama效果对比:vs Qwen2-VL在图表理解与定位精度提升
Qwen2.5-VL-Ollama效果对比:vs Qwen2-VL在图表理解与定位精度提升 1. 引言:从Qwen2-VL到Qwen2.5-VL的进化 如果你之前用过Qwen2-VL,可能会觉得它已经很强了——能看懂图片,能回答问题,基本的多模态任务都能搞定。但用…...
Avalonia11 Canvas拖拽与动态渲染保姆级教程:从MVVM绑定到事件处理完整流程
Avalonia11 Canvas拖拽与动态渲染实战:构建高性能迷你地图导航系统 在复杂的图形界面应用中,迷你地图导航已经成为提升用户体验的标准配置。想象一下,当你在处理一张超大的设计图纸或地图时,如何快速定位到感兴趣的局部区域&#…...
提升arduino开发效率:用快马平台一键生成常用工具模块代码
作为一名经常折腾Arduino的开发者,我发现在项目开发中,总有些重复性的代码需要反复编写。最近尝试用InsCode(快马)平台来生成这些常用工具模块,效率提升非常明显。今天就把我的实践心得分享给大家。 I2C设备扫描功能 在连接多个I2C设备时&…...
博科光纤交换机命令行配置实战:从基础查询到高级Zone管理
1. 博科光纤交换机基础入门 第一次接触博科光纤交换机的命令行界面时,我完全被那一串串看似复杂的命令搞懵了。但经过几个项目的实战后,我发现只要掌握几个核心命令,就能轻松完成大部分日常管理工作。让我们从最基础的IP地址查询开始…...
Ultimate Vocal Remover GUI:免费AI音频分离神器完整使用指南
Ultimate Vocal Remover GUI:免费AI音频分离神器完整使用指南 【免费下载链接】ultimatevocalremovergui 使用深度神经网络的声音消除器的图形用户界面。 项目地址: https://gitcode.com/GitHub_Trending/ul/ultimatevocalremovergui 想要从歌曲中提取纯净人…...
突破Windows 7系统限制:Python 3.9+版本的创新兼容方案
突破Windows 7系统限制:Python 3.9版本的创新兼容方案 【免费下载链接】PythonVista Python 3.9 installers that support Windows 7 SP1 and Windows Server 2008 R2 项目地址: https://gitcode.com/gh_mirrors/py/PythonVista 一、经典系统的现代Python支持…...
如何通过3阶段实现Windows无缝安装APK?革新性工具APK Installer全解析
如何通过3阶段实现Windows无缝安装APK?革新性工具APK Installer全解析 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在Windows系统上运行Android应用一直…...
云端存储本地化革新:从0到1掌握s3fs-fuse文件系统映射技术
云端存储本地化革新:从0到1掌握s3fs-fuse文件系统映射技术 【免费下载链接】s3fs-fuse FUSE-based file system backed by Amazon S3 项目地址: https://gitcode.com/gh_mirrors/s3/s3fs-fuse 在云计算时代,如何让云端存储像本地硬盘一样便捷访问…...
