epoll_wait 。。
来源:互联网 发布:sqoop导入数据到hbase 编辑:程序博客网 时间:2024/06/07 10:01
/********************************* * mkfifo p1 p2 * cat > p1 * cat > p2 *FileName: epoll_wait.c *Author : Dai *Version : 1 *Date : 2014.09.19 *Description: 用epoll_wait监听多个管道,管道中有内容就读出 (1)epoll_creat()创建一个句柄 *Note : 打开一个文件用非阻塞方式,不然会阻塞到read上, 而我们要求用epoll_wait()阻塞到epoll_wait()上 *********************************/#include <stdio.h>#include <sys/epoll.h>#include <unistd.h>#include <fcntl.h>#include <stdlib.h>struct epoll_event env;int main(void){int fd1, fd2;if((fd1 = open("p1", O_RDONLY|O_NONBLOCK)) == -1){perror("open p1 fail\n");exit(-1);}if((fd2 = open("p2", O_RDONLY|O_NONBLOCK)) == -1){perror("open p2 fail\n");exit(-1);}int epoll_fd = epoll_create(1);if(epoll_fd == -1)perror("epoll create fail\n");env.data.fd = fd1;env.events = EPOLLIN|EPOLLET;if((epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd1, &env)) == -1)perror("epoll_ctl p1 fail\n");env.data.fd = fd2;env.events = EPOLLIN | EPOLLET;if((epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd2, &env)) == -1)perror("epoll_ctl p2 fail\n");while(1){char buf[32];epoll_wait(epoll_fd, &env, 1, -1);int fd = env.data.fd;int len;while((len = (read(fd, buf, 32))) > 0)buf[len] = '\0';printf("get %s from %d\n", buf, fd);}return 0;}
***********************************************************************************************************
/***************************************** *Discription:用socket实现远程登录访问 用epoll_wait实现并发 两个端口进行通信 *socket 产生用于监听的描述符 bind 绑定地址和端口 listen 把套接字设为被动 accept()用于产生和客户机进行交互的文件描述符 * * * * * *********************************/#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h> //inet_ntop()#include <sys/epoll.h>#define SERV_port 8000 //端口号#define max_r 100//存取从客户端读过来的空间#define max_ep 10//从内核可以处理事件集合的大小char buf_f[1024];int flag_fd[100];int f_fd;int main(void){int listenfd, connfd;char buf[100];char buf1[100];int r_len;char str[INET_ADDRSTRLEN]; //。。。。。。。struct sockaddr_in servaddr, cliaddr; int ep_fd, cur_ep, accept_Count = 0;//ep_fd创建的句柄用于处理wait的epoll文件描述符 cur_ep用于记录当前epoll_wait监听事件的个数int nfds, i, j; //epoll_wait返回的处理事件的个数struct epoll_event ep_env; //用于注册事件struct epoll_event events[max_ep];//用于回传要处理的事件listenfd = socket(AF_INET, SOCK_STREAM, 0);int opt = 1; setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_port);if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1){perror("bind fail\n");}if(listen(listenfd, 20) == -1){perror("listen fail\n");}printf("now we can accept connections\n");//创建epoll句柄 并把监听socket加入epoll队列if((ep_fd = epoll_create(1)) == -1){perror("epoll_create fail\n");exit(-1);}memset(flag_fd, 0, sizeof(flag_fd));ep_env.data.fd = listenfd;ep_env.events = EPOLLIN | EPOLLET;if((epoll_ctl(ep_fd, EPOLL_CTL_ADD, listenfd, &ep_env)) == -1){perror("epoll_ctl fail\n");}//把服务器标准输入加入epoll队列ep_env.data.fd = STDIN_FILENO;ep_env.events = EPOLLIN | EPOLLET;if((epoll_ctl(ep_fd, EPOLL_CTL_ADD, STDIN_FILENO, &ep_env)) == -1){perror("epoll_ctl fail\n");}flag_fd[listenfd] = 1;flag_fd[STDIN_FILENO] = 1;printf("epoll_server start server port:%d\n", SERV_port);cur_ep = 2;while(1){nfds = epoll_wait(ep_fd, events, cur_ep, -1);for(i = 0; i < nfds; i++){if(events[i].data.fd == listenfd){int cliaddr_len = sizeof(cliaddr);connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);sprintf(buf, "accept from %s at port %d\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port);printf("%d:%s", ++accept_Count, buf);ep_env.events = EPOLLIN | EPOLLET;ep_env.data.fd = connfd;epoll_ctl(ep_fd, EPOLL_CTL_ADD, connfd, &ep_env);flag_fd[connfd] = 1;cur_ep++;continue;}else if(events[i].data.fd == STDIN_FILENO){if(handle(events[i].data.fd, connfd) < 0) {epoll_ctl(ep_fd, EPOLL_CTL_DEL, j, &ep_env);close(events[i].data.fd);cur_ep--;flag_fd[events[i].data.fd] = 0;}}else{if(handle(events[i].data.fd, STDIN_FILENO) < 0){epoll_ctl(ep_fd, EPOLL_CTL_DEL, connfd, &ep_env);close(events[i].data.fd);cur_ep--;flag_fd[events[i].data.fd] = 0;}}}/*int cliaddr_len = sizeof(cliaddr);while((r_len = read(connfd, buf, max_r))){printf("received from %s at port %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port));write(connfd, buf, r_len);}*/}close(listenfd);return 0;}//从src复制到destint handle(int src, int dest) {int nread;int j;char buf[1024];nread = read(src, buf, 1024);if(nread == 0){printf("client close the connection\n");return -1;}if(nread < 0){perror("read error");return -1;}for(j = 0; j < 100; j++)if(j != 3 && j != src && flag_fd[j] == 1) write(j, buf, nread);return 0;}
**********************************************************
#include <unistd.h>#include <sys/types.h> /* basic system data types */#include <sys/socket.h> /* basic socket definitions */#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */#include <arpa/inet.h> /* inet(3) functions */#include <sys/epoll.h> /* epoll function */#include <fcntl.h> /* nonblocking */#include <sys/resource.h> /*setrlimit */#include <stdlib.h>#include <errno.h>#include <stdio.h>#include <string.h>#define MAXEPOLLSIZE 10#define MAXLINE 10240int handle(int connfd);int main(int argc, char **argv){ int servPort = 8000; int listenfd, connfd, kdpfd, nfds, n, nread; int curfds,acceptCount = 0; struct sockaddr_in servaddr, cliaddr; socklen_t socklen = sizeof(struct sockaddr_in); struct epoll_event ev; struct epoll_event events[MAXEPOLLSIZE]; char buf[MAXLINE]; bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl (INADDR_ANY); servaddr.sin_port = htons (servPort); listenfd = socket(AF_INET, SOCK_STREAM, 0); int opt = 1; setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(struct sockaddr)) == -1) { perror("bind error"); return -1; } listen(listenfd, 10); /* 创建 epoll 句柄,把监听 socket 加入到 epoll 集合里 */ kdpfd = epoll_create(MAXEPOLLSIZE); ev.events = EPOLLIN | EPOLLET; ev.data.fd = listenfd; epoll_ctl(kdpfd, EPOLL_CTL_ADD, listenfd, &ev); curfds = 1; printf("epollserver startup,port %d\n", servPort); for (;;) { /* 等待有事件发生 */ nfds = epoll_wait(kdpfd, events, curfds, -1); /* 处理所有事件 */ for (n = 0; n < nfds; ++n) { if (events[n].data.fd == listenfd) { connfd = accept(listenfd, (struct sockaddr *)&cliaddr,&socklen); sprintf(buf, "accept form %s:%d\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port); printf("%d:%s", ++acceptCount, buf); ev.events = EPOLLIN | EPOLLET; ev.data.fd = connfd; epoll_ctl(kdpfd, EPOLL_CTL_ADD, connfd, &ev); curfds++; continue; } // 处理客户端请求 if (handle(events[n].data.fd) < 0) { epoll_ctl(kdpfd, EPOLL_CTL_DEL, events[n].data.fd,&ev);close(events[n].data.fd); curfds--; } } } close(listenfd); return 0;}int handle(int connfd) { int nread; char buf[MAXLINE]; nread = read(connfd, buf, MAXLINE);//读取客户端socket流 if (nread == 0) { printf("client close the connection\n"); return -1; } if (nread < 0) { perror("read error"); return -1; } write(connfd, buf, nread);//响应客户端 return 0;}
0 0
- epoll_wait
- epoll_wait
- epoll_wait 。。
- 探讨epoll_wait
- epoll_create/epoll_ctrl/epoll_wait
- epoll_create, epoll_ctl和epoll_wait
- epoll_create, epoll_ctl和epoll_wait
- epoll_wait事件顺序
- epoll_create, epoll_ctl和epoll_wait
- EPOLL-EPOLL_WAIT返回多次
- epoll_create, epoll_ctl和epoll_wait
- epoll_create, epoll_ctl和epoll_wait
- epoll_create, epoll_ctl和epoll_wait
- epoll_wait Interrupted system call
- epoll_create, epoll_ctl和epoll_wait
- epoll_create, epoll_ctl和epoll_wait .
- epoll_create, epoll_ctl和epoll_wait
- epoll_create, epoll_ctl和epoll_wait
- Xcode5制作Framework
- Maximal Rectangle
- document.getElementById,IE兼容性
- 关于Unity3D内置Blinn Phong光照模型计算在移动设备上的曝光问题
- 【伯乐在线】24岁才开始学编程是否太晚?一位经济学专业女程序员的故事
- epoll_wait 。。
- 使用yum 使用 CentOS-6.5-x86_64-bin-DVD1.iso 作为本地源
- vi/vim编辑器显示颜色
- 在ARM平台上 配置appweb 5.2.0 esp-angular-mvc编译环境
- 找出二叉树中和最大的路径,路径可以从任意节点开始,到任意节点结束。
- Phonegap-Android的jquery返回按钮
- magento支付方式paypal的设置
- poj2777
- 黑马程序员--集合