linux 服务器高级编程ET LT代码

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<assert.h>
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
#include<fcntl.h>
#include<stdlib.h>
#include<sys/epoll.h>
#include<pthread.h>#define MAX_EVENT_NUMBER 1024
#define BUFFER_SIZE 10int setnonblocking(int fd)
{int old_option = fcntl(fd, F_GETFL);int new_option = old_option | O_NONBLOCK;fcntl(fd, F_SETFL, new_option);return old_option;
}void addfd(int epollfd, int fd, bool enable_et) //在内核事件表中为fd注册事件
{epoll_event event;event.data.fd = fd;event.events = EPOLLIN;if (enable_et){event.events |= EPOLLET;}epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &event); // 操作内核事件表的函数setnonblocking(fd);
}void lt(epoll_event* events, int number, int epollfd, int listenfd)
{char buf[BUFFER_SIZE];for (int i = 0; i < number; i++) {int sockfd = events[i].data.fd;if (sockfd == listenfd) {struct sockaddr_in client_address;socklen_t client_addrlength = sizeof(client_address);int connfd = accept(listenfd, (struct sockaddr*)&client_address, &client_addrlength);addfd(epollfd, connfd, false);printf("connect fd:%d listenfd=%d\n", connfd, listenfd);} else if (events[i].events & EPOLLIN) {printf("event trigger once\n");memset(buf, '\0', BUFFER_SIZE);int ret = recv(sockfd, buf, BUFFER_SIZE - 1, 0);printf("socket fd:%d listenfd=%d\n", sockfd, listenfd);if (ret < 0) {close(sockfd);continue;}printf("get %d bytes of content: %s\n", ret, buf);} else {printf("sth else happend\n");}}
}void et(epoll_event* events, int number, int epollfd, int listenfd)
{char buf[BUFFER_SIZE];for (int i = 0 ; i < number; i++) {int sockfd = events[i].data.fd;if (sockfd == listenfd) {struct sockaddr_in client_address;socklen_t client_addrlength = sizeof(client_address);int connfd = accept(listenfd, (struct sockaddr*)&client_address, &client_addrlength);addfd(epollfd, connfd, true);} else if (events[i].events & EPOLLIN) {printf("event trigger once\n");while (1) {memset(buf, '\0', BUFFER_SIZE);int ret = recv(sockfd, buf, BUFFER_SIZE - 1, 0);if (ret < 0) {if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {printf("read later\n");break;}close(sockfd);break;} else if (ret == 0) {close(sockfd);} else {printf("get %d bytes of content:%s\n", ret, buf);}}} else {printf("nothing happend\n");}}
}int main(int argc, char* argv[])
{if (argc <= 2) {printf("usage: %s ip_address port_number\n", basename(argv[0]));return 1;}const char* ip = argv[1];int port = atoi(argv[2]);int ret = 0;struct sockaddr_in address;bzero(&address, sizeof(address));address.sin_family = AF_INET;inet_pton(AF_INET, ip, &address.sin_addr);address.sin_port = htons(port);int listenfd = socket(PF_INET, SOCK_STREAM, 0);assert(listenfd >= 0);ret = bind(listenfd, (struct sockaddr*)&address, sizeof(address));assert(ret != -1);ret = listen(listenfd, 5);assert(ret != -1);epoll_event events[MAX_EVENT_NUMBER];int epollfd = epoll_create(5);addfd(epollfd, listenfd, true);while(1) {int ret = epoll_wait(epollfd, events, MAX_EVENT_NUMBER, -1);if (ret < 0) {printf("epoll fail\n");break;}// lt(events, ret, epollfd, listenfd);et(events, ret, epollfd, listenfd);}close(listenfd);return 0;
}

ET:

ET模式下需要一次性处理完所有数据,下次就不会加入到epoll_wait的事件中了。

LT:

LT模式下未处理完的事件还是会被加入到epoll_wait监听的事件中。

reference:
linux高性能服务器编程——游双P153-P157

Linux 服务器高级编程ET LT代码相关推荐

  1. Linux环境高级编程函数,Linux环境高级编程--出错处理(CLStatus)

    很多程序库对外提供若干类,每个方法出错时如何告知调用者是否出错,以及出错码(在Linux上在error.h中的全局errno就是保存我们Linux程序执行的出错码的)?方法很多,为了简化起见,函数将返 ...

  2. Linux C高级编程——文件操作之系统调用

    Linux C高级编程文件操作之系统调用 宗旨:技术的学习是有限的,分享的精神是无限的! 库函数是一些完成特定功能的函数,一般由某个标准组织制作发布,并形成一定的标准.使用库函数编写的函数一般可以应用 ...

  3. linux环境编程 学习,学习linux环境高级编程首先学习的是文件的操作。因为有.pdf...

    学习linux环境高级编程首先学习的是文件的操作.因为有 学习 Linux 环境高级编程,首先学习的是文件的操作.因为有一句很有趣的话"Linux 下一切皆文件".所以掌握了文件操 ...

  4. Linux C高级编程——文件操作之库函数

    Linux C高级编程--文件操作之库函数 宗旨:技术的学习是有限的,分享的精神是无限的 --为什么要设计标准I/O库? 直接使用API进行文件访问时,需要考虑许多细节问题 例如:read.write ...

  5. Linux C高级编程——网络编程基础(1)

    Linux高级编程--BSD socket的网络编程 宗旨:技术的学习是有限的,分享的精神是无限的. 一网络通信基础 TCP/IP协议簇基础:之所以称TCP/IP是一个协议簇,是因为TCP/IP包含T ...

  6. linux服务器网络编程之线程模型

    前言   本文将主要介绍传统的和目前流行的进程/线程模型,在讲进程/线程模型之前需要先介绍一种设计模式: Reactor 模式.Reactor 模式首先是事件驱动的,有一个或多个并发输入源,有一个Se ...

  7. 《Linux操作系统 - 高级编程》第一部分 标准IO及文件IO(第2章 标准IO)

    2.1 Linux I/O概述 2.1.1文件I/O和标准I/O的概念 文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O).不带缓存指的是每个read,write都调用内核中的 ...

  8. linux web高级编程,寒假学习 第16.17天 (linux 高级编程)

    寒假学习 第16.17天 (linux 高级编程) 笔记 总结 一.进程的基本控制(进程的同步) 1.进程的常见控制函数 pause   sleep/usleep atexit   on_exit i ...

  9. Linux C高级编程——时间编程

    Linux高级编程--时间编程 宗旨:技术的学习是有限的,分享的精神是无限的. 1 时间类型 (1) 世界标准世界(格林威治时间) (2) 日历时间(1970年1月1日0时)--到此时经历的秒数 2 ...

最新文章

  1. magento常用软件
  2. linux下配置环境变量【原创】
  3. 钉钉如何调整组织架构_阿里宣布新一轮组织架构调整:明确大文娱一号位,钉钉进入阿里云...
  4. ajax技术运用案例,第12篇:Ajax技术与项目案例
  5. 原:开辟内存时,可以以结构体为单位,这样测试,是对的吧?
  6. fstab自动挂载_玩客云刷机系统之armbian挂载U盘增加空间
  7. kafka高性能揭秘:顺序写和零拷贝
  8. linux java top_linux top命令 监测系统性能
  9. Jdk1.8新特性(二)——lambda表达式(参数列表)-{}和函数式接口@FunctionalInterface
  10. JavaWEB/JSP 中简单的验证码 springMVC
  11. 女博士实名举报北航人工智能教授:性骚扰!
  12. 如何使用科来网络分析系统过滤数据包内容
  13. axure导出html侧边栏,Axure模板库(5)-侧边栏
  14. 全“芯”赋能,SOM3568核心板
  15. VVC/JEM代码学习26:m_pcTrQuant-transformN*N
  16. miktex+WinEdt 安装步骤
  17. DSP TMS320C5509A 控制DDS AD9854芯片进行AM幅度调制时的噪声抑制
  18. 利用集合进行数组的排序
  19. 我们建议您在Google的sellers.json文件中公开您的卖方信息
  20. ResNet实战:单机多卡DDP方式、混合精度训练

热门文章

  1. 挂钩Windows API
  2. 十个最适合 Web 和 APP 开发的 NodeJS 框架 1
  3. Oracle RMAN备份与还原 - 联机备份讲解
  4. 840. 模拟哈希表(模板)
  5. js调用android本地java代码
  6. leetcode 整数反转
  7. 通过接口字段名称反向猜测数据库列名
  8. 常用网站URL规划分析
  9. 捕获标志位_如何通过捕获标志挑战来提高网络安全技能-PicoCTF演练
  10. html5 学习_5分钟内学习HTML