日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

epoll反应堆模型代码

發布時間:2023/11/30 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 epoll反应堆模型代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

libevent函數庫核心思想

/*** epoll_loop.c ***/ #include<stdio.h> #include<sys/epoll.h> #include<sys/socket.h> #include<arpa/inet.h> #include<fcntl.h> #include<unistd.h> #include<errno.h> #include<string.h> #include<stdlib.h> #include<time.h>#define MAX_EVENTS 2014 #define BUFLEN 4096 #define SERV_PORT 8080void recvdata(int fd,int events,void *arg); void senddata(int fd,int events,void *arg);struct myevent_s {int fd;int events;void *arg;void (*call_back)(int fd,int events,void *arg);int status;char buf[BUFLEN];int len;long last_active; };int g_efd; struct myevent_s g_events[MAX_EVENTS + 1];void eventset(struct myevent_s *ev,int fd,void (*call_back)(int,int,void*),void *arg) {ev->fd = fd;ev->call_back = call_back;ev->events = 0;ev->arg = arg;ev->status = 0;ev->last_active = time(NULL);return; }void eventadd(int efd,int events,struct myevent_s *ev) {struct epoll_event epv = {0,{0}};int op;epv.data.ptr = ev;epv.events = ev->events = events;if(ev->status == 1){op = EPOLL_CTL_MOD; }else{op = EPOLL_CTL_ADD;ev->status = 1; }if(epoll_ctl(efd,op,ev->fd,&epv) < 0){printf("event add failed [fd=%d],evens[%d]\n",ev->fd,events) ;}else{printf("event add OK[fd=%d],op = %d,evens[%0X]\n",ev->fd,op,events) ;}return; }void eventdel(int efd,struct myevent_s *ev) {struct epoll_event epv = {0,{0}};if(ev->status != 1){return; }epv.data.ptr = ev;ev->status = 0;epoll_ctl(efd,EPOLL_CTL_DEL,ev->fd,&epv);return; }void acceptconn(int lfd,int events,void *arg) {struct sockaddr_in cin;socklen_t len = sizeof(cin);int cfd,i;if((cfd = accept(lfd,(struct sockaddr *)&cin,&len)) == -1){if(errno != EAGAIN && errno != EINTR) {}printf("%s : accept,%s \n",__func__,strerror(errno));return ;}do{for(i = 0; i < MAX_EVENTS; i++) {if(g_events[i].status == 0) {break; }}if(i == MAX_EVENTS){printf("%s: max connect limit[%d]\n]",__func__,MAX_EVENTS) ;return;}int flag = 0;if((flag = fcntl(cfd,F_SETFL,O_NONBLOCK)) < 0){printf("%s : accept,%s \n",__func__,strerror(errno));break;}eventset(&g_events[i],cfd,recvdata,&g_events[i]);eventadd(g_efd,EPOLLIN,&g_events[i]);}while(0);printf("new connect [%s:%d][time:%ld],pos[%d]\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),g_events[i].last_active,i);return; }void recvdata(int fd,int events,void *arg) {struct myevent_s *ev = (struct myevent_s *)arg;int len;len = recv(fd,ev->buf,sizeof(ev->buf),0);eventdel(g_efd,ev);if(len > 0){ev->len = len;ev->buf[len] = 0;printf("C[%d]:%s\n",fd,ev->buf);eventset(ev,fd,senddata,ev);eventadd(g_efd,EPOLLOUT,ev);}else if(len == 0){close(ev->fd) ;printf("[fd = %d] pos[%ld],close\n",fd,ev-g_events);}else{close(ev->fd) ;printf("recv[fd=%d] error[%d]:%s\n",fd,errno,strerror(errno));}return; }void senddata(int fd,int events,void *arg) {struct myevent_s *ev = (struct myevent_s *)arg;int len;len = send(fd,ev->buf,ev->len,0);if(len > 0){printf("send[fd=%d],[%d]%s\n",fd,len,ev->buf) ;eventdel(g_efd,ev);eventset(ev,fd,recvdata,ev);eventadd(g_efd,EPOLLIN,ev);}else{close(ev->fd) ;eventdel(g_efd,ev);printf("send[fd=%d] error %s\n",fd,strerror(errno));}return; }void initlistensocket(int efd,short port) {int lfd = socket(AF_INET,SOCK_STREAM,0);fcntl(lfd,F_SETFL,O_NONBLOCK);eventset(&g_events[MAX_EVENTS],lfd,acceptconn,&g_events[MAX_EVENTS]);eventadd(efd,EPOLLIN,&g_events[MAX_EVENTS]);struct sockaddr_in sin;memset(&sin,0,sizeof(sin));sin.sin_addr.s_addr = INADDR_ANY;sin.sin_family = AF_INET;sin.sin_port = htons(port);bind(lfd,(struct sockaddr*)&sin,sizeof(sin));listen(lfd,20);return ; }int main(int argc, char *argv[]) {unsigned short port = SERV_PORT;if(argc == 2){port = atoi(argv[1]) ;}g_efd = epoll_create(MAX_EVENTS+1);if(g_efd <= 0){printf("Create efd in %s error %s\n",__func__,strerror(errno)) ;}initlistensocket(g_efd,port);struct epoll_event events[MAX_EVENTS+1];printf("server running:port[%d]\n",port);int checkpos = 0,i;while(1){long now = time(NULL) ;for(i = 0 ; i < 100; i++,checkpos++){if(checkpos == MAX_EVENTS) checkpos = 0;if(g_events[checkpos].status != 1){continue; }long duration = now - g_events[checkpos].last_active;if(duration >= 60){close(g_events[checkpos].fd) ;printf("[fd=%d] timeout\n",g_events[checkpos].fd);eventdel(g_efd,&g_events[checkpos]);}}int nfd = epoll_wait(g_efd,events,MAX_EVENTS+1,1000);if(nfd < 0){printf("epoll_wait error, exit\n") ;break;}for(i = 0; i < nfd; i++){struct myevent_s *ev = (struct myevent_s *)events[i].data.ptr;if((events[i].events & EPOLLIN) && (ev->events & EPOLLIN)){ev->call_back(ev->fd,events[i].events,ev->arg) ;}if((events[i].events & EPOLLOUT) && (ev->events & EPOLLOUT)){ev->call_back(ev->fd,events[i].events,ev->arg);}}}return 0; }

?

轉載于:https://www.cnblogs.com/wanghao-boke/p/11443231.html

總結

以上是生活随笔為你收集整理的epoll反应堆模型代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一区视频在线免费观看 | 久久久久久久av | 男女视频免费网站 | 亚洲精品久久久蜜桃网尤妮丝 | 9191在线视频 | 女人扒开屁股让男人捅 | av簧片| 可以免费在线观看的av | 阿v天堂在线 | 麻豆av网站| 日本色中色| 在线观看a网站 | 超碰在线图片 | 少妇人妻互换不带套 | 国产免费一区二区三区 | 中文字幕无码人妻少妇免费 | 中文在线免费观看 | 影音先锋蜜桃 | 超碰资源总站 | 精品中文视频 | 国产同性人妖ts口直男 | 日本综合在线 | 深夜福利视频在线观看 | 成人av电影天堂 | 天堂影视av | 黄色美女片| 免费高清毛片 | 在线观看黄 | av网站免费在线看 | 色视频综合 | 日韩综合另类 | 最新国产露脸在线观看 | 九九热视频在线播放 | 在线91视频| 九九热最新网址 | 在线伊人网 | 麻豆精品久久 | 男人视频网 | 牛牛电影国产一区二区 | 国产香蕉av| 国产成人啪精品午夜在线观看 | 美女被男生免费视频 | 一级黄色大片网站 | av小说免费在线观看 | 精品国产免费av | 免费黄网在线观看 | 国产精品18 | 国产精选久久久 | 国产刺激对白 | 美女视频一区 | 99在线小视频 | 免费成人在线观看视频 | 91在线公开视频 | 亚洲av成人精品午夜一区二区 | 国产黄色网络 | 久久精品黄色片 | 漂亮人妻被黑人久久精品 | 日韩夜夜操| 国内国产精品天干天干 | 国产成人免费观看 | 国产日韩欧美在线 | xxxx日本少妇| 亚洲精品1区 | 一区高清 | 国产日韩成人内射视频 | 91九色蝌蚪porny | 中文字幕免费高清网站 | 亚洲视频一二三 | 日本毛片视频 | 高清av一区二区 | 日本一区二区三区在线免费观看 | 黄色小视频免费在线观看 | 美国黄色一级毛片 | 国产乱子伦一区二区 | 国模婷婷 | 青青草免费在线观看视频 | 欧美在线va | 漂亮少妇高潮午夜精品 | 91抖音在线观看 | 久久午夜无码鲁丝片午夜精品 | 欧美性猛交xxxx免费看 | feel性丰满白嫩嫩hd | 成人精品三级 | 一区二区手机在线 | 日批视频免费看 | 国产精品久久久久三级无码 | 黄色大片91| 亚洲精品国产精品乱码不66 | 欧美专区在线观看 | 狠狠操网站| 日韩精品在线不卡 | 青青草视频免费看 | 欧美综合色区 | 欧美日韩在线影院 | 激情av网| 德国性经典xxxx性hd | 久久草国产 | 色综合久久久久 | 99视频+国产日韩欧美 |