poll服务端代码实现
2015-08-11 16:34
267 查看
#include <sys/socket.h> #include <sys/wait.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <poll.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> #define MAXLINE 1024 #define OPEN_MAX 10 int main() { int listenfd, connfd, sockfd, i, maxi; int nready; ssize_t n; char line[MAXLINE]; //FILE *fp = fopen("epoll.unl", "w"); struct pollfd client[OPEN_MAX]; struct sockaddr_in cliaddr, servaddr; socklen_t clilen; listenfd = socket(AF_INET, SOCK_STREAM, 0); int enable = 1; setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(12345); bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); listen(listenfd, 5); client[0].fd = listenfd; client[0].events = POLLRDNORM; for(i = 1; i < OPEN_MAX; i++) { client[i].fd = -1; } maxi = 0; for(; ;) { sleep(2); nready = poll(client, maxi + 1, 0);// -1:阻塞,永远等待 0:立即返回,不阻塞 >0:等待指定的毫秒数 printf("nready = %d\n", nready); if(client[0].revents & POLLRDNORM) { printf("start accept...\n"); clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen); for(i = 1; i < OPEN_MAX; i++) { if(client[i].fd < 0) { client[i].fd = connfd; break; } } if(i == OPEN_MAX) { printf("too many clients\n"); exit(1); } client[i].events = POLLRDNORM; if(i > maxi) { maxi = i; printf("listen maxi = %d\n", maxi); } if(--nready <= 0) { continue; } printf("listen nready = %d\n", nready); } printf("maxi = %d\n", maxi); for(i = 1; i <= maxi; i++) { if((sockfd = client[i].fd) < 0) { continue; } if(client[i].revents & (POLLRDNORM | POLLERR)) { if((n = read(sockfd, line, MAXLINE)) < 0) { if(errno == ECONNRESET) { close(sockfd); client[i].fd = -1; } else { printf("readline error\n"); } } else if(n == 0) { close(sockfd); client[i].fd == -1; } else { printf("readline:%s\n", line); write(sockfd, line, n); } if(--nready <= 0) { break; } } } } return 0; }
相关文章推荐
- UVA 11292 The Dragon of Loowater
- eclipse下svn的分支与合并指南 - 更新版
- C# 匿名方法 委托 Action委托 Delegate委托
- 详解PHP中的状态模式编程
- asp.net 父窗体获取子窗体的返回值,可用来对父窗体局部更新
- QSqlTableModel和QTableView设置复选框
- epoll服务端代码实现
- C语言大数乘法
- C# ListView用法详解
- django orm排序
- Matlab工具箱导入
- java读取txt文件
- Java中堆内存和栈内存的区别
- 使用未公开关键字在 C# 中导入外部 printf 等参数数量可变函数 [2] C# 实现
- QT显示图片
- Eclipse debug的按钮不见了
- java统计字符串中各个字符的出现次数
- 使用未公开关键字在 C# 中导入外部 printf 等参数数量可变函数 [1] CLR 支持
- ASP.NET验证码(3种)
- C++控制程序只运行一个实例