#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <errno.h>
#include <ctype.h>
int main()
{// 1 创建套接字int lfd = socket(AF_INET, SOCK_STREAM, 0);// 2 端口复用int opt = 1;setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));// 3 绑定struct sockaddr_in server_addr;bzero(&server_addr, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8888);server_addr.sin_addr.s_addr = htonl(INADDR_ANY);bind(lfd, (struct sockaddr*)&server_addr, sizeof(server_addr));// 4 同时访问上限listen(lfd, 128);// 5 创建epoll句柄int epfd = epoll_create(1000);
// lfd结点上树struct epoll_event tep;tep.data.fd = lfd;tep.events = EPOLLIN;epoll_ctl(epfd, EPOLL_CTL_ADD, lfd, &tep);// 6 监听读事件int cfd; // 定义lfd通信描述符struct sockaddr_in client_addr;socklen_t client_len = sizeof(client_addr); // 用于接收客户端信息struct epoll_event ep[1000]; // 用于接收变化的结点while(1){int nready = epoll_wait(epfd, ep, 1000, -1); // 阻塞等待结点变化for(int i = 0; i < nready; i++){if(!(ep[i].events & EPOLLIN))continue; // 因为只要有事件发生,就会计入ep[]中,如果不是读事件,继续循环if(ep[i].data.fd == lfd){// 是连接请求cfd = accept(lfd, (struct sockaddr*)&client_addr, &client_len);char ip[16] = {0};printf("conn from %s at %d\n", inet_ntop(AF_INET, &client_addr.sin_addr.s_addr, ip, sizeof(ip)), ntohs(client_addr.sin_port)); // 打印客户端信息// cfd 上树tep.data.fd = cfd;tep.events = EPOLLIN;epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, &tep);}else{// 普通读事件int sockfd = ep[i].data.fd;char buf[BUFSIZ] = {0};int n = read(sockfd, buf, sizeof(buf));if(n < 0) { perror("read err");epoll_ctl(epfd, EPOLL_CTL_DEL, sockfd, NULL); // 下树close(sockfd);}else if(n == 0) { printf("client[%d] closed\n", sockfd);epoll_ctl(epfd, EPOLL_CTL_DEL, sockfd, NULL); // 下树close(sockfd);}else{write(sockfd, buf, n);write(STDOUT_FILENO,buf, n);}} // 普通读事件结束} // for循环,解决变化结点事件结束
} // while循环结束close(lfd);close(epfd);return 0;
}

epoll 版 高并发服务器相关推荐

  1. select 版 高并发服务器

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet. ...

  2. Linux 高并发服务器开发

    该文章是通过观看牛客网的视频整理所得,以及在实践过程中遇到的问题及解决方案的整理总结. Linux 高并发服务器开发 linux 系统编程 linux 环境的搭建 环境搭建需要的软件 虚拟机中安装 u ...

  3. Linux 高并发服务器实战 - 2 Linux多进程开发

    Linux 高并发服务器实战 - 2 Linux多进程开发 进程概述 概念1: 概念2: 微观而言,单CPU任意时刻只能运行一个程序 并发:两个队列交替使用一台咖啡机 并行:两个队列同时使用两台咖啡机 ...

  4. Linux高并发服务器解决方案

    Linux高并发服务器案例演示 在网络通信中,我们常常的服务器经常会受到成千上万的请求提示,而电脑会根据请求建立相对应的socket链接,但是接触过Linux网络编程的人都知道,Linux链接和客户端 ...

  5. 网络编程实战之高级篇, 彻底解决面试C10k问题, 高并发服务器, IO多路复用, 同时监视多个IO事件

    目录 一.前言 二.IO多路复用的理解 三.IO多路复用的发展 select poll epoll ​四.C10K服务端代码 五. 总结 一.前言 网络入门篇,从操作系统的层次推开网络大门 网络入门基 ...

  6. 从简单到高并发服务器(一)

    一个单线程的回声服务器 (Echo Server) 我们从一个简单的服务器开始说起. 它可以接受一个客户的连接,接收消息,然后把这个消息发送回去,关闭连接--完工.我们用 Linux 和 iOS / ...

  7. 如何使用 Go 语言搭建企业级高并发服务器?

    每到节假日和过年,需要外出通行的人几乎都会遇到一个问题:抢火车票!当全国上亿人都在固定的时间段抢票,服务器动辄就要承受上百万级并发的情况时,你就会明白,一个支持高并发的服务器架构有多重要! 在后端程序 ...

  8. java设计高并发内存池_高并发服务器-连接池的设计

    高并发服务器-连接池的设计 高并发服务器需要有一些池的设计,如内存池,连接池,数据库连接池. 池(pool)的设计主要考虑到一些资源的频繁申请和释放,尤其是在高并发的服务器中,几万甚至几十万并发每秒, ...

  9. linux网络编程(二)高并发服务器

    linux网络编程(二)高并发服务器 错误处理 高并发服务器 多进程并发服务器 客户端 错误处理 #include "wrap.h"int Bind(int fd, const s ...

最新文章

  1. 搞垮服务的20条原则
  2. iOS - Bundle 资源文件包
  3. kylin linux 安装教程,新手入门必备:kylin安装教程介绍!
  4. 好书推荐 Beginning C# Objects
  5. 现实生活中常用的动态路由—OSPF路由重分发
  6. lodash 常用的方法总结(持续更新)
  7. Golang 词法分析器浅析
  8. _DataStructure_C_Impl:共享栈
  9. TypeError: Layout of the output array image is incompatible with cv::Mat
  10. MSP430项目设计:2020年TI杯大学生电子设计竞赛 坡道行驶电动小车(C题)循迹小车(分享项目展示视频与源码)
  11. 《当幸福来敲门》观后感
  12. 动态规划经典入门题(初学必刷)
  13. 计算机图形学入门(十五)-光线追踪(辐射度量学)
  14. 2021-01-21:脉冲神经网络学习日志
  15. 初体验之rawkv learner recover灾备切换
  16. 什么是DFX测试.md
  17. 锤子T1(Smartisan T1 4G)版刷成3G版,即sm705运行sm701的CM11 Android 4.4.4ROM
  18. 计算机程序设计员英语单词,计算机程序设计员个人英文简历
  19. GParted图形化工具对Linux磁盘分区扩容
  20. Python property函数:定义属性

热门文章

  1. 浅谈数据中的偏差问题和推荐系统去偏最新研究进展
  2. 浅谈零样本网络表示学习
  3. python控制51单片机的红绿灯_基于51单片机的红绿灯实现(使用普中科技开发板)...
  4. 你是否真正理解了泛型、通配符、类型擦除
  5. 管理员访客身份登录用户账户,java web/springboot/mybatis实现只能看用户信息但不允许修改
  6. LeetCode 20 有效的括号
  7. JavaScript——易班优课YOOC课群在线测试禁止查卷解决方案
  8. JAVA——基于HttpComponents(HttpClient)的简单网络爬虫DEMO
  9. Eclipse——添加库(Add Library)到项目
  10. CG CTF CRYPTO Keyboard