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

kenlistian

厚積薄發(fā). 勤為槳,思為帆

   :: 首頁(yè) :: 新隨筆 ::  :: 聚合  :: 管理 ::
  73 隨筆 :: 4 文章 :: 22 評(píng)論 :: 0 Trackbacks

   在網(wǎng)絡(luò)通訊中,socket處于阻塞模式運(yùn)行時(shí),其存在著超時(shí)處理。以下總結(jié)下在那些阻塞函數(shù)的處理方法。

這里摘抄一段描述阻塞函數(shù)的描述,非常到位。

所謂阻塞函數(shù),是指其完成指定的任務(wù)之前不允許程序調(diào)用另一個(gè)函數(shù),在Windows下還會(huì)阻塞本線(xiàn)程消息的發(fā)送。

所謂非阻塞函數(shù),是指操作啟動(dòng)之后,如果可以立即得到結(jié)果就返回結(jié)果,否則返回表示結(jié)果需要等待的錯(cuò)誤信息,不等待任務(wù)完成函數(shù)就返回。

首先,異步函數(shù)是非阻塞函數(shù);

其次,獲取遠(yuǎn)地信息的數(shù)據(jù)庫(kù)函數(shù)是阻塞函數(shù)(因此,WinSock提供了其異步版本);

在Berkeley socket函數(shù)部分中,不涉及網(wǎng)絡(luò)I/O、本地端工作的函數(shù)是非阻塞函數(shù);

在Berkeley socket函數(shù)部分中,網(wǎng)絡(luò)I/O的函數(shù)是可阻塞函數(shù),也就是它們可以阻塞執(zhí)行,也可以不阻塞執(zhí)行。這些函數(shù)都使用了一個(gè)socket,如果它們使用的socket是阻塞的,則這些函數(shù)是阻塞函數(shù);如果它們使用的socket是非阻塞的,則這些函數(shù)是非阻塞函數(shù)

    其實(shí)說(shuō)明阻塞還是非阻塞也是我們可以設(shè)置相關(guān)。這里主要講解下處于阻塞模式下的超時(shí)處理。

1.在我們直接調(diào)用socket創(chuàng)建時(shí),如果不進(jìn)行特意聲明的話(huà),創(chuàng)建的socket都是阻塞的。這樣當(dāng)我們調(diào)用accept,recv時(shí),將有可能“block”,如果想設(shè)置為非阻塞,則方法有調(diào)用fcntl,select,WSAAsynSelect 來(lái)改變socket的阻塞

hsocket = socket(AF_INET, SOCK_STREAM, 0)

fcntl(hsocket, F_SETFL, 0_NONBLOCK);

 注意:

    其中fcntl是Unix系統(tǒng)環(huán)境中使用的,使用ioctl()函數(shù)和fcntl()函數(shù)實(shí)現(xiàn)對(duì)套接字的控制,而在Windows系統(tǒng)中則應(yīng)使用ioctlsocket()函數(shù)。

 Ioctl和fcntl的區(qū)別是:

  ioctl   -   control   device  
  ioctl()   performs   a   variety   of   control   functions     on     devices  
            and   STREAMS.     For   non-STREAMS   files,   the   functions   performed  
            by   this   call   are   device-specific   control   functions.     request  
            and     an   optional   third   argument   with   varying   type   are   passed  
            to   the   file   designated   by   fildes   and   are   interpreted   by     the  
            device   driver.  
    The   fcntl()   function   provides   control   of   open   file   descriptors.   It   is   similar   to   ioctl().

   ( 這些帶著unix的體味的函數(shù),看著就頭大。這個(gè)我是摘自某個(gè)文檔,設(shè)置超時(shí)應(yīng)該采用ioctlsocket。)

1.調(diào)用MFC的CAsyncSocket和CSocket類(lèi)

  MFC提供了兩個(gè)類(lèi)CAsyncSocket和CSocket來(lái)封裝WinSock API,

  CAsyncSocket在較低層次上封裝了WinSock API,缺省情況下,使用該類(lèi)創(chuàng)建的socket是非阻塞的socket,所有操作都會(huì)立即返回,如果沒(méi)有得到結(jié)果,返回WSAEWOULDBLOCK,表示是一個(gè)阻塞操作。

  CSocket建立在CAsyncSocket的基礎(chǔ)上,是CAsyncSocket的派生類(lèi)。也就是缺省情況下使用該類(lèi)創(chuàng)建的socket是非阻塞的socket,但是CSocket的網(wǎng)絡(luò)I/O是阻塞的,它在完成任務(wù)之后才返回。CSocket的阻塞不是建立在“阻塞”socket的基礎(chǔ)上,而是在“非阻塞”socket上實(shí)現(xiàn)的阻塞操作,在阻塞期間,CSocket實(shí)現(xiàn)了本線(xiàn)程的消息循環(huán),因此,雖然是阻塞操作,但是并不影響消息循環(huán),即用戶(hù)仍然可以和程序交互。(即程序不會(huì)freeze)。

  其中設(shè)置超時(shí)函數(shù)如下:

CAsyncSocket::SetSockOpt(   int   nOptionName,   const   void*   lpOptionValue,   int   nOptionLen,   int   nLevel   =   SOL_SOCKET   );  
  nOptionName用SO_SNDTIMEO   or   SO_RCVTIMEO。  

2.采用select處理超時(shí)

int select(int nfds, fd_set FAR* readfds, fd_set FAR* writefds,fd_set FAR*exceptfds, const struct timeval FAR* timeout)

其中在windows中,其nfds可以可以設(shè)置為0,沒(méi)有實(shí)際意義。

fd_set  fdR;
struct  timeval timeout = ..; //設(shè)置超時(shí)時(shí)間
...
for(;;) {
        FD_ZERO(&fdR);
        FD_SET(sockfd, &fdR);
        switch (select(sockfd + 1, &fdR, NULL, &timeout)) {
                case -1:
                    //錯(cuò)誤,需要關(guān)閉端口。。。
                case 0:

                   //  timeout 處理

                default:
                        if (FD_ISSET(sockfd)) { 

                            //或讀寫(xiě)操作或Accept()操作,按你設(shè)置處理。
                        }
        }
}

注意的是:

     由于Windows Sockets 某些函數(shù)在接口上雖然與Unix Sockets一致,但是它們的內(nèi)部實(shí)現(xiàn)卻不一樣,例如,在函數(shù)select()的參數(shù)中,Unix Sockets實(shí)現(xiàn)套接字集合使用的是位掩碼,但在Windows Sockets中卻是使用一個(gè)SOCKET的數(shù)組。雖然套接字的集合仍由fd_set類(lèi)型表示,但在Unix Sockets 源文件中直接修改fd_set結(jié)構(gòu)的代碼在Windows Sockets環(huán)境下將不能正常工作。故fd_set在微軟中則采用FD_XXX宏處理。

3.采用WSAsyncSelect() 

   這個(gè)是消息事件模式來(lái)處理的,通過(guò)其中參數(shù)句柄返回一個(gè)消息,在自定義消息中處理。

 

4.采用setsockopt設(shè)置超時(shí)

int PASCAL FAR setsockopt( SOCKET s, int level, int optname,
const char FAR* optval, int optlen);

s:標(biāo)識(shí)一個(gè)套接口的描述字。
level:選項(xiàng)定義的層次;目前僅支持SOL_SOCKET和IPPROTO_TCP層次。
optname:需設(shè)置的選項(xiàng)。
optval:指針,指向存放選項(xiàng)值的緩沖區(qū)。
optlen:optval緩沖區(qū)的長(zhǎng)度。

     setsockopt()函數(shù)用于任意類(lèi)型、任意狀態(tài)套接口的設(shè)置選項(xiàng)值。盡管在不同協(xié)議層上存在選項(xiàng),但本函數(shù)僅定義了最高的“套接口”層次上的選項(xiàng)。選項(xiàng)影響套接口的操作,諸如加急數(shù)據(jù)是否在普通數(shù)據(jù)流中接收,廣播數(shù)據(jù)是否可以從套接口發(fā)送等等。
  有兩種套接口的選項(xiàng):

      一種是布爾型選項(xiàng),允許或禁止一種特性;

      一種是整形或結(jié)構(gòu)選項(xiàng)。允許一個(gè)布爾型選項(xiàng),則將optval指向非零整形數(shù);禁止一個(gè)選項(xiàng)optval指向一個(gè)等于零的整形數(shù)。

        對(duì)于布爾型選項(xiàng),optlen應(yīng)等于sizeof(int);對(duì)其他選項(xiàng),optval指向包含所需選項(xiàng)的整形數(shù)或結(jié)構(gòu),而optlen則為整形數(shù)或結(jié)構(gòu)的長(zhǎng)度。

      SO_LINGER選項(xiàng)用于控制下述情況的行動(dòng):套接口上有排隊(duì)的待發(fā)送數(shù)據(jù),且closesocket()調(diào)用已執(zhí)行。參見(jiàn)closesocket()函數(shù)中關(guān)于SO_LINGER選項(xiàng)對(duì)closesocket()語(yǔ)義的影響。應(yīng)用程序通過(guò)創(chuàng)建一個(gè)linger結(jié)構(gòu)來(lái)設(shè)置相應(yīng)的操作特性。

      這個(gè)setsockopt的水也太深了,對(duì)于一般運(yùn)用大致運(yùn)用就行,主要是其中參數(shù)太多,只需要了解幾個(gè)就可以了,至于想了解更多,則讀msdn吧,以及相關(guān)的文檔吧,不過(guò)感覺(jué)這些東西純粹就是個(gè)技術(shù)指標(biāo)細(xì)節(jié),不需要?jiǎng)幽X筋卻需要了解的一個(gè)方面,說(shuō)白了是這些都是技術(shù)活而不是腦力活。

常見(jiàn)的命令:

//確定套接字自動(dòng)讀入的數(shù)據(jù)量

#define FIONREAD _IOR(''''f'''', 127, u_long) /* get # bytes to read */

//允許或禁止套接字的非阻塞模式,允許為非0,禁止為0

#define FIONBIO _IOW(''''f'''', 126, u_long) /* set/clear non-blocking i/o */

//確定是否所有帶外數(shù)據(jù)都已被讀入

#define SIOCATMARK _IOR(''''s'''', 7, u_long) /* at oob mark? */

設(shè)置接受超時(shí)

posted on 2007-12-27 18:04 kenlistian 閱讀(7606) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            久久av在线| 亚洲人成毛片在线播放女女| 欧美黄色一级视频| 国产欧美日韩综合一区在线观看| 欧美激情一区二区三区蜜桃视频| 国产日韩一区二区三区在线播放| 一区二区高清视频| 亚洲精品孕妇| 欧美成人国产va精品日本一级| 久久视频这里只有精品| 国产欧美日韩亚洲一区二区三区| 亚洲理伦电影| 夜夜嗨av色综合久久久综合网| 久久伊人亚洲| 模特精品裸拍一区| 1204国产成人精品视频| 久久精品视频网| 久久久精品一区| 激情成人在线视频| 久久精品免费电影| 卡通动漫国产精品| 一区二区三区在线不卡| 久久久久在线观看| 欧美a级一区| 亚洲激情国产精品| 欧美成人综合在线| 亚洲激情不卡| 亚洲深夜av| 欧美视频成人| 亚洲欧美清纯在线制服| 久久成年人视频| 韩日欧美一区二区| 久久经典综合| 欧美国产日韩a欧美在线观看| 亚洲电影免费| 欧美日韩成人在线播放| 中国成人亚色综合网站| 欧美亚洲免费在线| 精品9999| 欧美老女人xx| 亚洲一区二区在线| 久久亚洲不卡| 亚洲精品视频中文字幕| 欧美日产国产成人免费图片| 亚洲午夜小视频| 久久精品国产亚洲a| 在线日韩日本国产亚洲| 欧美精品免费播放| 亚洲女人小视频在线观看| 久久美女性网| 亚洲精品一区二区三区婷婷月| 欧美日韩中文字幕日韩欧美| 亚洲欧美日韩人成在线播放| 裸体丰满少妇做受久久99精品| 亚洲国产视频直播| 欧美日韩小视频| 欧美在线观看一区| 亚洲国产综合91精品麻豆| 亚洲一区二区三区在线观看视频 | 欧美一二三区精品| 麻豆91精品91久久久的内涵| 亚洲日韩中文字幕在线播放| 国产精品爽爽爽| 嫩草国产精品入口| 亚洲欧美日韩专区| 亚洲国产欧美精品| 久久精品一区中文字幕| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 欧美亚洲视频一区二区| 亚洲福利精品| 国产日韩欧美视频在线| 欧美国产精品v| 欧美伊人久久久久久久久影院 | 国产精品久久久久久久久 | 亚洲欧美国产精品桃花| 亚洲国产1区| 久久久五月婷婷| 亚洲综合国产| 亚洲精选91| 在线观看中文字幕亚洲| 国产精品一二一区| 欧美日韩综合在线| 欧美精品xxxxbbbb| 久久欧美中文字幕| 午夜免费日韩视频| 在线视频亚洲一区| 亚洲精品日产精品乱码不卡| 免费一级欧美片在线观看| 欧美一区在线直播| 亚洲制服av| 亚洲视频一区在线观看| 日韩视频一区| 亚洲精品小视频| 亚洲高清视频一区二区| 极品少妇一区二区| 国产午夜精品理论片a级大结局| 欧美视频久久| 欧美日韩午夜视频在线观看| 欧美精品一区二区三区蜜臀| 你懂的视频一区二区| 久久久久久国产精品mv| 久久精品国产99精品国产亚洲性色 | 亚洲国产欧美一区二区三区久久| 美国十次成人| 麻豆成人综合网| 久久免费视频网站| 久久久亚洲一区| 久久亚洲精品一区| 免费看av成人| 欧美激情中文不卡| 亚洲国产欧美不卡在线观看| 最新亚洲一区| 99精品国产热久久91蜜凸| 日韩天天综合| 亚洲五月六月| 校园激情久久| 久久精品亚洲热| 麻豆精品国产91久久久久久| 欧美肥婆bbw| 欧美日本亚洲韩国国产| 欧美手机在线视频| 国产嫩草一区二区三区在线观看| 国产情侣久久| 在线成人黄色| 99综合在线| 欧美自拍偷拍午夜视频| 噜噜噜91成人网| 亚洲精品一区二区在线| 亚洲午夜久久久久久尤物 | 亚洲欧美日韩国产成人| 欧美主播一区二区三区美女 久久精品人| 欧美一级网站| 欧美成人黑人xx视频免费观看| 欧美日韩一区不卡| 国产亚洲精品一区二区| 亚洲国产精品一区二区第一页| 日韩视频一区二区三区在线播放 | 欧美在线观看你懂的| 久久亚洲电影| 日韩一级不卡| 久久精品国产免费看久久精品| 欧美成人一品| 国产日韩欧美制服另类| 91久久久久久久久| 亚洲欧美制服中文字幕| 免费成人av在线看| 在线一区欧美| 欧美va亚洲va香蕉在线| 国产精品视频一区二区高潮| 1769国内精品视频在线播放| 亚洲小说欧美另类社区| 麻豆成人av| 亚洲一区二区三区四区中文| 欧美69视频| 国产欧美一区二区白浆黑人| 99香蕉国产精品偷在线观看| 久久九九热免费视频| 亚洲欧洲精品一区二区三区| 欧美中文字幕第一页| 欧美日韩国产首页| 在线观看91精品国产入口| 亚洲一区亚洲| 亚洲国产天堂网精品网站| 欧美在线啊v| 欧美性视频网站| 亚洲精品日韩在线观看| 久久久午夜视频| 亚洲欧美日韩区| 欧美特黄a级高清免费大片a级| 亚洲国产日韩美| 久久亚洲春色中文字幕| 亚洲综合日本| 欧美午夜女人视频在线| 亚洲免费精品| 亚洲第一在线综合在线| 久久久久久精| 国内一区二区三区在线视频| 亚洲自拍三区| 一本在线高清不卡dvd| 欧美国产精品日韩| 亚洲日本精品国产第一区| 蜜臀久久99精品久久久画质超高清 | 亚洲高清av在线| 久久综合一区| 亚洲第一中文字幕在线观看| 久久婷婷综合激情| 欧美怡红院视频| 国产一区二区三区四区五区美女| 午夜视频一区| 午夜国产不卡在线观看视频| 国产精品国产三级国产aⅴ无密码| 一区二区av在线| 日韩一级免费观看| 欧美日韩免费观看中文| 在线亚洲精品福利网址导航| 亚洲毛片av| 欧美午夜激情视频| 午夜精品影院| 欧美在线亚洲综合一区| 在线观看欧美日韩|