服务端

#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 10
//将文件描述符设置为阻塞,并且保留原先的文件描述符
int 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;
}
//默认是水平触发模式
//如果需要就开启边缘触发模式
//将文件描述符加入epoll集合,并且开启读文件的操作
void addfd(int epollfd,int fd,bool enable_et){struct 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);}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);if(ret == -1){close(sockfd);continue;}printf("get %d bytes of content: %s\n",ret,buf);}else {printf("something else happened\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_addrlenght = sizeof(client_address);int connfd = accept(listenfd,(struct sockaddr*)&client_address,&client_addrlenght);addfd(epollfd,connfd,true);}else if(events[i].events & EPOLLIN){printf("event trigger once\n");while(1){memset(buf,'\0',BUFFER_SIZE-1);int ret = recv(sockfd,buf,BUFFER_SIZE-1,0);if(ret == -1){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("something else happened\n");}}
}
int main(void){int ret = 0;struct sockaddr_in address;bzero(&address,sizeof(address));address.sin_addr.s_addr = INADDR_ANY;address.sin_family = AF_INET;address.sin_port = htons(9999);int listenfd = socket(AF_INET,SOCK_STREAM,0);if(listenfd == -1){perror("socket");return -1;}ret = bind(listenfd,(struct sockaddr*)&address,sizeof(address));if(ret == -1){perror("bind");return -1;}ret = listen(listenfd,5);if(ret == -1){perror("listen");return -1;}epoll_event events[MAX_EVENT_NUMBER];int epollfd = epoll_create(5);if(epollfd == -1){perror("epoll_create");return -1;}addfd(epollfd,listenfd,true);while(1){int ret = epoll_wait(epollfd,events,MAX_EVENT_NUMBER,-1);if(ret == -1){perror("epoll_wait");break;}lt(events,ret,epollfd,listenfd);//et(events,ret,epollfd,listenfd);}close(listenfd);return 0;
}

客户端

//tcp 通信客户端
#include<stdio.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>int main(void){//1.创建套接字int fd = socket(AF_INET,SOCK_STREAM,0);if(fd == -1){perror("socket");exit(0);}//2.连接服务器端struct sockaddr_in serveraddr;serveraddr.sin_family = AF_INET;inet_pton(AF_INET,"192.168.131.138",&serveraddr.sin_addr.s_addr);serveraddr.sin_port = htons(9999);int ret = connect(fd,(struct sockaddr*)&serveraddr,sizeof(serveraddr));if(ret == -1){perror("connect");exit(0);}char *data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";write(fd,data,strlen(data));char recvBuf[1024] = {0}; while(read(fd,recvBuf,sizeof(recvBuf)) > 0){printf("recv data :%s\n",recvBuf);}close(fd);return 0;
}

lt模式

ET模式
同样是读取,但是只有一次触发

2022-4-19 LT模式和ET模式《Linux高性能服务器》笔记相关推荐

  1. MySQL双主模式(2022/11/19)

    MySQL双主模式(2022/11/19) 文章目录 MySQL双主模式(2022/11/19) 一.搭建环境 二.搭建过程 2.1 MySQL 服务安装 2.2 binlog 开启 2.3 创建节点 ...

  2. 【设计模式2022】第十三章 享元模式

    [设计模式2022]第十三章 享元模式 文章目录 [设计模式2022]第十三章 享元模式 一.概述 二.结构 三.实现 四.分析 1.优点 2.缺点 3.使用场景 五.Integer 包装类 一.概述 ...

  3. [19/04/24-星期三] GOF23_创建型模式(建造者模式、原型模式)

    一.建造者模式 本质:分离了对象子组件的单独构造(由Builder负责)和装配的分离(由Director负责),从而可以构建出复杂的对象,这个模式适用于:某个对象的构建过程十分复杂 好处:由于构建和装 ...

  4. 【Linux网络编程】epoll进阶之水平模式和边沿模式

    ------------->[Linux系统编程/网络编程](学习目录汇总) <-------------- 文章目录 1.epoll的事件模型 1.1 ET(边沿模式)的设置 1.2 基 ...

  5. C++模式学习------策略模式

    当遇到同一个对象有不同的行为,方法,为管理这些方法可使用策略模式. 策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来.通常把一个系列的算法包装到一系列的策略类里面,这些类继承一个抽象的 ...

  6. Doctype? 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?

    严格模式与混杂模式--如何触发这两种模式,区分它们有何意义. 在标准模式中,浏览器根据规范呈现页面: 在混杂模式中,页面以一种比较宽松的向后兼容的方式显示. 浏览器根据DOCTYPE是否存在以及使用的 ...

  7. 硬盘和显卡的访问与控制(一)——《x86汇编语言:从实模式到保护模式》读书笔记01

    本文是<x86汇编语言:从实模式到保护模式>(电子工业出版社)的读书实验笔记. 这篇文章我们先不分析代码,而是说一下在Bochs环境下如何看到实验结果. 需要的源码文件 第一个文件是加载程 ...

  8. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  9. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

最新文章

  1. OpenC 仿射变换
  2. html流程图可新增删除,CSS / HTML流程图
  3. UVA 12266 Stock prices --优先队列
  4. C#操作Word完全功略!
  5. 从数据结构角度分析foreach效率比for循环高的原因
  6. 试题 历届试题 幸运数(二分)
  7. android启用hdcp_如何在Android上启用优先收件箱(和设置仅重要通知)
  8. python 查找算法_python快速查找算法应用实例
  9. Introduction-To-Signal-Processingorfanidis-i2sp
  10. 《设计模式详解》行为型模式 - 职责链模式
  11. LoadRunner 测试脚本
  12. CHI2019 ChewIt. An Intraoral Interface for Discreet Interactions
  13. 手把手教你做短视频去水印微信小程序(4-解析结果页)
  14. CentOS下安裝iRedMail
  15. linux ubuntu 安装 XDroid失败
  16. arduinouno摄像头OV7670_Arduino极限操作 摄像头OV7670拍照
  17. 一个QQ盗号木马是这样诞生的(C#)
  18. 玩转curl指令—测试简单的HTTP接口
  19. VGA原理详解与verilog实现RGB888彩条(二)
  20. 小乌龟代码提交Gitee

热门文章

  1. progressbar
  2. allegro 16.6 导出gerber文件---art文件
  3. 开发经理(技术型)需要做的第一件事情
  4. gitlab进行协作以及issue的使用说明
  5. gcc -fstack protector 原理
  6. html5 video标签简单使用
  7. listary什么意思_整合邮件、日历和 RSS,这次更新让 Vivaldi 不止于浏览器
  8. STM8S_003_TIM定时中断
  9. 计算机基础知识面试题
  10. 如何用好售后服务卡/评价有礼卡,高比率留存老客户,提升店铺复购率