// poll_impl.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#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 <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>#include <poll.h> /* poll function */
#include <limits.h>#define MAXLINE 10240#ifndef OPEN_MAX
#define OPEN_MAX 40960
#endifvoid handle(struct pollfd* clients, int maxClient, int readyClient);int  main(int argc, char **argv)
{int servPort = 6888;int listenq = 1024;int listenfd, connfd;struct pollfd clients[OPEN_MAX];int  maxi;socklen_t socklen = sizeof(struct sockaddr_in);struct sockaddr_in cliaddr, servaddr;char buf[MAXLINE];int nready;bzero(&servaddr, socklen);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);if (listenfd < 0) {perror("socket error");}int opt = 1;if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {perror("setsockopt error");}if(bind(listenfd, (struct sockaddr *) &servaddr, socklen) == -1) {perror("bind error");exit(-1);}if (listen(listenfd, listenq) < 0) {perror("listen error");    }clients[0].fd = listenfd;clients[0].events = POLLIN;int i;for (i = 1; i< OPEN_MAX; i++) clients[i].fd = -1; maxi = listenfd + 1;printf("pollechoserver startup, listen on port:%d\n", servPort);printf("max connection is %d\n", OPEN_MAX);for ( ; ; )  {nready = poll(clients, maxi + 1, -1);//printf("nready is %d\n", nready);if (nready == -1) {perror("poll error");}if (clients[0].revents & POLLIN) {connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &socklen);sprintf(buf, "accept form %s:%d\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port);printf(buf, "");for (i = 0; i < OPEN_MAX; i++) {if (clients[i].fd == -1) {clients[i].fd = connfd;clients[i].events = POLLIN;break;}}if (i == OPEN_MAX) {fprintf(stderr, "too many connection, more than %d\n", OPEN_MAX);close(connfd);continue;}if (i > maxi)maxi = i;--nready;}handle(clients, maxi, nready);}
}void handle(struct pollfd* clients, int maxClient, int nready) {int connfd;int i, nread;char buf[MAXLINE];if (nready == 0)return;for (i = 1; i< maxClient; i++) {connfd = clients[i].fd;if (connfd == -1) continue;if (clients[i].revents & (POLLIN | POLLERR)) {nread = read(connfd, buf, MAXLINE);//读取客户端socket流if (nread < 0) {perror("read error");close(connfd);clients[i].fd = -1;continue;}if (nread == 0) {printf("client close the connection");close(connfd);clients[i].fd = -1;continue;}write(connfd, buf, nread);//响应客户端  if (--nready <= 0)//没有连接需要处理,退出循环break;}}
}

网络编程五种IO模型之poll模型相关推荐

  1. 网络编程五种IO模型的形象比喻(老陈收信)

    网摘录如下比喻,实在生动贴切..... select模型  WSAAsyncSelect模型  WSAEventSelect模型  Overlapped I/O 事件通知模型  Overlapped ...

  2. 网络编程五种IO模型之epoll模型

    // epoll2.cpp : 定义控制台应用程序的入口点. //#include <stdio.h> #include <sys/epoll.h> #include < ...

  3. 说说基于网络的五种IO模型

    # django不是一个异步框架 # tornado是异步的web框架# 处理每秒大量的请求# 个人理解的IO:就是应用层与内核驱动层的交互,这个过程无论从应用层到内核中,还是驱动层等待硬件层的数据, ...

  4. Linux网络编程 五种I/O 模式及select、epoll方法的理解

    近期一次面试机会让我觉得有很多地方理解可能不到位,翻翻谷歌的资料加深对一些技术的理解 五种I/O 模式: [1] 阻塞 I/O (Linux下的I/O操作默认是阻塞I/O,即open和socket创建 ...

  5. 你应该知道的五种IO模型

    点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 写在前面 linux操作系统包含了五种IO模型,各种上层编程语言或者网络编程框架的上层实现都是基于操作系统的这些IO实现来实 ...

  6. Linux五种IO模型性能分析

    转载:http://blog.csdn.net/jay900323/article/details/18141217     Linux五种IO模型性能分析 目录(?)[-] 概念理解 Linux下的 ...

  7. Linux 下的五种 IO 模型

    Linux 下的五种 IO 模型 来源:decaywood's Blog 概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2 ...

  8. 聊聊 Linux 中的五种 IO 模型

    聊聊 Linux 中的五种 IO 模型 2016/04/21 · IT技术 · 8 评论 · iO, 同步, 异步, 阻塞, 非阻塞 分享到:0 本文作者: 伯乐在线 - 陶邦仁 .未经作者许可,禁止 ...

  9. 详解Linux 五种IO模型

    原文:https://www.jianshu.com/p/486b0965c296 上一篇 同步.异步.阻塞.非阻塞 已经通俗的讲解了,要理解同步.异步.阻塞与非阻塞重要的两个概念点了,没有看过的,建 ...

最新文章

  1. Spring的单元测试
  2. 熟读《阿里巴巴java开发手册》(五、 MySQL 数据库)
  3. 肝!一文讲解JWT用户认证全过程
  4. 无中生有!没有视觉信号的视觉语音增强
  5. php数组超索引,php数组多维索引
  6. 华为回应美新规:不涉及产品买卖;微软 GitHub 帐户疑被黑;GCC 10.1 发布 | 极客头条...
  7. LayUI2.2.5中文离线文档(免费免费免费)
  8. 7月书讯(下)| 宝藏新书助你“乘风破浪”
  9. 快解析外网如何访问内网共享服务器
  10. Linux学习:文件和用户管理——文件管理命令
  11. MOS管工作动画原理图详解
  12. Java生态浩如烟海
  13. Java数组实现:一群人围成一圈从123报数 如果报到3就退出该圈中 直到最后一个人留下来!问其位置
  14. Linux 下 mv 覆盖相同文件,centos7 覆盖重复文件
  15. vmware无法使用nat上网解决方式
  16. 用JAVA代码利用坐标构造三角形、椭圆、直线并求其周长、面积
  17. 知识管理在企业中的重要性
  18. iOS使用OCLint做静态代码分析
  19. 坦克大战小游戏关键技术总结
  20. Python基础学习:关键字from

热门文章

  1. Java第三大的数,Java通过排序找出数组第三大数字
  2. v-model详细使用
  3. OpenCV-图像几何变换:旋转,缩放,斜切 .
  4. 【自动驾驶】毫米波雷达相关知识专题
  5. Spring IOC 容器源码分析 - 获取单例 bean
  6. 新手向:Vue 2.0 的建议学习顺序
  7. Redis发布与订阅(pub/sub)
  8. Java虚拟机学习(4):JDK可视化监控工具
  9. docker 入门教程指南
  10. TeXworks使用教程指南