当前位置:网站首页>Epoll's et, lt working mode -- example program
Epoll's et, lt working mode -- example program
2022-04-23 14:40:00 【m0_ fifty-one million five hundred and fifty-one thousand three】
The following is a server program , It can be done by LT
or ET
Two modes receive the data sent by the client , And print to standard output .
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<assert.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<errno.h>
#include<arpa/inet.h>
#include<fcntl.h>
#include<sys/epoll.h>
#include<pthread.h>
#define MAX_EVENT_NUMBER 1024
#define BUFFER_SIZE 10
/* Set the file descriptor to non blocking */
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;
}
/* File descriptors fd Upper EPOLLIN Sign up to epollfd Directed epoll In the kernel event table , Parameters enable_et Specify whether or not fd Enable ET Pattern */
void addfd(int epollfd, int fd, bool enable_et)
{
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);
}
/* LT Pattern workflow */
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); /* hold connfd Add to the kernel event table , And disable ET Pattern */
}
else if (events[i].events & EPOLLIN)
{
/* as long as socket There is still unread data in the read cache , This code is triggered */
printf("EPOLLIN event trigger once\n");
memset(buf, '\0', BUFFER_SIZE);
int ret = recv(sockfd, buf, BUFFER_SIZE - 1, 0);
if (ret <= 0)
{
close(sockfd);
continue;
}
printf("get %d bytes of content: %s\n", ret, buf);
}
else
{
printf("something else happened \n");
}
}
}
/* ET Mode workflow */
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(sockfd, (struct sockaddr*)&client_address, &client_addrlength);
addfd(epollfd, connfd, true); /* hold connfd Add to the kernel event table , And open ET Pattern */
}
else if (events[i].events & EPOLLIN)
{
/* This code will not be triggered repeatedly , So you have to cycle through the data , To make sure that socket Read all data in the cache */
printf("EPOLLIN event trigger once\n");
while (1)
{
memset(buf, '\0', BUFFER_SIZE);
int ret = recv(sockfd, buf, BUFFER_SIZE - 1, 0);
if (ret < 0)
{
/* For non blocking IO, If the following conditions are true, it means that all data has been read . thereafter ,epoll You can trigger it again sockfd Upper EPOLLIN event , Perform the next read operation */
if (errno == EAGAIN || errno == EWOULDBLOCK)
{
printf("raed later\n");
break;
}
close(sockfd);
break;
}
else if (ret == 0) /* return 0, Indicates that the other party has closed the connection */
{
close(sockfd);
}
else
{
printf("get %d bytes of content: %s\n", ret, buf);
}
}
}
else
{
printf("something else happened \n");
}
}
}
int main(int argc, char* argv[])
{
if (argc <= 2)
{
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;
address.sin_port = htons(port);
inet_pton(AF_INET, ip, &address.sin_addr);
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(10);
assert(epollfd != -1);
addfd(epollfd, listenfd, true);
while (1)
{
int ret = epoll_wait(epollfd, events, MAX_EVENT_NUMBER, -1);
if (ret < 0)
{
printf("epoll filure\n");
break;
}
// lt(events, ret, epollfd, listenfd);
et(events, ret, epollfd, listenfd);
}
close(listenfd);
return 0;
}
版权声明
本文为[m0_ fifty-one million five hundred and fifty-one thousand three]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204231435333921.html
边栏推荐
- 一个月把字节,腾讯,阿里都面了,写点面经总结……
- raised exception class EAccexxViolation with ‘Access violation at address 45EFD5 in module 出错
- ASEMI三相整流桥和单相整流桥的详细对比
- 顺序栈的基本操作
- 1N5408-ASEMI整流二极管1N5408
- Proteus simulation design of four storey and eight storey elevator control system, 51 single chip microcomputer, with simulation and keil c code
- Use of ansible and common modules
- 【JZ46 把数字翻译成字符串】
- 循环队列的基本操作,你学会了吗?
- Basic regular expression
猜你喜欢
C语言知识点精细详解——初识C语言【1】——你不能不知的VS2022调试技巧及代码实操【1】
51单片机的直流电机PWM调速控制系统(附Proteus仿真+C程序等全套资料)
Electronic scale weighing system design, hx711 pressure sensor, 51 single chip microcomputer (proteus simulation, C program, schematic diagram, thesis and other complete data)
c语言在结构体传参时参数压栈问题
LotusDB 设计与实现—1 基本概念
PWM speed regulation control system of DC motor based on 51 single chip microcomputer (with complete set of data such as Proteus simulation + C program)
基于单片机的DS18B20的数字温度监控报警系统设计【LCD1602显示+Proteus仿真+C程序+论文+按键设置等】
we引用My97DatePicker 实现时间插件使用
Electronic perpetual calendar of DS1302_ 51 single chip microcomputer, month, day, week, hour, minute and second, lunar calendar and temperature, with alarm clock and complete set of data
redis的五种数据类型
随机推荐
Proteus simulation design of DC adjustable regulated power supply (with simulation + paper and other data)
Qt界面优化:Qt去边框与窗体圆角化
初识STL
epoll 的EPOLLONESHOT 事件———实例程序
初始c语言大致框架适合复习和初步认识
JumpServer
ASEMI三相整流桥和单相整流桥的详细对比
source insight via samba
Detailed explanation of SAR command
QT Detailed explanation of pro file
8.2 文本预处理
Matrix exchange row and column
一款不错的工具:aardio
async void 导致程序崩溃
AT89C52 MCU frequency meter (1Hz ~ 20MHz) design, LCD1602 display, including simulation, schematic diagram, PCB and code, etc
单片机的函数信号发生器,输出4种波形,频率可调,原理图,仿真和C程序
555 timer + 74 series chip to build eight way responder, 30s countdown, proteus simulation, etc
矩阵交换行列
8.4 循环神经网络从零实现
Sed learning for application