• <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 厚積薄發 閱讀(441) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

            導航

            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            伊色综合久久之综合久久| 久久精品国产一区二区| 久久精品国产亚洲av麻豆图片| 久久这里有精品| 国产成人精品白浆久久69 | 激情久久久久久久久久| 久久强奷乱码老熟女网站| 久久久久国产精品人妻| 久久青青草原国产精品免费| 伊人久久大香线蕉成人| 久久国产精品无码HDAV| 久久久人妻精品无码一区| 久久99精品久久久久久久久久 | 亚洲国产成人久久精品99| 久久精品中文字幕无码绿巨人| 蜜桃麻豆www久久| 亚洲天堂久久久| 久久久久这里只有精品| 99久久99久久精品免费看蜜桃| 伊人久久国产免费观看视频| 欧美亚洲国产精品久久蜜芽| 亚洲人成伊人成综合网久久久 | 香港aa三级久久三级老师2021国产三级精品三级在 | 国内精品久久久久影院免费| 久久国产精品免费| 国产A三级久久精品| 国内精品久久久久| 大香伊人久久精品一区二区 | 久久久久99精品成人片直播| 精品熟女少妇aⅴ免费久久| 国产美女亚洲精品久久久综合 | 久久婷婷五月综合成人D啪| 久久夜色精品国产欧美乱| 人妻精品久久无码专区精东影业| 狠狠88综合久久久久综合网| 久久精品二区| 2021最新久久久视精品爱| 91亚洲国产成人久久精品网址| 久久久久久亚洲精品影院| 国产高潮国产高潮久久久91| 嫩草伊人久久精品少妇AV|