青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-80  評論-24  文章-0  trackbacks-0
select()函數(shù)和poll()函數(shù)均是主要用來處理多路I/O復(fù)用的情況。比如一個服務(wù)器既想等待輸入終端到來,又想等待若干個套接字有客戶請求到達,這時候就需要借助select或者poll函數(shù)了。

(一)select()函數(shù)

原型如下:

1 int select(int fdsp1, fd_set *readfds, fd_set *writefds, fd_set *errorfds, const struct timeval *timeout);

各個參數(shù)含義如下:
  • int fdsp1:最大描述符值 + 1
  • fd_set *readfds:對可讀感興趣的描述符集
  • fd_set *writefds:對可寫感興趣的描述符集
  • fd_set *errorfds:對出錯感興趣的描述符集
  • struct timeval *timeout:超時時間(注意:對于linux系統(tǒng),此參數(shù)沒有const限制,每次select調(diào)用完畢timeout的值都被修改為剩余時間,而unix系統(tǒng)則不會改變timeout值)
select函數(shù)會在發(fā)生以下情況時返回:
  1. readfds集合中有描述符可讀
  2. writefds集合中有描述符可寫
  3. errorfds集合中有描述符遇到錯誤條件
  4. 指定的超時時間timeout到了
當(dāng)select返回時,描述符集合將被修改以指示哪些個描述符正處于可讀、可寫或有錯誤狀態(tài)??梢杂肍D_ISSET宏對描述符進行測試以找到狀態(tài)變化的描述符。如果select因為超時而返回的話,所有的描述符集合都將被清空。
select函數(shù)返回狀態(tài)發(fā)生變化的描述符總數(shù)。返回0意味著超時。失敗則返回-1并設(shè)置errno。可能出現(xiàn)的錯誤有:EBADF(無效描述符)、EINTR(因終端而返回)、EINVAL(nfds或timeout取值錯誤)。
設(shè)置描述符集合通常用如下幾個宏定義:

1 FD_ZERO(fd_set *fdset);                /* clear all bits in fdset           */
2 FD_SET(int fd, fd_set *fdset);         /* turn on the bit for fd in fd_set  */
3 FD_CLR(int fd, fd_set *fdset);         /* turn off the bit for fd in fd_set */
4 int FD_ISSET(int fd, fd_set *fdset);   /* is the bit for fd on in fdset?    */

如:

1 fd_set rset;
2 FD_ZERO(&rset);                        /* initialize the set: all bits off  */
3 FD_SET(1&rset);                      /* turn on bit for fd 1              */
4 FD_SET(4&rset);                      /* turn on bit for fd 4              */
5 FD_SET(5&rset);                      /* turn on bit for fd 5              */

當(dāng)select返回的時候,rset位都將被置0,除了那些有變化的fd位。
當(dāng)發(fā)生如下情況時認為是可讀的:
  1. socket的receive buffer中的字節(jié)數(shù)大于socket的receive buffer的low-water mark屬性值。(low-water mark值類似于分水嶺,當(dāng)receive buffer中的字節(jié)數(shù)小于low-water mark值的時候,認為socket還不可讀,只有當(dāng)receive buffer中的字節(jié)數(shù)達到一定量的時候才認為socket可讀)
  2. 連接半關(guān)閉(讀關(guān)閉,即收到對端發(fā)來的FIN包)
  3. 發(fā)生變化的描述符是被動套接字,而連接的三路握手完成的數(shù)量大于0,即有新的TCP連接建立
  4. 描述符發(fā)生錯誤,如果調(diào)用read系統(tǒng)調(diào)用讀套接字的話會返回-1。
當(dāng)發(fā)生如下情況時認為是可寫的:
  1. socket的send buffer中的字節(jié)數(shù)大于socket的send buffer的low-water mark屬性值以及socket已經(jīng)連接或者不需要連接(如UDP)。
  2. 寫半連接關(guān)閉,調(diào)用write函數(shù)將產(chǎn)生SIGPIPE
  3. 描述符發(fā)生錯誤,如果調(diào)用write系統(tǒng)調(diào)用寫套接字的話會返回-1。
注意:
select默認能處理的描述符數(shù)量是有上限的,為FD_SETSIZE的大小。
對于timeout參數(shù),如果置為NULL,則表示wait forever;若timeout->tv_sec = timeout->tv_usec = 0,則表示do not wait at all;否則指定等待時間。
如果使用select處理多個套接字,那么需要使用一個數(shù)組(也可以是其他結(jié)構(gòu))來記錄各個描述符的狀態(tài)。而使用poll則不需要,下面看poll函數(shù)。

(二)poll()函數(shù)

原型如下:

1 int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);

各參數(shù)含義如下:
  • struct pollfd *fdarray:一個結(jié)構(gòu)體,用來保存各個描述符的相關(guān)狀態(tài)。
  • unsigned long nfds:fdarray數(shù)組的大小,即里面包含有效成員的數(shù)量。
  • int timeout:設(shè)定的超時時間。(以毫秒為單位)
poll函數(shù)返回值及含義如下:
  • -1:有錯誤產(chǎn)生
  • 0:超時時間到,而且沒有描述符有狀態(tài)變化
  • >0:有狀態(tài)變化的描述符個數(shù)
著重講fdarray數(shù)組,因為這是它和select()函數(shù)主要的不同的地方:
pollfd的結(jié)構(gòu)如下:

1 struct pollfd {
2    int fd;                  /* descriptor to check */
3    short events;      /* events of interest on fd */
4    short revents;     /* events that occured on fd */
5 };

其實poll()和select()函數(shù)要處理的問題是相同的,只不過是不同組織在幾乎相同時刻同時推出的,因此才同時保留了下來。select()函數(shù)把可讀描述符、可寫描述符、錯誤描述符分在了三個集合里,這三個集合都是用bit位來標(biāo)記一個描述符,一旦有若干個描述符狀態(tài)發(fā)生變化,那么它將被置位,而其他沒有發(fā)生變化的描述符的bit位將被clear,也就是說select()的readset、writeset、errorset是一個value-result類型,通過它們傳值,而也通過它們返回結(jié)果。這樣的一個壞處是每次重新select 的時候?qū)媳仨氈匦沦x值。而poll()函數(shù)則與select()采用的方式不同,它通過一個結(jié)構(gòu)數(shù)組保存各個描述符的狀態(tài),每個結(jié)構(gòu)體第一項fd代表描述符,第二項代表要監(jiān)聽的事件,也就是感興趣的事件,而第三項代表poll()返回時描述符的返回狀態(tài)。合法狀態(tài)如下:

  • POLLIN:                有普通數(shù)據(jù)或者優(yōu)先數(shù)據(jù)可讀
  • POLLRDNORM:    有普通數(shù)據(jù)可讀
  • POLLRDBAND:    有優(yōu)先數(shù)據(jù)可讀
  • POLLPRI:              有緊急數(shù)據(jù)可讀
  • POLLOUT:            有普通數(shù)據(jù)可寫
  • POLLWRNORM:   有普通數(shù)據(jù)可寫
  • POLLWRBAND:    有緊急數(shù)據(jù)可寫
  • POLLERR:            有錯誤發(fā)生
  • POLLHUP:            有描述符掛起事件發(fā)生
  • POLLNVAL:          描述符非法

對于POLLIN | POLLPRI等價與select()的可讀事件;POLLOUT | POLLWRBAND等價與select()的可寫事件;POLLIN 等價與POLLRDNORM | POLLRDBAND,而POLLOUT等價于POLLWRBAND。如果你對一個描述符的可讀事件和可寫事件以及錯誤等事件均感興趣那么你應(yīng)該都進行相應(yīng)的設(shè)置。
對于timeout的設(shè)置如下:
  • INFTIM:   wait forever
  • 0:            return immediately, do not block
  • >0:         wait specified number of milliseconds

對于select()和poll()函數(shù)的講解暫時到此。 更多細節(jié)請參考下面這篇博文:http://www.shnenglu.com/just51living/archive/2011/07/28/151995.html
posted on 2011-10-26 19:04 myjfm 閱讀(12052) 評論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            浪潮色综合久久天堂| 欧美高清在线观看| 国产一区日韩二区欧美三区| 欧美在线一二三四区| 亚洲免费在线视频一区 二区| 国产欧美精品一区aⅴ影院| 久久激情综合网| 精品999网站| 国产精品欧美一区喷水| 欧美一区二区三区在线| 性色av一区二区三区| 在线观看视频免费一区二区三区| 亚洲第一精品夜夜躁人人躁| 欧美激情一区二区三区在线视频观看 | 欧美精品三级| 亚洲网站视频福利| 亚洲欧美制服中文字幕| 在线观看国产精品网站| 亚洲精品一区二区在线观看| 亚洲欧美日韩一区二区| 亚洲福利一区| 欧美日本在线播放| 午夜精品久久久久久久99水蜜桃| 欧美在线视频免费| 亚洲激情亚洲| 中文亚洲欧美| 在线精品视频一区二区| 99精品国产在热久久下载| 国产三区二区一区久久| 亚洲精品日韩综合观看成人91| 亚洲电影av| 91久久午夜| 国产美女精品一区二区三区| 亚洲国产电影| 国产日韩欧美在线视频观看| 亚洲黄色片网站| 国产婷婷色一区二区三区四区 | 国产综合一区二区| 亚洲精选成人| 尤物在线精品| 亚洲欧美一区二区三区在线 | 国产精品啊啊啊| 亚洲电影av在线| 国产一区二区高清| 亚洲一二三区在线| 一区二区高清在线观看| 欧美不卡福利| 欧美成人精品一区二区| 国产亚洲精品久久飘花| 亚洲午夜三级在线| 亚洲亚洲精品在线观看 | 欧美一区不卡| 亚洲免费视频观看| 欧美视频在线观看免费网址| 亚洲激情亚洲| 亚洲精品一区二| 美女主播一区| 欧美福利在线观看| 亚洲国产精品久久人人爱蜜臀| 久久久精品国产99久久精品芒果| 欧美自拍偷拍| 国产一区二区日韩精品| 欧美在线视频导航| 老巨人导航500精品| 狠色狠色综合久久| 久久久999| 美女视频网站黄色亚洲| 在线看一区二区| 久久亚洲精品一区| 欧美好骚综合网| 99国产精品国产精品久久| 欧美韩日一区二区三区| 亚洲美女在线视频| 午夜精品久久久久久久久久久久久| 欧美性久久久| 亚洲欧美影院| 蜜臀va亚洲va欧美va天堂 | 国产女人水真多18毛片18精品视频| 9久re热视频在线精品| 亚洲无亚洲人成网站77777| 欧美三级在线播放| 午夜欧美精品久久久久久久| 久久天堂成人| 亚洲精品麻豆| 国产精品国产一区二区| 性欧美xxxx大乳国产app| 噜噜噜91成人网| 亚洲狼人精品一区二区三区| 欧美视频福利| 久久久www免费人成黑人精品| 欧美激情精品久久久久久蜜臀| 一本综合精品| 国产日韩欧美在线看| 麻豆freexxxx性91精品| 亚洲毛片在线看| 久久久久免费观看| 日韩视频一区| 国产亚洲欧美色| 欧美精品麻豆| 久久精品二区三区| 夜久久久久久| 欧美国产一区二区| 欧美一区二区在线播放| 最新亚洲激情| 国产精品视频久久一区| 免费中文日韩| 午夜亚洲伦理| aa国产精品| 欧美激情一区二区三区| 久久国产精品免费一区| 夜夜爽av福利精品导航| 黄色成人在线| 国产伦精品一区二区三区视频孕妇 | 一本色道久久精品| 免费在线观看一区二区| 香蕉成人久久| 在线亚洲高清视频| 亚洲激情欧美| 韩国欧美一区| 国产日韩一区二区三区在线| 欧美日韩免费在线视频| 免费观看30秒视频久久| 欧美一区综合| 亚洲欧美变态国产另类| 99国产精品99久久久久久| 欧美激情精品久久久久久| 久久亚洲综合色| 欧美在线亚洲在线| 欧美亚洲系列| 亚洲女人天堂成人av在线| 99精品国产在热久久婷婷| 亚洲国产天堂久久综合| 亚洲成人自拍视频| 黄色av日韩| 黄色一区二区在线观看| 国产亚洲欧美日韩一区二区| 国产精品自拍一区| 国产精品视频免费一区| 国产精品嫩草99av在线| 国产精品大片免费观看| 欧美午夜精品电影| 国产精品久久久久aaaa樱花| 国产精品v亚洲精品v日韩精品| 欧美日韩视频在线一区二区观看视频| 欧美成人中文字幕| 欧美福利视频在线观看| 欧美高清自拍一区| 欧美日韩国产一区| 欧美视频在线观看视频极品| 欧美午夜精品理论片a级按摩 | 国产九九精品视频| 国产伦精品一区二区三区| 国产精品羞羞答答| 国产无一区二区| 精品成人一区二区三区| 亚洲国产精品尤物yw在线观看| 亚洲电影免费观看高清完整版在线观看 | 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美一区二区| 久久久美女艺术照精彩视频福利播放| 久久久久久久999精品视频| 久久综合五月| 亚洲人成欧美中文字幕| 一本色道久久88综合日韩精品| 亚洲视屏在线播放| 久久精品国产亚洲一区二区三区 | 亚洲影视在线| 久久精品夜色噜噜亚洲a∨ | 毛片基地黄久久久久久天堂| 欧美片在线播放| 国产精品一区二区三区乱码| 一区二区视频免费在线观看| 亚洲精品看片| 午夜精品理论片| 免费在线观看精品| 日韩午夜在线电影| 久久精品国产亚洲aⅴ| 欧美激情小视频| 国产日韩欧美在线观看| 亚洲人在线视频| 久久精品99无色码中文字幕| 亚洲电影免费| 先锋a资源在线看亚洲| 免费在线看一区| 国产日韩欧美不卡| 一本色道久久综合一区 | 99精品视频免费在线观看| 欧美在线观看一区二区| 91久久精品www人人做人人爽| 亚洲尤物精选| 欧美日韩精品免费观看| 激情成人中文字幕| 午夜精品婷婷| 日韩网站在线观看| 蘑菇福利视频一区播放| 国产一区二三区| 午夜亚洲性色视频| 99国产一区| 欧美大片在线看免费观看| 韩国欧美一区|