设为首页 加入收藏

TOP

Linux Socket 编程I/O Multiplexing
2014-11-24 01:04:16 来源: 作者: 【 】 浏览:7
Tags:Linux Socket 编程 I/O Multiplexing

Linux Socket 编程中I/O Multiplexing 主要通过三个函数来实现:select, poll,epoll来实现。I/O Multiplexing,先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已准备好进行I/O时,该函数才返回。在返回时,它告诉进程哪些描述符已准备好可以进行I/O。本文具体介绍一下select 和poll的用法,给出简单的demo代码,简要分析一下这两个函数的使用易出错的地方。


  中间三个参数readfds、writefds和exceptfds是指向描述符集的指针。这三个描述符集说明了我们关心的可读、可写或出于异常条件的各个描述符,设置为NULL则表示不关心。每个描述符集存放在一个fd_set数据类型中。这种数据类型为每一可能的描述符保持一位。描述符集的函数接口(可能实现为宏)包括:调用FD_ZERO将一个指定的fd_set变量的所有位设置为0;调用FD_SET设置一个fd_set变量的指定位;调用FD_CLR将一指定位清楚;调用FD_ISSET测试一指定位是否设置。


  文件描述符集fdset中的文件描述符的个数是有限制的,最大值由FD_SETSIZE指定,一般为1024.


  Select 最后一个参数用于设置超时值,当select监听达到超时值时还未有关心的事件发生则返回,函数返回值为0.


  超时参数如果设置为 NULL 则无限等待。


  下面来是一个简单的select Echo server:


  在使用select 的时候要注意两点:


    第一个参数需要是当前所关心的文件描述符中最大的一个+1


    第二需要注意的是select的中间3个参数采用了“value-result”(UNP1的说法)的方式,设置了关心的文件描述符进行select,select返回之后对应描述的fdset中只有有事件发生的对应fd会被设置,其它关心但是没有事件发生的描述符将会从fdset中清除掉,如果不进行重新赋值,下次select就不会关注这些描述符了,因此上述代码中allset每次对rset进行复制。


  来看看如果只在while(1) 之前设置rset,在while(1) 中不在每次select之前赋值会发生什么,在控制台输入: strace ./simpleEcho,另外打开一个控制台窗口输入:nc localhost 1314,这作为一个连接Echo server 的 client,然后输入你想发往Echo Server内容。关键我们来看一下Echo server的情况:



】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇I/O multiplexing 与 非阻塞网络.. 下一篇Linux Socket 编程I/O Mutiplexin..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: