linux/unix网络编程之 poll
转自http://www.cnblogs.com/zhuwbox/p/4222382.html
poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪。如果有就返回就绪文件描述符的个数将。poll 函数如下:
#include <poll.h>
int poll(struct pollfd *fdarray, unsigned long nfds, int timeout)
第一个参数指向结构数组第一个元素的指针,每个数组都是一个 pollfd 结构,用于指定测试某个给定描述符 fd 的条件。
struct pollfd
{
int fd;
short events;//关心 fd 上发生的事件
short revents;//fd 实际上上发生的事件
}
要测试的条件由 events 成员指定,函数在相应的 revents 成员中返回该描述符的状态(每个描述符都有两个变量,一个为调用值,另一个为返回结果,从而避免值-结果参数)这两个成员中的每一个都由指定某个特定条件的一位或多位组合而成。下标列出指定 events 标志以及测试 revents 标志的一些常值。
----------------------------+---------------------------------------+---------------------------------------+----------------------------------------+
常量 | 能做为 events 的输入吗? | 能作为revents 的结果吗? | 说明 |
----------------------------+---------------------------------------+---------------------------------------+----------------------------------------+
POLLIN | 能 | 能 | 普通或者优先级带数据可读 |
POLLRDNORM | 能 | 能 | 普通数据可读 |
POLLRDBAND | 能 | 能 | 优先级带数据可读 |
POLLPRI | 能 | 能 | 高优先级数据可读 |
----------------------------+---------------------------------------+---------------------------------------+----------------------------------------+
POLLOUT | 能 | 能 | 普通数据可写 |
POLLWRNORM | 能 | 能 | 普通数据可写 |
POLLWRBAND | 能 | 能 | 优先级带数据可写 |
----------------------------+---------------------------------------+--------------------------------------+-----------------------------------------+
POLLERR | | 能 | 发生错误 |
POLLHUP | | 能 | 发生挂起 |
POLLNVAL | | 能 | 描述字不是一个打开的文件 |
-----------------------------+--------------------------------------+---------------------------------------+----------------------------------------+
第二个参数 nfds 制定数组中元素个数。第三个参数指定 poll 函数返回前等待多长时间。 INFTIM 表示永远等待, 0 代表立即返回, > 0 等待指定数目的秒数。
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <stdio.h>
- #include <error.h>
- #include <errno.h>
- #include <unistd.h>
- #include <string.h>
- #include <stdlib.h>
- #include <sys/wait.h>
- #include <limits.h>
- #include <poll.h>
- #include <sys/stropts.h>
- #include <signal.h>
- #define MAXLINE 5
- #define OPEN_MAX 1024
- #define SA struct sockaddr
- int main()
- {
- int listenfd, connfd, sockfd, i, maxi;
- int nready;
- socklen_t clilen;
- ssize_t n;
- char buf[MAXLINE];
- struct pollfd client[OPEN_MAX];
- struct sockaddr_in servaddr, cliaddr;
- //创建监听套接字
- if((listenfd = socket(AF_INET, SOCK_STREAM, )) < )
- {
- printf("socket() error!");
- exit();
- }
- //先要对协议地址进行清零
- bzero(&servaddr,sizeof(servaddr));
- //设置为 IPv4 or IPv6
- servaddr.sin_family = AF_INET;
- //绑定本地端口号
- servaddr.sin_port = htons();
- //任何一个 IP 地址,让内核自行选择
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- //绑定套接口到本地协议地址
- if(bind(listenfd, (SA *) &servaddr,sizeof(servaddr)) < )
- {
- printf("bind() error!");
- exit();
- }
- //服务器开始监听
- if(listen(listenfd,) < )
- {
- printf("listen() error!");
- exit();
- }
- client[].fd = listenfd;
- client[].events = POLLRDNORM;//关心监听套机字的读事件
- for(i = ; i < OPEN_MAX; ++i)
- {
- client[i].fd = -;
- }
- maxi = ;
- for(;;)
- {
- nready = poll(client, maxi + , -);
- if(client[].revents & POLLRDNORM)
- {
- clilen = sizeof(cliaddr);
- //accept 的后面两个参数都是值-结果参数,他们的保留的远程连接电脑的信息,如果不管新远程连接电脑的信息,可以将这两个参数设置为 NULL
- connfd = accept(listenfd, (SA *) &cliaddr, &clilen);
- if(connfd < )
- {
- continue;
- }
- for(i = ; i < OPEN_MAX; ++i)
- {
- if(client[i].fd < )
- client[i].fd = connfd;
- break;
- }
- if(i == OPEN_MAX)
- {
- printf("too many clients");
- exit();
- }
- client[i].events = POLLRDNORM;
- if(i > maxi)
- {
- maxi = i;
- }
- if(--nready <= )
- continue;
- }
- for(i = ; i < OPEN_MAX; ++i)
- {
- if((sockfd = client[i].fd) < )
- {
- continue;
- }
- if(client[i].revents & POLLRDNORM | POLLERR)
- {
- if((n = read(sockfd, buf, MAXLINE)) < )
- {
- if(errno == ECONNRESET)
- {
- close(sockfd);
- client[i].fd = -;
- }
- else
- {
- printf("read error!\n");
- }
- }
- else if(n == )
- {
- close(sockfd);
- client[i].fd = -;
- }
- else
- {
- write(sockfd, buf, n);
- }
- if(--nready <= )
- break;
- }
- }
- }
- }
linux/unix网络编程之 poll的更多相关文章
- linux/unix网络编程之 select
转自http://www.cnblogs.com/zhuwbox/p/4221934.html linux 下的 select 知识点 unp 的第六章已经描述的很清楚,我们这里简单的说下 selec ...
- linux/unix网络编程之epoll
转载自 Linux epoll模型 ,这篇文章讲的非常详细! 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显 ...
- Linux/Unix C编程之的perror函数,strerror函数,errno
#include <stdio.h> // void perror(const char *msg); #include <string.h> // char *strerro ...
- unix网络编程之listen()详解
转自于:http://blog.csdn.net/ordeder/article/details/21551567 Unix网络编程描述如下: #include <sys/socket.h> ...
- unix下网络编程之I/O复用(三)
poll函数 在上文unix下网络编程之I/O复用(二)中已经介绍了select函数的相关使用,本文将介绍另一个常用的I/O复用函数poll.poll提供的功能与select类似,不过在处理流设备时, ...
- linux网络编程之shutdown() 与 close()函数详解
linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这 ...
- python3网络编程之socketserver
本节主要是讲解python3网络编程之socketserver,在上一节中我们讲到了socket.由于socket无法支持多用户和多并发,于是就有了socket server. socket serv ...
- 高并发网络编程之epoll详解(转载)
高并发网络编程之epoll详解(转载) 转载自:https://blog.csdn.net/shenya1314/article/details/73691088 在linux 没有实现epoll事件 ...
- 网络编程之C10K
网络编程之C10K 虽然在过去的十几年里C10K问题已经可以很好的解决,但学习网络编程时研究C10K问题仍然价值巨大,因为技术的发展都是有规律和线索可循的,了解C10K问题及其解决思路,通过举一反三, ...
随机推荐
- wampserver修改mysql数据库密码后phpMyAdmin无法连接数据库
phpMyAdmin开始能打开,但是我在权限里把root的密码改了,再打开phpMyAdmin就显示:“phpMyAdmin 试图连接到 MySQL 服务器,但服务器拒绝连接.您应该检查 config ...
- 开发中/listfile.jsp(11,31) quote symbol expected 这个错误
可能是因为11行33列,少了一个引号.
- Javascript 面向对象编程
Javascript是一个类C的语言,他的面向对象的东西相对于C++/Java比较奇怪,但是其的确相当的强大,在 Todd 同学的“对象的消息模型”一文中我们已经可以看到一些端倪了.这两天有个前同事总 ...
- WPF解析TTF 字体
偶遇需要自己解析 TTF 字体并显示,此做... using System; using System.Collections.Generic; using System.Drawing.Text; ...
- ubuntu下格式化内存当硬盘使的小实验
内存虚拟硬盘(ramdisk)是指通过软件技术,将物理内存进行分割,将一部分内存通过虚拟技术转变为硬盘以较大幅度提升计算机数据读取速度和保护硬盘. 在ubuntu下的dev下有ram相关的文件,这些文 ...
- word小技巧
如何将英文和数字替换为times new romans 1,点击替换(ctrl+H) .2,在查找内容中输入”([A-Z0-9])“(不包括引号,但包括小括号),这是替换所有大写字母和数字,如果还想替 ...
- 2014 Multi-University Training Contest 8
官方解题报告:http://blog.sina.com.cn/s/blog_a19ad7a10102uzj7.html Area of Mushroom http://acm.hdu.edu.cn/s ...
- 2014 Multi-University Training Contest 6
官方解题报告:http://blog.sina.com.cn/s/blog_a19ad7a10102uz2v.html Apple Tree http://acm.hdu.edu.cn/showpro ...
- POJ1013Counterfeit Dollar
这个题主要是判断硬币真假,可能轻可能重,称三次,要输出哪枚是假币,还要输出是重的还是轻的,所以最主要的是标记变量 #include<cstdio> #include<cstring& ...
- lintcode 中等题:Singleton number II 落单的数 II
题目 落单的数 II 给出3*n + 1 个的数字,除其中一个数字之外其他每个数字均出现三次,找到这个数字. 样例 给出 [1,1,2,3,3,3,2,2,4,1] ,返回 4 挑战 一次遍历,常数级 ...