poll函数
来源:互联网 发布:软件需求变更申请表 编辑:程序博客网 时间:2024/06/01 08:13
//TCP回射服务器poll实现#include<stdio.h>//#include<stdlib.h>#include<sys/types.h>//#include<sys/stat.h>#include<sys/socket.h>#include<poll.h>#include<netinet/in.h>#include<unistd.h>#include<strings.h>#include<string.h>#include<limits.h>#include<errno.h>#include<stdlib.h>#include<stropts.h>//INFTIM包含的文件#define LISTENQ 1024#define OPEN_MAX 1024#define MAXLINE 4096int main(void){ int listenfd, connfd, sockfd;//监听套接字、已连接的套接字 struct sockaddr_in server_sockaddr, client_sockaddr;//套接字地址结构 struct pollfd client[OPEN_MAX];//客户信息 socklen_t clilen; int i, maxi, nready, n; char buf[MAXLINE]; if((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)//创建一个套接字 { fprintf(stderr, "Socket failed\n"); exit(EXIT_FAILURE); } else printf("Socket success\n"); bzero(&server_sockaddr, sizeof(server_sockaddr)); server_sockaddr.sin_family = AF_INET;//TCP/IP协议族 server_sockaddr.sin_port = htons(9877);//以网络字节序存储端口 server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);//以网络字节序存储IP地址 if(bind(listenfd, (struct sockaddr*)&server_sockaddr, sizeof(server_sockaddr)) < 0) { fprintf(stderr, "Bind failed\n");//stderr不带缓冲,速度快 exit(EXIT_FAILURE); } else printf("Bind success\n"); if(listen(listenfd, LISTENQ) < 0) { fprintf(stderr, "Listen failed\n"); exit(EXIT_FAILURE); } else printf("Listen success\n"); client[0].fd = listenfd;//给监听描述符加入client数组中 client[0].events = POLLRDNORM; for(i=1; i<OPEN_MAX; i++) client[i].fd = -1;//数组中其他描述符初始化为-1 maxi = 0;//存储索引最大值 memset(buf, 0, MAXLINE); while(1) { nready = poll(client, maxi+1, -1);//poll函数 if(client[0].revents & POLLRDNORM)//new client connection { clilen = sizeof(client_sockaddr); connfd = accept(listenfd, (struct sockaddr*)&client_sockaddr, &clilen);//连接新的客户 for(i=1; i<OPEN_MAX; i++) { if(client[i].fd < 0)//将新的已连接的描述符加入client数组 { client[i].fd = connfd; break; } } //client[i].events = POLLRDNORM; if(i == OPEN_MAX) { fprintf(stderr, "too many clients\n"); exit(EXIT_FAILURE); } client[i].events = POLLRDNORM; if(i > maxi) maxi = i; if(--nready <= 0) continue;//no more readable descriptors } //处理已经连接的客户 for(i=1; i<= maxi; i++) { if((sockfd = client[i].fd) < 0) continue; if(client[i].revents & (POLLRDNORM | POLLERR)) { if((n = read(sockfd, buf, MAXLINE)) < 0) { if(errno == ECONNRESET) { close(sockfd);//终止连接 client[i].fd = -1; } else exit(EXIT_FAILURE); } else if(n == 0)//connection closed by client { close(sockfd); client[i].fd = -1; } else { printf("%s\n", buf); write(sockfd, buf, n); memset(buf, 0, MAXLINE); } if(--nready <= 0)//no more readable descriptors break; } } } }
阅读全文
0 0
- POLL函数
- poll函数
- poll 函数
- poll() 函数
- poll函数
- poll函数
- poll 函数
- poll函数
- poll函数
- poll函数
- Poll函数
- poll 函数
- poll函数
- poll函数
- poll函数
- poll函数
- poll函数
- poll函数
- JS模块化编程
- Cannot remove entries from nonexistent file /usr/local/bin/anaconda2/lib/python2.7/site-packages/eas
- 数据库范式
- Java学习之Iterator(迭代器)的一般用法 (转)
- 使用Mybatis生成工具自动生成实体类和对应的mapper映射文件以及接口文件
- poll函数
- 3n+1 问题 java 实现
- 栈与堆的思考
- php之$_SESSION的理解
- 递归和分治思想及其应用
- hexo搭建博客
- HTTP与HTTPS的Post请求
- rails在控制台、服务器、migrate分别指定启动环境
- 软件工程(C编码实践篇)学习总结