2023.7.30(epoll实现并发服务器)
服务器
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#define ERR(msg) \do { \printf("%s %s %d:", __FILE__, __func__, __LINE__); \perror(msg); \exit(-1); \} while (0)
//端口号的网络字节序 1024~49151
#define PORT 6666 //设置端口号6666
#define IP "192.168.250.100"//设置本机IP
#define N 32
int main(int argc, char* argv[])
{// 1.创建红黑树int epfd = epoll_create(1);if (epfd < 0) {ERR("epfd err");}// 2.创建套接字int socketfd;if (-1 == (socketfd = socket(AF_INET, SOCK_STREAM, 0))) {ERR("socket error");}// 3.struct epoll_event eventstruct epoll_event event;event.events = EPOLLIN | EPOLLET;event.data.fd = socketfd;if (epoll_ctl(epfd, EPOLL_CTL_ADD, socketfd, &event) < 0) {ERR("epoll_ctl error");}// 填充服务器地址struct sockaddr_in serveraddr, clientaddr;serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(PORT);serveraddr.sin_addr.s_addr = inet_addr(IP);socklen_t serveraddr_len = sizeof(serveraddr);socklen_t clientaddr_len = sizeof(clientaddr_len);// 绑定if (bind(socketfd, (struct sockaddr*)&serveraddr, serveraddr_len) < 0) {ERR("bind error");}// 监听if (listen(socketfd, 10) < 0) {ERR("listen errorG");}int acceptfd, ret, i;int bytes;struct epoll_event events[20];char buf[N] = {0};while (1) {//使用epoll_wait 检测文件描述符是否发生ret = epoll_wait(epfd, events, 20, -1);if (ret > 0) {for (i = 0; i < ret; i++) {// 判断文件描述符数量if (events[i].data.fd == socketfd) {// 判断对应文件描述符的IO类型if (events[i].events & EPOLLIN) {acceptfd = accept(events[i].data.fd, (struct sockaddr*)&clientaddr, &clientaddr_len);if (acceptfd < 0) {ERR("accept error");}printf("IP:%s 连接成功\n", (char*)inet_ntoa(clientaddr.sin_addr));// 将新客户端通信套接字挂到树上struct epoll_event event;event.events = EPOLLIN | EPOLLET;event.data.fd = acceptfd;if (epoll_ctl(epfd, EPOLL_CTL_ADD, acceptfd, &event) < 0) {ERR("epoll_ctl err");}}} else {// 处理客户端信息if (EPOLLIN & events[i].events == EPOLLIN) {memset(buf, 0, sizeof(buf));if (-1 == (bytes = recv(events[i].data.fd, buf, sizeof(buf), 0))) {ERR("recv error");} else if (bytes == 0) {// 客户端断开信息printf("acceptfd:%d 断开连接\n", events[i].data.fd);// 关闭对应文件描述符close(events[i].data.fd);// 实现对于epoll的控制epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL);}else {printf("buf:%s\n", buf);}if (-1 == send(events[i].data.fd, buf, N, 0)) {ERR("send error");}}}}} else {ERR("epoll_wait error");}}close(socketfd);return 0;
客户端
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>#define ERR(msg) \do { \printf("%s %s %d:", __FILE__, __func__, __LINE__); \perror(msg); \exit(-1); \} while (0)#define N 32
//端口号网络字节序
#define PORT 6666
#define IP "192.168.250.100"
int main(int argc, const char* argv[])
{// 1.创建套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (-1 == sockfd) {ERR("socket error");}// 2.填充服务器网络信息结构体struct sockaddr_in serveraddr;memset(&serveraddr, 0, sizeof(serveraddr));serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(PORT);serveraddr.sin_addr.s_addr = inet_addr(IP);socklen_t serveraddr_len = sizeof(serveraddr);char buf[N] = {0};int res = 0;// 3.尝试与服务器建立连接if (-1 == connect(sockfd, (struct sockaddr*)&serveraddr, serveraddr_len)) {ERR("connect error");}printf("与服务器建立连接成功..\n");while (1) {memset(buf, 0, sizeof(buf));fgets(buf, N, stdin);buf[strlen(buf) - 1] = '\0'; //清理结尾的\n//发送数据if (-1 == send(sockfd, buf, sizeof(buf), 0)) {ERR("send error");}//接收服务器的应答信息if (-1 == (res = recv(sockfd, buf, sizeof(buf), 0))) {ERR("recv error");}if (0 == res) {break;}//输出应答信息printf("应答为:[%s]\n", buf);}//关闭套接字close(sockfd);return 0;}
相关文章:
2023.7.30(epoll实现并发服务器)
服务器 #include <arpa/inet.h> #include <netinet/in.h> #include <netinet/ip.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/epoll.h> #include <sys/socket.h> #include <sys/types.…...
小研究 - 基于解析树的 Java Web 灰盒模糊测试(一)
由于 Java Web 应用业务场景复杂, 且对输入数据的结构有效性要求较高, 现有的测试方法和工具在测试Java Web 时存在测试用例的有效率较低的问题. 为了解决上述问题, 本文提出了基于解析树的 Java Web 应用灰盒模糊测试方法. 首先为 Java Web 应用程序的输入数据包进行语法建模创…...
SpringBoot接手JSP项目--【JSB项目实战】
SpringBoot系列文章目录 SpringBoot知识范围-学习步骤【JSB系列之000】 文章目录 SpringBoot系列文章目录[TOC](文章目录) SpringBoot技术很多很多工作之初,面临JSP的老项目我要怎么办环境及工具:项目里可能要用到的技术JSPjstl其它的必要知识 上代码WE…...
Python模块psycopg2连接postgresql
目录 1. 基础语法 2. 基础用法 3. 多条SQL 4. 事务SQL 1. 基础语法 语法 psycopg2.connect(dsn #指定连接参数。可以使用参数形式或 DSN 形式指定。host #指定连接数据库的主机名。dbname #指定数据库名。user #指定连接数据库使用的用户名。…...
Kotlin基础(八):泛型
前言 本文主要讲解kotlin泛型,主要包括泛型基础,类型变异,类型投射,星号投射,泛型函数,泛型约束,泛型在Android中的使用。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 泛型基…...
Java学习笔记——(10)环境变量path配置及其作用
环境变量的作用为了在 Dos 的任务目录,可以去使用 javac 和 java开发工具命令 先配置 JAVA_HOME 指向 jdk 安装的主目录(避免开发中出现问题) 编辑 path 环境变量(开发环境),增加 %JAVA_HOME%\bin 编辑 path 环境变量(运行环境…...
【图像去噪】基于进化算法——自组织迁移算法(SOMA)的图像去噪研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
TMS WEB Core Crack,TMS软件Delphi组件RADical Web
TMS WEB Core Crack,TMS软件Delphi组件RADical Web 使用我们的现代web应用程序框架,可以节省宝贵的时间并创造丰富的用户体验。我们所有的工具都由经验丰富的开发人员组成的专门团队提供支持。您可以信赖卓越的服务、活跃的社区和我们不断的创新。TMS Software是您的…...
PHP使用Redis实战实录4:单例模式和面向过程操作redis的语法
PHP使用Redis实战实录系列 PHP使用Redis实战实录1:宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案PHP使用Redis实战实录2:Redis扩展方法和PHP连接Redis的多种方案PHP使用Redis实战实录3:数据类型比较、大小限制和性能扩展PHP使用Re…...
解决:移动端H5的<video>初始化拿不到总时长
移动端 在<video>的初始化后,会调用如下事件。 canplay"canplay" 解决方案:<video>添加自动播放属性: autoplay"autoplay" 然后这个方法里,用js在0.01秒后主动关闭播放,接着在0.…...
百度云上传身份证获取身份信息封装
1.目录结构 -script_discerm ------------包 -discerm.py --------------主要逻辑 -__init__.py -id_care---------------文件夹 存放图片 2.安装模块 pip install urllib31.23 pip install requests pip install base64 3.各文件内容 2.1 discerm.py import jsonimpo…...
vscode 上cmake 版本过低
问题: 装了vscode中的camke插件后,报错如下: CMake 3.9 or higher is required. You are running version 3.3.2。 解决办法: 卸载掉插件的cmake。 到官网下载合适的版本,设置系统变量 然后重新下载camke tools&…...
OS-08-事件驱动:C10M是如何实现的?
08-事件驱动:C10M是如何实现的? 你好,我是陶辉。 上一讲介绍了广播与组播这种一对多通讯方式,从这一讲开始,我们回到主流的一对一通讯方式。 早些年我们谈到高并发,总是会提到C10K,这是指服务…...
mysql 主从同步排查和处理 Slave_IO、Slave_SQL
目录 查看主从是否同步 详解Slave_IO、Slave_SQL 判断主从完全同步 各个 Log_File 和 Log_Pos的关系 修复命令 查看主从是否同步 show slave status; Slave_IO_Running、Slave_SQL_Running,这两个值是Yes表示正常,No是异常 使用竖排显示…...
基于解析法和遗传算法相结合的配电网多台分布式电源降损配置(Matlab实现)
目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量(解析法) 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…...
07mysql查询语句之子查询
#1.查询和Zlotkey相同部门的员工姓名和工资 SELECT last_name,salary FROM employees WHERE department_id IN ( SELECT department_id FROM employees WHERE last_name Zlotkey ); #2.查询工资比公司平均工资高的员工的员工号࿰…...
笙默考试管理系统-MyExamTest(22)
笙默考试管理系统-MyExamTest(22) 目录 一、 笙默考试管理系统-MyExamTest 二、 笙默考试管理系统-MyExamTest 三、 笙默考试管理系统-MyExamTest 四、 笙默考试管理系统-MyExamTest 五、 笙默考试管理系统-MyExamTest 笙默考试管理系统-MyExa…...
Windows 不同方式打开的cmd/dos窗口属性配置不同
文章目录 1. 默认值(控制台窗口)属性2. "C:\Windows\System32\cmd.exe" 属性3. "命令提示符"属性4. 自定义某标题cmd窗口属性5. cmd快捷方式的属性总结 最近在写某个批处理脚本时,意外发现 Windows系统中,在不…...
性能优化-webpack配置gzip
3步搞定,实测1.3Mjs压缩到363k,体积减少70% 1.装包 yarn add compression-webpack-plugin --dev 2.配置webpack 打开config/webpack.config.js 1)在 module.exports 导出函数前面引入插件 // gzip插件 const CompressionPlugin require(&qu…...
RabbitMQ 教程 | 第3章 客户端开发向导
👨🏻💻 热爱摄影的程序员 👨🏻🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…...
wechatferry 高级技巧:如何实现AI驱动的智能对话机器人
wechatferry 高级技巧:如何实现AI驱动的智能对话机器人 【免费下载链接】wechatferry - 项目地址: https://gitcode.com/gh_mirrors/wec/wechatferry WechatFerry 是一款功能强大的微信机器人底层框架,通过 Node 生态下的第三方客户端实现&#x…...
3分钟实现GitHub界面汉化:浏览器插件让GitHub说中文
3分钟实现GitHub界面汉化:浏览器插件让GitHub说中文 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 你是否曾因GitHub的英…...
本地 AI 编码助手从 0 配起来:先选模型,再接 Ollama、VS Code、Claude Code 和 Codex
配本地 AI 编码助手,我现在最不建议的做法,就是打开 Ollama 以后直接搜一个最大模型下载。 这条路我踩过。 模型能跑起来,不代表能写代码。能写一个函数,不代表能进项目改文件。能在终端里回一句话,也不代表 Claude …...
企业微信外部群如何通过 API 自动化投递结构化小程序卡片
能力介绍 相比于传统的文字链接,结构化的小程序卡片拥有更高的点击率和更规范的视觉展现。该能力允许开发者通过主动调用 API,直接向指定的企业微信外部群投递原生小程序卡片。接口支持自定义动态配置小程序的 appid、首屏页面路径 pagepath(…...
手把手教你用高云FPGA的Video Frame Buffer IP搞定OV7725摄像头到HDMI显示(附源码)
高云FPGA视频处理实战:OV7725摄像头数据缓存与HDMI输出全解析 在嵌入式视觉系统开发中,FPGA因其并行处理能力和低延迟特性,成为实时视频处理的理想选择。高云FPGA作为国产芯片的代表,其Video Frame Buffer等硬核IP为开发者提供了高…...
别再手动画图了!用Mermaid+Markdown在VSCode里5分钟搞定UML设计文档
用文本驱动设计:现代开发者的UML高效实践指南 在技术文档中清晰表达系统设计是每个开发者的必修课。传统UML工具往往需要频繁切换鼠标键盘,拖拽调整元素位置,保存后再手动插入文档——这种工作流不仅低效,更让设计文档与代码库脱节…...
从单机到团队协作:手把手教你用SVN在Windows上搭建个人小型项目版本库(含汉化与日常使用图解)
从单机到团队协作:Windows环境下SVN轻量化部署与实战指南 在个人开发和小型团队协作中,版本控制是保证代码安全和团队高效协作的基石。对于Windows平台的开发者而言,SVN(Subversion)以其简单可靠的特点,成为…...
别再死记硬背了!用Unity可视化工具一步步拆解A*寻路算法(附完整C#源码)
用Unity可视化工具玩转A*寻路算法:从理论到实战的沉浸式学习 在游戏开发的世界里,路径规划算法就像是一位隐形的向导,决定着NPC如何绕过障碍物找到玩家,或是战略游戏中单位如何选择最优行军路线。A*算法作为其中最耀眼的明星&…...
Vue-antd样式系统深度解析:从主题定制到组件样式覆盖的完整指南
Vue-antd样式系统深度解析:从主题定制到组件样式覆盖的完整指南 【免费下载链接】vue-antd Vue UI Component & Ant.Design 项目地址: https://gitcode.com/gh_mirrors/vu/vue-antd Vue-antd作为Ant Design的Vue实现,提供了一个强大而灵活的样…...
CookieCloud终极指南:一劳永逸解决多设备登录烦恼的完整方案
CookieCloud终极指南:一劳永逸解决多设备登录烦恼的完整方案 【免费下载链接】CookieCloud CookieCloud是一个和自架服务器同步浏览器Cookie和LocalStorage的小工具,支持端对端加密,可设定同步时间间隔。本仓库包含了插件和服务器端源码。Coo…...
