一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

socket編程select函數(shù)的使用

 怎么了啊早上 2014-08-18

用戶在ADAM-4501上使用TCP/IP方式通訊時(shí),當(dāng)服務(wù)器發(fā)送命令時(shí),進(jìn)行后續(xù)動(dòng)作,但服務(wù)器不發(fā)命令時(shí),會(huì)等待,導(dǎo)致其它操作無法正常執(zhí)行。recv這類函數(shù)是阻塞函數(shù),也就是說沒有得到數(shù)據(jù)是不會(huì)返回的,這就造成了一個(gè)問題,程序執(zhí)行到這些函數(shù)里面的時(shí)候就一直等待,而這個(gè)時(shí)候如果要有其他的操作根本得不到響應(yīng)。而select函數(shù)就是為了解決這這個(gè)問題。它將很多個(gè)阻塞函數(shù)做成一個(gè)集合,只要這些函數(shù)中任何一個(gè)有數(shù)據(jù)輸入了,它馬上返回,然后判斷是哪一個(gè)有輸入,再進(jìn)行相應(yīng)的操作。


select模型的中心思想就是利用select函數(shù),實(shí)現(xiàn)對(duì)I/O的管理。利用select函數(shù),我們可以判斷套接字上是否存在數(shù)據(jù),或者能否向一個(gè)套接字寫入數(shù)據(jù)。利用這個(gè)函數(shù)可以防止應(yīng)用程序在一次I/O的綁定調(diào)用中進(jìn)入鎖定狀態(tài)。
select函數(shù)原型:
int select(
  __in     int nfds,    //忽略
  __inout  fd_set *readfds,   //檢查可讀性
  __inout  fd_set *writefds,   //檢查可寫性
  __inout  fd_set *exceptfds,   //用于例外數(shù)據(jù)
  __in     const struct timeval *timeout //超時(shí)時(shí)間,傳遞NULL會(huì)無限期等待下去,0會(huì)立刻返回
);


可讀性說明:
1.有數(shù)據(jù)可以讀入。
2.連接已經(jīng)關(guān)閉,重設(shè)或者中止。
3.加入調(diào)用了listen,而且一個(gè)連接正在建立,那么accept函數(shù)調(diào)用會(huì)成功。

關(guān)于連接已經(jīng)關(guān)閉,重設(shè)或者中止的判斷:
當(dāng)一個(gè)套接字在調(diào)用了select之后具有可讀性,那么這個(gè)時(shí)候我們可以通過調(diào)用recv獲得數(shù)據(jù)。如果真的有數(shù)據(jù)發(fā)送過來,那么這個(gè)調(diào)用會(huì)成功。如果是關(guān)閉,重設(shè)或者中止,那么recv的調(diào)用會(huì)失敗,這個(gè)時(shí)候通過wsagetlasterror就可以判斷連接是否已經(jīng)中斷。


可寫性說明:
1.有數(shù)據(jù)可以發(fā)出。
2.如果已完成了對(duì)一個(gè)非鎖定連接調(diào)用處理,連接就會(huì)成功。

對(duì)于可寫性的檢查,最好放在需要寫數(shù)據(jù)的時(shí)候進(jìn)行檢查。如果和可讀性放在同一個(gè)地方進(jìn)行檢查,那么select很可能每次都會(huì)因?yàn)榭蓪懶詸z查成功而返回。


例外數(shù)據(jù)說明:
1.加入已完成了對(duì)一個(gè)非鎖定連接調(diào)用的處理,連接嘗試就會(huì)失敗。
2.有帶外數(shù)據(jù)可供讀寫。


fd_set幾個(gè)宏的說明:
FD_SETSIZE   定義了fd_set所允許存放套接字的最大個(gè)數(shù),默認(rèn)是64。
FD_CLR(s,*set):從set中刪除套接字s。
FD_ISSET(s, *set):檢查s是否set集合的一名成員;如答案是肯定的是,則返回TRUE。
FD_SET(s, *set):將套接字s加入集合set。
FDZERO(*set):將set初始化成空集合。


select調(diào)用流程:
1)
使用FDZERO宏,初始化自己感興趣的每一個(gè)fd_set。
2) 使用FDSET宏,將套接字句柄分配給自己感興趣的每個(gè)fd_set。
3) 調(diào)用select函數(shù),然后等待在指定的fd_set集合中,I/O活動(dòng)設(shè)置好一個(gè)或多個(gè)套接字句柄。select完成后,會(huì)返回在所有fd_set集合中設(shè)置的套接字句柄總數(shù),它會(huì)修改每個(gè)fd_set結(jié)構(gòu),刪除那些不存在待決I/O操作的套接字句柄
4) 根據(jù)select的返回值,我們的應(yīng)用程序便可判斷出哪些套接字存在著尚未完成(待決)的I/O操作—具體的方法是使用FD_ISSET宏,對(duì)每個(gè)fd_set集合進(jìn)行檢查。
5) 知道了每個(gè)集合中“待決”的I/O操作之后,對(duì)I/O進(jìn)行處理,然后返回步驟1 ),繼續(xù)進(jìn)行select處理。

如下例
int    sockfd;
fd_set fdR;
struct timeval timeout = ..;
...
for(;;) {
       FD_ZERO(&fdR);
       FD_SET(sockfd, &fdR);
       switch (select(sockfd + 1, &fdR, NULL, &timeout)) {
                case -1:
                        error handled by u;
                case 0:
                        timeout hanled by u;
                default:
                        if (FD_ISSET(sockfd)) {
                                now u read orrecv something;


                        }
       }
}


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    亚洲乱码av中文一区二区三区| 亚洲一区在线观看蜜桃| 成人亚洲国产精品一区不卡| 色婷婷在线精品国自产拍| 国产日产欧美精品大秀| 好吊妞视频免费在线观看| 色哟哟国产精品免费视频| 一区二区三区四区亚洲专区| 精品少妇一区二区视频| 国产成人亚洲欧美二区综| 日韩av生活片一区二区三区| 日本精品最新字幕视频播放 | 亚洲熟妇中文字幕五十路| 欧美日韩国产欧美日韩| 五月的丁香婷婷综合网| 这里只有九九热精品视频| 国产精品亚洲综合色区韩国| 大尺度剧情国产在线视频| 一区二区福利在线视频| 国产午夜福利在线观看精品| 国产一区二区三区不卡| 在线播放欧美精品一区| 九九久久精品久久久精品| 国产不卡免费高清视频| 免费黄片视频美女一区| 伊人国产精选免费观看在线视频| 欧美视频在线观看一区| 亚洲最新的黄色录像在线| 黄片在线观看一区二区三区| 美日韩一区二区精品系列| 欧美欧美欧美欧美一区| 久久热这里只有精品视频| 亚洲午夜精品视频在线| 丰满人妻一二三区av| 亚洲熟妇熟女久久精品| 欧美日韩国产精品自在自线| 久久热中文字幕在线视频| 亚洲国产成人av毛片国产| 高潮少妇高潮久久精品99| 99久免费精品视频在线观| 亚洲人午夜精品射精日韩|