poll使用示例
2015-09-23 11:52
302 查看
server.cpp
client.cpp同上一篇select
poll与select区别在于文件描述符没有上限,select是1024个
#include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netinet/tcp.h> #include <sys/select.h> #include <poll.h> #include <netdb.h> #include <limits.h> #define ip "192.168.188.133" #define port 8888 #define INFTIM 10000 int main(int argc, char* argv[]) { int afd, sfd; struct sockaddr_in servaddr; //创建socket文件描述符 sfd = socket(AF_INET, SOCK_STREAM, 0); if(sfd == -1) { perror("sfd == -1"); exit(1); } //防止端口复用 int reuse = 1 ; setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (void*)&reuse, sizeof(reuse)); //初始化socket memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(port) ; servaddr.sin_addr.s_addr = inet_addr(ip); //绑定套接字 if(bind(sfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) { perror("bind error"); exit(1); } //监听套接字 if(listen(sfd, 5) == -1) { perror("listen error"); exit(1); } struct pollfd fdarr[4]; fdarr[0].fd = sfd; fdarr[0].events = POLLIN; for(int i = 1; i < 4; ++i) { fdarr[i].fd = -1; } int maxfd = sfd; int confd; int i = 1; while(1) { int flag = poll(fdarr, maxfd + 1, INFTIM); if(flag == -1) { perror("poll error"); exit(1); } if(fdarr[0].revents & POLLIN)//监听套接字可读 { confd = accept(sfd, NULL, NULL); for(i = 1; i < 4; ++i) { if(fdarr[i].fd == -1) { fdarr[i].fd = confd; fdarr[i].events = POLLIN; break; } } if(i == 4) { perror("too many client"); exit(1); } if(fdarr[i].fd > maxfd) { maxfd = fdarr[i].fd; } } for(i = 1; i < 4; ++i) { if(fdarr[i].fd == -1) { continue; } if(fdarr[i].revents & (POLLIN | POLLERR)) { int readn; char buf[10]; memset(buf, 0, 10); if((readn = read(fdarr[i].fd, buf, 10)) < 0) { if(errno == ECONNRESET) { close(fdarr[i].fd); fdarr[i].fd = -1; }else { perror("read error"); } }else if(readn == 0) { close(fdarr[i].fd); fdarr[i].fd = -1; }else { printf("%s\n", buf); } } } } //关闭套接字 close(sfd); return 0; }
client.cpp同上一篇select
poll与select区别在于文件描述符没有上限,select是1024个
相关文章推荐
- Ajax局部刷新
- 中国移动EMPP.dll组件运用
- 超屌CircleProgressBar
- 关于Android使用proguard进行代码混淆
- Oracle数据加载之外部表的介绍
- tomcat文件详解
- uGUI 基本组件
- java中调用js脚本
- GridView的一些特殊属性
- hibernate持久化对象状态
- Go语言黑魔法
- XMLHttpRequest 异步方式和同步方式
- 如何将一个Activity设置成窗口的样式
- 最老程序员创业开发实训12---Android---在MVC架构下Activity设计及实现
- 数据库设计
- Bootstrap学习笔记-栅格系统
- Android中图片加载和显示问题的探究
- oracle数据库段的概念
- swift学习笔记(一)NSUserDefaults存储对象的方法
- swift学习笔记(一)NSUserDefaults存储对象的方法