epoll/et例子
来源:互联网 发布:浪潮软件股吧 编辑:程序博客网 时间:2024/04/28 12:33
#include <sys/socket.h> #include <sys/wait.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <sys/epoll.h> #include <sys/sendfile.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <fcntl.h> #include <errno.h> #defineMAX_EVENTS 10 #definePORT 8080 //设置socket连接为非阻塞模式 voidsetnonblocking(int sockfd) { int opts; opts = fcntl(sockfd, F_GETFL); if(opts < 0) { perror("fcntl(F_GETFL)\n"); exit(1); } opts = (opts | O_NONBLOCK); if(fcntl(sockfd, F_SETFL, opts) < 0) { perror("fcntl(F_SETFL)\n"); exit(1); } } intmain(){ structepoll_event ev,events[MAX_EVENTS]; intaddrlen,listenfd,conn_sock,nfds,epfd,fd,i,nread,n; structsockaddr_in local,remote; charbuf[BUFSIZ]; //创建listen socket if( (listenfd =socket(AF_INET,SOCK_STREAM, 0)) < 0) { perror("sockfd\n"); exit(1); } setnonblocking(listenfd); bzero(&local, sizeof(local)); local.sin_family =AF_INET; local.sin_addr.s_addr =htonl(INADDR_ANY);; local.sin_port =htons(PORT); if(bind(listenfd, (structsockaddr *) &local, sizeof(local)) < 0) { perror("bind\n"); exit(1); } listen(listenfd, 20); epfd =epoll_create(MAX_EVENTS); if (epfd == -1) { perror("epoll_create"); exit(EXIT_FAILURE); } ev.events =EPOLLIN; ev.data.fd =listenfd; if (epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd, &ev) == -1) { perror("epoll_ctl:listen_sock"); exit(EXIT_FAILURE); } for (;;) { nfds =epoll_wait(epfd,events,MAX_EVENTS, -1); if (nfds == -1) { perror("epoll_pwait"); exit(EXIT_FAILURE); } for (i = 0;i <nfds; ++i) { fd =events[i].data.fd; if (fd ==listenfd) { while ((conn_sock =accept(listenfd,(structsockaddr *) &remote, (size_t *)&addrlen)) > 0) { setnonblocking(conn_sock); ev.events =EPOLLIN |EPOLLET; ev.data.fd =conn_sock; if (epoll_ctl(epfd,EPOLL_CTL_ADD,conn_sock, &ev) == -1) { perror("epoll_ctl:add"); exit(EXIT_FAILURE); } } if (conn_sock == -1) { if (errno !=EAGAIN &&errno !=ECONNABORTED &&errno !=EPROTO &&errno !=EINTR) perror("accept"); } continue; }if (events[i].events &EPOLLIN) { n = 0; while ((nread =read(fd,buf +n,BUFSIZ-1)) > 0) { n +=nread; } if (nread == -1 &&errno !=EAGAIN) { perror("readerror"); } ev.data.fd =fd; ev.events =events[i].events |EPOLLOUT; if (epoll_ctl(epfd,EPOLL_CTL_MOD,fd, &ev) == -1) { perror("epoll_ctl:mod"); } } if (events[i].events &EPOLLOUT) { sprintf(buf, "HTTP/1.1200 OK\r\nContent-Length: %d\r\n\r\nHello World", 11); intnwrite,data_size =strlen(buf); n =data_size; while (n > 0) { nwrite =write(fd,buf +data_size -n,n); if (nwrite <n) { if (nwrite == -1 &&errno !=EAGAIN) { perror("writeerror"); } break; } n -=nwrite; } close(fd); } } } return 0; }
0 0
- epoll/et例子
- epoll边缘触发(epoll et) 源代码例子
- epoll边缘触发(epoll et) 源代码例子
- epoll et
- epoll ET模式服务器和客户端源码例子
- epoll两种类型ET和LT区别(结合实际例子)
- epoll ET模式服务器和客户端源码例子
- epoll lt 和 et
- epoll LT VS ET
- epoll ET模式 注意事项
- epoll et lt
- 经典python epoll(ET)
- epoll et lt
- epoll et模式
- epoll LT VS ET (ZZ)
- epoll LT VS ET (ZZ)
- EPOLL LT和ET区别
- epoll的 et,lt关注点
- 离散二维小波变换 MATLAB
- jsp实体链接SQL2008
- 获取GetPlayerPawn,APlayerController,GetWorld,HUD
- 各种优化方法总结比较(sgd/momentum/Nesterov/adagrad/adadelta)
- TelephonyManager(电话管理器)
- epoll/et例子
- c++ 创建Utf8 文件
- 抽象工厂模式(java版)
- SVN的基本操作
- 整理的常用网站
- node.js配置
- setDefaultCloseOperation相关参数
- 首页动画效果实现--viewfilpper
- synchronized 详解