Linux 服务器IO模型 epoll
epoll模型
- #include <unistd.h>
- #include <sys/types.h> /* basic system data types */
- #include <sys/socket.h> /* basic socket definitions */
- #include <netinet/in.h> /* sockaddr_in{} and other Internet defns */
- #include <arpa/inet.h> /* inet(3) functions */
- #include <sys/epoll.h> /* epoll function */
- #include <fcntl.h> /* nonblocking */
- #include <sys/resource.h> /*setrlimit */
- #include <stdlib.h>
- #include <errno.h>
- #include <stdio.h>
- #include <string.h>
- #define MAXEPOLLSIZE 10000
- #define MAXLINE 10240
- int handle(int connfd);
- int setnonblocking(int sockfd)
- {
- if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, )|O_NONBLOCK) == -) {
- return -;
- }
- return ;
- }
- int main(int argc, char **argv)
- {
- int servPort = ;
- int listenq = ;
- int listenfd, connfd, kdpfd, nfds, n, nread, curfds,acceptCount = ;
- struct sockaddr_in servaddr, cliaddr;
- socklen_t socklen = sizeof(struct sockaddr_in);
- struct epoll_event ev;
- struct epoll_event events[MAXEPOLLSIZE];
- struct rlimit rt;
- char buf[MAXLINE];
- /* 设置每个进程允许打开的最大文件数 */
- rt.rlim_max = rt.rlim_cur = MAXEPOLLSIZE;
- if (setrlimit(RLIMIT_NOFILE, &rt) == -)
- {
- perror("setrlimit error");
- return -;
- }
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl (INADDR_ANY);
- servaddr.sin_port = htons (servPort);
- listenfd = socket(AF_INET, SOCK_STREAM, );
- if (listenfd == -) {
- perror("can't create socket file");
- return -;
- }
- int opt = ;
- setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
- if (setnonblocking(listenfd) < ) {
- perror("setnonblock error");
- }
- if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(struct sockaddr)) == -)
- {
- perror("bind error");
- return -;
- }
- if (listen(listenfd, listenq) == -)
- {
- perror("listen error");
- return -;
- }
- /* 创建 epoll 句柄,把监听 socket 加入到 epoll 集合里 */
- kdpfd = epoll_create(MAXEPOLLSIZE);
- ev.events = EPOLLIN | EPOLLET;
- ev.data.fd = listenfd;
- if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, listenfd, &ev) < )
- {
- fprintf(stderr, "epoll set insertion error: fd=%d\n", listenfd);
- return -;
- }
- curfds = ;
- printf("epollserver startup,port %d, max connection is %d, backlog is %d\n", servPort, MAXEPOLLSIZE, listenq);
- for (;;) {
- /* 等待有事件发生 */
- nfds = epoll_wait(kdpfd, events, curfds, -);
- if (nfds == -)
- {
- perror("epoll_wait");
- continue;
- }
- /* 处理所有事件 */
- for (n = ; n < nfds; ++n)
- {
- if (events[n].data.fd == listenfd)
- {
- connfd = accept(listenfd, (struct sockaddr *)&cliaddr,&socklen);
- if (connfd < )
- {
- perror("accept error");
- continue;
- }
- sprintf(buf, "accept form %s:%d\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port);
- printf("%d:%s", ++acceptCount, buf);
- if (curfds >= MAXEPOLLSIZE) {
- fprintf(stderr, "too many connection, more than %d\n", MAXEPOLLSIZE);
- close(connfd);
- continue;
- }
- if (setnonblocking(connfd) < ) {
- perror("setnonblocking error");
- }
- ev.events = EPOLLIN | EPOLLET;
- ev.data.fd = connfd;
- if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, connfd, &ev) < )
- {
- fprintf(stderr, "add socket '%d' to epoll failed: %s\n", connfd, strerror(errno));
- return -;
- }
- curfds++;
- continue;
- }
- // 处理客户端请求
- if (handle(events[n].data.fd) < ) {
- epoll_ctl(kdpfd, EPOLL_CTL_DEL, events[n].data.fd,&ev);
- curfds--;
- }
- }
- }
- close(listenfd);
- return ;
- }
- int handle(int connfd) {
- int nread;
- char buf[MAXLINE];
- nread = read(connfd, buf, MAXLINE);//读取客户端socket流
- if (nread == ) {
- printf("client close the connection\n");//nread==0为客户端正常调用函数closesocket
- close(connfd);
- return -;
- }
- if (nread < ) {
- perror("read error");//nread<0为客户端杀进程
- close(connfd);
- return -;
- }
- write(connfd, buf, nread);//响应客户端
- return ;
- }
关于ET、LT两种工作模式:
ET模式仅当状态发生变化的时候才获得通知,这里所谓的状态的变化并不包括缓冲区中还有未处理的数据,也就是说,如果要采用ET模式,需要一直read/write直到出错为止,很多人反映为什么采用ET模式只接收了一部分数据就再也得不到通知了,大多因为这样;而LT模式是只要有数据没有处理就会一直通知下去的.
Linux 服务器IO模型 epoll的更多相关文章
- Linux的IO模型
在输入输出系统一文中介绍了系统内核操作IO设备的机制. 我们了解到内核可以直接访问IO设备, 用户进程无法IO设备. 就是说IO操作需要分为两个过程, 内核从IO设备读取数据保存到内核空间, 将数据由 ...
- Socket-IO 系列(一)Linux 网络 IO 模型
Socket-IO 系列(一)Linux 网络 IO 模型 一.基本概念 在正式开始讲 Linux IO 模型前,先介绍 5 个基本概念. 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器, ...
- Unix/Linux 网络 IO 模型简介
概述 Linux内核将所有外部设备都看做一个文件来操作.对该文件的读写操作会调用内核提供的系统命令, 返回一个fd(file descriptor)文件描述符.而对一个socket的读写也有相应的描述 ...
- Linux网络IO模型
同步和异步,阻塞和非阻塞 同步和异步 关注的是结果消息的通信机制 同步:同步的意思就是调用方需要主动等待结果的返回 异步:异步的意思就是不需要主动等待结果的返回,而是通过其他手段比如,状态通知,回调函 ...
- LINUX五中IO模型
阻塞IO模型 用户空间调用recvfrom命令 直到数据包到达且被复制到应用进程的缓冲区或发生错误时才返回,这个过程中 进程亦或线程一直处于等待阻塞状态. 2.非阻塞IO模型 用户空间调用内核指令re ...
- 找出linux服务器IO占用高的程序
一台服务器比较性能无外乎内存.cpu使用率.IO使用率,把这3样优化好了,你服务器的负载就要小很多,当然网络情况不在我的考虑范围,毕竟网络这个情况是很不稳定,就算你服务器上把网络优化得再好,idc不 ...
- 7层网络以及5种Linux IO模型以及相应IO基础
一.七层网络模型 OSI是Open System Interconnection的缩写,意为开放式系统互联.国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,它是一个七层的. ...
- 从 Linux 操作系统谈谈 IO 模型(终)
Linux 为什么要区分内核空间与用户空间? Linux 操作系统的 IO 模型有哪几种?有啥区别? 常说的阻塞现象,到底是咋回事? 网络编程研发时,那块到底耗时最多,代码是否还有优化空间? 前几期的 ...
- Linux 网络编程的5种IO模型:异步IO模型
Linux 网络编程的5种IO模型:异步IO模型 资料已经整理好,但是还有未竟之业:复习多路复用epoll 阅读例程, 异步IO 函数实现 背景 上一讲< Linux 网络编程的5种IO模型:信 ...
随机推荐
- nextAll([expr])
描述: 给第一个div之后的所有元素加个类 HTML 代码: <div></div><div></div><div></div> ...
- Logstash学习-Hello World
1.安装 rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearchcat > /etc/yum.repos.d/l ...
- jquey知识点整理
jquery选择器 1.元素选择器: $("p") 选取 <p> 元素. $("p.intro") 选取所有 class="intro&q ...
- 生成javadoc
javadoc可以很方便的用来生成一些接口文档. 操作步骤: 1.export->javadoc 2.选择导出的位置 3.确定导出 常见异常: 1. 软件包 javax.servlet.http ...
- size_t 和 size_type的区别
为了使自己的程序有很好的移植性,c++程序员应该尽量使用size_t和size_type而不是int, unsigned 1. size_t是全局定义的类型:size_type是STL类中定义的类型属 ...
- 数据持久化以及DAO模式的简单使用
持久化:(是将程序中的数据在瞬时状态和持久状态间转换机制) 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘).持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然 ...
- 使用maven搭建SpringMVC项目环境
Window环境下用maven新建一个项目: mvn archetype:generate -DarchetypeCatalog=internal -DgroupId=cn-cisol -Dartif ...
- java动态代理原理
我们经常会用到Java的动态代理技术, 虽然会使用, 但是自己对其中的原理却不是很了解.比如代理对象是如何产生的, InvocationHandler的invoke方法是如何调用的?今天就来深究下Ja ...
- 升级python到2.7版本pip不可用
升级python到2.7版本pip不可用 [root@localhost pip-7.1.2]# pip Traceback (most recent call last): File "/ ...
- Android开发工具类
7种无须编程的DIY开发工具 你知道几个? 现如今,各种DIY开发工具不断的出现,使得企业和个人在短短几分钟内就能完成应用的创建和发布,大大节省了在时间和资金上的投入.此外,DIY工 具的出现,也帮助 ...