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

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

(一)select()函數

原型如下:

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

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

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              */

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

(二)poll()函數

原型如下:

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

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

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()函數要處理的問題是相同的,只不過是不同組織在幾乎相同時刻同時推出的,因此才同時保留了下來。select()函數把可讀描述符、可寫描述符、錯誤描述符分在了三個集合里,這三個集合都是用bit位來標記一個描述符,一旦有若干個描述符狀態發生變化,那么它將被置位,而其他沒有發生變化的描述符的bit位將被clear,也就是說select()的readset、writeset、errorset是一個value-result類型,通過它們傳值,而也通過它們返回結果。這樣的一個壞處是每次重新select 的時候對集合必須重新賦值。而poll()函數則與select()采用的方式不同,它通過一個結構數組保存各個描述符的狀態,每個結構體第一項fd代表描述符,第二項代表要監聽的事件,也就是感興趣的事件,而第三項代表poll()返回時描述符的返回狀態。合法狀態如下:

  • POLLIN:                有普通數據或者優先數據可讀
  • POLLRDNORM:    有普通數據可讀
  • POLLRDBAND:    有優先數據可讀
  • POLLPRI:              有緊急數據可讀
  • POLLOUT:            有普通數據可寫
  • POLLWRNORM:   有普通數據可寫
  • POLLWRBAND:    有緊急數據可寫
  • POLLERR:            有錯誤發生
  • POLLHUP:            有描述符掛起事件發生
  • POLLNVAL:          描述符非法

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

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

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            欧美一区二区三区成人| 另类亚洲自拍| 欧美国产乱视频| 久久夜色精品国产欧美乱极品| 久久精品国产v日韩v亚洲| 久久综合色影院| 亚洲国产欧美一区二区三区久久 | 欧美日韩精品久久久| 欧美日韩在线播放| 国产欧美在线观看| 91久久久亚洲精品| 亚洲自拍另类| 久久亚洲不卡| 亚洲最新在线| 久久精品视频在线看| 欧美巨乳在线观看| 国内精品写真在线观看| 999亚洲国产精| 久久精品国产99国产精品澳门| 欧美激情精品久久久久久蜜臀 | 欧美日韩日韩| 亚洲欧洲日本国产| 欧美视频一二三区| 黄色一区二区三区四区| 亚洲美女在线视频| 久久久久久久久久久成人| 亚洲欧洲久久| 久久久久一区二区三区| 国产精品日韩一区| 在线亚洲成人| 亚洲电影观看| 欧美在线视频a| 国产伦精品一区二区三区照片91| 亚洲国产综合91精品麻豆| 欧美一区免费| 日韩午夜视频在线观看| 久久亚洲私人国产精品va媚药| 欧美吻胸吃奶大尺度电影| 91久久在线| 免费在线看一区| 久久大逼视频| 国产性天天综合网| 欧美一区二区免费| 亚洲一区二区精品在线| 欧美久久久久久| 亚洲电影免费观看高清完整版在线观看 | 欧美成人免费一级人片100| 日韩一区二区免费高清| 你懂的国产精品永久在线| 国产在线不卡视频| 午夜精品网站| 亚洲午夜女主播在线直播| 欧美日韩一区二区视频在线| 日韩午夜中文字幕| 亚洲精品在线视频观看| 欧美精品91| 亚洲最新在线视频| 日韩视频在线观看免费| 欧美日韩国产小视频| 99在线热播精品免费| 亚洲精品美女久久7777777| 欧美国内亚洲| 9久草视频在线视频精品| 亚洲人午夜精品免费| 欧美成人精品1314www| 日韩图片一区| 一区二区三区四区五区精品视频| 欧美日韩在线一区| 亚欧成人在线| 久久精品欧美日韩精品| 在线观看日韩av电影| 久久全球大尺度高清视频| 亚洲国产精品成人综合| 一区二区三区免费观看| 中文亚洲欧美| 国产日韩在线亚洲字幕中文| 久热国产精品视频| 免费观看日韩| 亚洲午夜激情网页| 亚洲欧美综合网| 亚洲国产黄色片| 亚洲免费观看| 国产亚洲激情| 亚洲国产欧美久久| 国产精品久久久久久久久久妞妞| 久久精品国产91精品亚洲| 久久久91精品国产一区二区精品| 最新日韩在线| 亚洲影院免费| 亚洲人成人一区二区在线观看| 99国产精品| 欧美精品色网| 国内精品一区二区| 欧美日韩亚洲网| **网站欧美大片在线观看| 欧美国产日韩一区| 亚洲国产欧美一区二区三区久久| 国产一区二区三区网站| 亚洲欧美国产制服动漫| 亚洲一区二区三区免费视频| 在线成人激情黄色| 一区二区三区在线观看视频| 亚洲精品女av网站| 国产精品视频免费| 亚洲免费精彩视频| 99精品视频免费观看| 亚洲特级片在线| 欧美在线亚洲综合一区| 亚洲精品国久久99热| 欧美在线啊v一区| 欧美xx69| 欧美午夜无遮挡| 亚洲三级观看| 亚洲高清视频在线观看| 久久视频一区| 国产日韩欧美夫妻视频在线观看| 久久天堂成人| 亚洲午夜一区二区三区| 亚洲精品极品| 国产精品国产三级国产专播精品人| 国产精品久久福利| 亚洲片区在线| 性欧美18~19sex高清播放| 国产伊人精品| 99国产精品国产精品久久| 狠狠色2019综合网| 亚洲精品一区二区三区福利| 国产一区二区激情| 久久蜜臀精品av| 欧美多人爱爱视频网站| 亚洲精品午夜| 欧美大片第1页| 亚洲精品欧美在线| 亚洲激情第一区| 亚洲午夜精品久久| 欧美精品一级| 136国产福利精品导航网址| 99热免费精品在线观看| 欧美成人精品福利| 久久久久九九九九| 国产精品国产福利国产秒拍 | 国产亚洲欧洲一区高清在线观看 | 亚洲一区二区三区成人在线视频精品| 西瓜成人精品人成网站| 欧美日韩精品综合在线| 极品av少妇一区二区| 欧美激情视频一区二区三区免费 | 久久久久久久综合| 久久狠狠一本精品综合网| 欧美一区二区三区免费视频| 亚洲视频播放| 国产精品国产亚洲精品看不卡15 | 欧美va天堂在线| 美女国内精品自产拍在线播放| 亚洲欧美日韩国产精品| 欧美激情视频一区二区三区免费| 亚洲影视中文字幕| 国产精品伦一区| 男女av一区三区二区色多| 久久综合电影| 亚洲美女精品一区| 一区二区三区精品视频在线观看 | 极品少妇一区二区三区精品视频| 亚洲一区在线播放| 一区二区三区日韩欧美精品| 国产精品久久久久久久浪潮网站| 亚洲日本激情| 欧美成人午夜77777| 国模精品一区二区三区| 欧美va亚洲va日韩∨a综合色| 美脚丝袜一区二区三区在线观看| 欧美一区二区三区在线视频| 免费在线日韩av| 亚洲精品午夜| 亚洲欧美精品suv| 国产一区日韩二区欧美三区| 久久精品亚洲热| 午夜精品短视频| 亚洲国产精品日韩| 美女图片一区二区| 欧美丰满高潮xxxx喷水动漫| 亚洲自拍都市欧美小说| 国产欧美一区二区精品婷婷| 老牛影视一区二区三区| 欧美一区二区三区免费在线看| 亚洲影院免费观看| 亚洲天堂成人在线观看| 亚洲黄色成人| 午夜视频精品| 欧美一区二区三区在线观看视频| 乱中年女人伦av一区二区| 中文在线资源观看网站视频免费不卡| 欧美插天视频在线播放| 国产精品性做久久久久久| 亚洲精品一区二区三区99| 亚洲毛片网站| 亚洲国产欧美一区二区三区同亚洲| 久久久999精品| 在线综合+亚洲+欧美中文字幕| 亚洲精品欧美极品|