• <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>
            posts - 34,comments - 2,trackbacks - 0

            Select模型出現(xiàn)的目的::模型的出現(xiàn)是為了解決一個(gè)客戶端一線程的問(wèn)題,為了WINDOWS的線程切換不要太頻繁。

             

            select函數(shù)

            int select(

            int maxfdp,   //忽略

            fd_set *readfds,//檢查可讀性

            fd_set *writefds,      //檢查可寫(xiě)性

            fd_set *errorfds,      //檢查錯(cuò)誤

            struct timeval *timeout   //指定函數(shù)等待的最長(zhǎng)時(shí)間

            );

             

            1、理解struct fd_set(一個(gè)套接字集合)

            struct fd_set可以理解為一個(gè)集合,這個(gè)集合中存放的是文件描述符(filedescriptor),即文件句柄,這可以是我們所說(shuō)的普通意義的文件,當(dāng)然Unix下任何設(shè)備、管道、FIFO等都是文件形式,全部包括在內(nèi),所以毫無(wú)疑問(wèn)一個(gè)socket就是一個(gè)文件,socket句柄就是一個(gè)文件描述符。

             

            2、使用struct fd_set

            FD_ZERO(fd_set * set) //清空集合

            FD_SET(s,fd_set * set) //添加套接字集合

            FD_CLR(s ,fd_set* set) //set移除套接字s

            FD_ISSET(s ,fd_set* set)//檢查集合中s是否set的成員

             

             

            3struct timeval

            struct timeval {   

            time_t tv_sec; /* */   

            suseconds_t tv_usec; /* 微秒*/  };

             

            4、參數(shù)含義

            fd_set*readfds我們是要監(jiān)視這些文件描述符的讀變化的,即我們關(guān)心是否可以從這些文件中讀取數(shù)據(jù)了,如果這個(gè)集合中有一個(gè)文件可讀,select就會(huì)返回一個(gè)大于0的值,表示有文件可讀,如果沒(méi)有可讀的文件,則根據(jù)timeout參數(shù)再判斷是否超時(shí),若超出timeout的時(shí)間,select返回0,若發(fā)生錯(cuò)誤返回負(fù)值。可以傳入NULL值,表示不關(guān)心任何文件的讀變化。   

            fd_set*writefds我們是要監(jiān)視這些文件描述符的寫(xiě)變化的,即我們關(guān)心是否可以向這些文件中寫(xiě)入數(shù)據(jù)了,如果這個(gè)集合中有一個(gè)文件可寫(xiě),select就會(huì)返回一個(gè)大于0的值,表示有文件可寫(xiě),如果沒(méi)有可寫(xiě)的文件,則根據(jù)timeout參數(shù)再判斷是否超時(shí),若超出timeout的時(shí)間,select返回0,若發(fā)生錯(cuò)誤返回負(fù)值。可以傳入NULL值,表示不關(guān)心任何文件的寫(xiě)變化。   

            fd_set *errorfds同上面兩個(gè)參數(shù)的意圖,用來(lái)監(jiān)視文件錯(cuò)誤異常。

             

            5、超時(shí)的設(shè)置

            struct timeval *timeoutselect的超時(shí)時(shí)間,這個(gè)參數(shù)至關(guān)重要,它可以使select處于三種狀態(tài)

            ①、若將NULL以形參傳入,即不傳入時(shí)間結(jié)構(gòu),就是將select置于阻塞狀態(tài),一定等到監(jiān)視文件描述符集合中某個(gè)文件描述符發(fā)生變化為止;

            ②、若將時(shí)間值設(shè)為00毫秒,就變成一個(gè)純粹的非阻塞函數(shù),不管文件描述符是否有變化,都立刻返回繼續(xù)執(zhí)行,文件無(wú)變化返回0,有變化返回一個(gè)正值;

            ③、timeout的值大于0,這就是等待的超時(shí)時(shí)間,即selecttimeout時(shí)間內(nèi)阻塞,超時(shí)時(shí)間之內(nèi)有事件到來(lái)就返回了,否則在超時(shí)后不管怎樣一定返回,返回值同上述。

             

            6、返回值:   

            負(fù)值:select錯(cuò)誤 正值:某些文件可讀寫(xiě)或出錯(cuò) 0:等待超時(shí),沒(méi)有可讀寫(xiě)或錯(cuò)誤的文件


             

            posted on 2011-08-23 21:07 Yu_ 閱讀(336) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程
            嫩草伊人久久精品少妇AV| 久久精品免费大片国产大片| 久久午夜夜伦鲁鲁片免费无码影视| 国产免费久久精品99re丫y| 一本久久a久久精品亚洲| 亚洲一区中文字幕久久| 久久久久亚洲国产| 精品综合久久久久久97超人 | 色悠久久久久久久综合网| 精品综合久久久久久97| 久久精品视频网| 香蕉久久久久久狠狠色| 国产精品成人久久久久久久| yy6080久久| 国产伊人久久| 久久男人Av资源网站无码软件| 久久综合色区| 久久精品一区二区三区不卡| 久久SE精品一区二区| 精品国产91久久久久久久a| 国产麻豆精品久久一二三| 亚洲国产成人精品91久久久| 国产精品99久久久久久www| 久久久国产乱子伦精品作者| 久久精品国产精品亚洲精品| 国产精品欧美久久久久天天影视| 久久91亚洲人成电影网站| 亚洲精品蜜桃久久久久久| 日韩欧美亚洲综合久久影院Ds | 青青青青久久精品国产h| 久久精品无码专区免费青青| 伊人久久综合精品无码AV专区| 欧美精品福利视频一区二区三区久久久精品| 国产精品久久久久jk制服| 亚洲国产另类久久久精品| 99久久做夜夜爱天天做精品| 久久只这里是精品66| 久久久久波多野结衣高潮| 久久99这里只有精品国产| 香蕉久久久久久狠狠色| 久久久精品人妻一区二区三区蜜桃 |