linux 下 poll 编程
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 下 select 编程 就是一个完整的客户端/服务器端代码了,运行结果截图如下:
客户端:

服务器端:
linux 下 poll 编程的更多相关文章
- Linux 下IOport编程訪问
曾经写的一篇笔记.偶尔翻出来了,放在这里做个纪念 Linux 下IOport编程訪问 这里记录的方法是在用户态訪问IOport,不涉及驱动程序的编写. 首先要包括头文件 /usr/include/as ...
- Linux下Socket编程的端口问题( Bind error: Address already in use )
Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...
- linux下socket编程实例
linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...
- Linux 下shell 编程学习脚手架
linux body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-t ...
- linux下libnet编程 亲自测试可用
linux下libnet编程 亲自测试可用 亲自测试 如果build包的时候 只要把类型改了 就能改成相应的协议. 0x0800 ip 0x0806 arp 0x86DD IPv6 0x86e ...
- Linux下socket编程基本知识
本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...
- linux 下 epoll 编程
转载自 Linux epoll模型 ,这篇文章讲的非常详细! 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显 ...
- linux 下 select 编程
linux 下的 select 知识点 unp 的第六章已经描述的很清楚,我们这里简单的说下 select 的作用,并给出 select 的客户端实例.我们知道 select 是IO 多路复用的一个最 ...
- linux下socket编程
相关结构 //下边这两个结构定义在<sys/types.h>里 //一般的地址结构,只能用于覆盖(把其他地址转换为此类型),且只能引用该地址的sa_family字段 struct sock ...
随机推荐
- Think in java浏览一
Think in java作为java语言的圣经书籍之一,几乎成为每个java程序员必看的书籍,不看都不好意思说自己是java程序员,不过一般也不说自己认真看了,就说自己翻了翻.作为写安卓的,当然也要 ...
- MVC 避免黄页
可以使用HandleErrorAttribute 有两种方式可以使用它,在类或者方法的头上加 [HandleError] 这种直接在类或者方法上加[HandlerError]手动添加 另外一种方式是使 ...
- No application 'meetme' for extension 错误
在asterisk中搭建简单会议室,在extensions.conf中执行到 exten => 18,n,MeetMe(18,p) asterisk控制台提示:Aug 6 8:28:41 WAR ...
- IOS中的NSTimer定时器详解
/* 在IOS中有多种定时器,这里我对NSTimer定时器做了一个简单的介绍.如果你是小白,你可能会从这篇文章中学习到一些知识,如果你是大牛,请别吝啬你的评论,指出我的不足,你的质疑是对我最大的帮助. ...
- C#下如何用NPlot绘制期货股票K线图(2):读取数据文件让K线图自动更新
[内容介绍]上一篇介绍了K线图的基本绘制方法,但很不完善,本篇增加了它直接读取数据的功能,这对于金融市场的数据量大且又需要动态刷新功能的实现很重要. [实现方法] 1.需要一个数据文件,这里用的是直接 ...
- js判断主流浏览器类型和版本号
如今的互联网中,浏览器可以说是太多太多了,但是大部分都是换壳不换心,基本上主流的浏览器还是火狐,谷歌,IE,safrai这几种比较常见,所以在我们的开发中,有时候需要遇到判断用户正在使用什么浏览器以及 ...
- js生成动态日历
效果图: 看代码: <html> <head> <title>动态日历</title> <style type="text/css& ...
- java图片高质量缩放类
import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import java.awt.image.BufferedI ...
- C++实现一个多线程同步方式的协同工作程序示例
多线程并发程序与协同程序其实是不同的概念.多线程并发是多个执行序同时运行,而协同程序是多个执行序列相互协作,同一时刻只有一个执行序列.今天想到的是将两者结合起来,拿现实生活中的例子来说,假设一个班级有 ...
- Python正则表达式Regular Expression基本用法
资料来源:http://blog.csdn.net/whycadi/article/details/2011046 直接从网上资料转载过来,作为自己的参考.这个写的很清楚.先拿来看看. 1.正则表 ...