• <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>

            yehao's Blog

            套接字Select I/O模型

            轉自http://www.cnblogs.com/yunboy4/archive/2009/08/04/1538915.html 

            select模型

            select(選擇)模型是winsock中常見的I/O模型。之所以稱其為“select模型”,是由于它的
            “中心思想”是利用select函數,實現對I/O的管理!最初設計該模型時,主要面向的是某些使用
            Unix操作系統的計算機,它們采用的是Berkeley套接字方案。select模型已經集成到Winsock1.1中。

            1.通過調用select函數可以確定一個或多個套接字的狀態,判斷套接字上是否有數據,或
            者能否向一個套接字寫入數據。 
             
            int select (int nfds,                                                   //忽略
                            fd_set FAR *readfds,                                //等待可讀性檢查的套接字組的地址
                            fd_set FAR *writefds,                               //等待可寫性檢查的套接字組的地址
                            fd_set FAR *exceptfds,                              //等待錯誤檢查的套接字組的地址
                            const struct timeval FAR *timeout);         //struct timeval結構體地址,select() 最多等待的時間
            //返回值       0--超時,SOCKET_ERROR--失敗
            //說明:此函數的作用是刪除fd_set結構體中沒有IO操作的套接字
            /*
            注意:在3個套接字組中至少有一個不為NULL;在非空集合中必須包含一個套接字句柄。
                 如果timeout設為(0,0),select() 會立即返回,允許應用程序對select操作進行“輪詢”。
                 如:
                    fd_set fdread;
                    FD_ZERO(&fdread);
                    FD_SET(s, &fdread);
                    select(0, &fdread, NULL, NULL, NULL);
                    if(FD_ISSET(s, &fdread))
                    {
                            //套接字可讀
                    }
            */


            2.管理套接字的結構體
            定義:
            typedef 
            struct fd_set {
                    u_int   fd_count;               
            /* how many are SET? */  //元素的個數
                    SOCKET  fd_array[FD_SETSIZE];   /* an array of SOCKETs */
            } fd_set;

            對struct fd_set結構體操作的宏
            FD_SETSIZE              容量,指定fd_array數組大小,默認為64,也可自己修改宏
            FD_ZERO(
            *set)           置空,使數組的元素值都為3435973836,元素個數為0.
            FD_SET(s, 
            *set)         添加,向 struct fd_set結構體添加套接字s
            FD_ISSET(s, 
            *set)       判斷,判斷s是否為 struct fd_set結構體中的一員
            FD_CLR(s, 
            *set)         刪除,從 struct fd_set結構體中刪除成員s    

            3.用Select模型獲取網絡事件

                FD_SET AllSockFd;        
            //裝有所有的套接字
                FD_ZERO(&AllSockFd);
                AllSockFd 
            = ClientSockFd ;
                FD_SET(ListenSock, 
            &AllSockFd);
                FD_SET ReadSockFd;    
            //讀集合
                FD_SET WriteSockFd;    //寫集合
                while(1)
                {
                    FD_ZERO(
            &ReadSockFd);
                    FD_ZERO(
            &WriteSockFd);
                    ReadSockFd 
            = AllSockFd;
                    WriteSockFd 
            = AllSockFd;

                    
            int nRet = select(0&ReadSockFd, &WriteSockFd, NULL, NULL);    
                    
            if(SOCKET_ERROR == nRet)
                    {
                        
            continue;
                    }
                    
            //有請求事件發生
                    if (FD_ISSET(ListenSock, &ReadSockFd))
                    {
                        
            //接受請求
                        SOCKET ClientSock;
                        u_short Port;
                        
            bool nRe = (*(Pam.pListenSock)).Accept(&ClientSock, 0&Port);
                        
            if(nRe)
                        {
                            FD_SET(ClientSock, Pam.pClientSockFd);
                            
            //設置套接字發送緩沖區80K
                            int nBuf = SOCKET_BUFF;
                            
            int nBufLen = sizeof(nBuf);
                            
            int nRe = setsockopt(ClientSock, SOL_SOCKET, SO_SNDBUF, (char*)&nBuf, nBufLen);
                            
            if(SOCKET_ERROR == nRe)
                                AfxMessageBox(
            "setsockopt error!");    
                            
            //檢查緩沖區是否設置成功
                            nRe = getsockopt(ClientSock, SOL_SOCKET, SO_SNDBUF, (char*)&nBuf, &nBufLen);
                            
            if(SOCKET_BUFF != nBuf)
                                AfxMessageBox(
            "檢查緩沖區:setsockopt error!");
                            
            else
                                AfxMessageBox(
            "已連接客戶端!");
                        }
                    }
                    
            //判斷是否可讀或可寫
                    for(u_int n = 0;n < ClientSockFd.fd_count;n++)
                    {
                            
            if(FD_ISSET(ClientSockFd.fd_array[n], &ReadSockFd))        //發現可讀
                            {        
                                    
            //接收數據
                                    
            //如果失敗 刪除此元素        
                            }
                            
            if(FD_ISSET(ClientSockFd.fd_array[n], &WriteSockFd))    //發現可寫  
                            {
                                    
            //發送緩沖區未滿可以發送
                                    
            //如果失敗 刪除此元素
                            }
                    }
                }

            posted on 2011-05-18 18:16 厚積薄發 閱讀(434) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

            導航

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            久久最新免费视频| 99久久国产综合精品五月天喷水| 精品久久久久中文字幕一区| 亚洲成色999久久网站| 久久精品国产72国产精福利| 伊人久久大香线蕉综合网站| 久久这里只有精品18| 中文字幕成人精品久久不卡| 久久天天躁夜夜躁狠狠躁2022| 无码人妻精品一区二区三区久久 | 66精品综合久久久久久久| 久久久久久国产精品无码下载| 久久精品无码一区二区WWW| 日本道色综合久久影院| 久久人人爽人人爽人人爽| 久久九九有精品国产23百花影院| 久久人人爽人人人人爽AV| 丁香狠狠色婷婷久久综合| 精品国产日韩久久亚洲| 成人午夜精品久久久久久久小说| 亚洲伊人久久精品影院| 久久人搡人人玩人妻精品首页 | 9久久9久久精品| 中文字幕乱码人妻无码久久| 久久久久久无码国产精品中文字幕| 久久精品国产清高在天天线| 伊人色综合久久天天人手人婷| 久久人妻少妇嫩草AV蜜桃| 人人狠狠综合久久亚洲婷婷| av国内精品久久久久影院| 欧美噜噜久久久XXX| 亚洲精品国精品久久99热一| 欧美日韩久久中文字幕| 久久精品中文字幕一区| 国产亚洲精久久久久久无码AV| 99久久婷婷免费国产综合精品| 久久亚洲私人国产精品| 粉嫩小泬无遮挡久久久久久| 久久狠狠高潮亚洲精品| 91久久精品91久久性色| 欧美熟妇另类久久久久久不卡|