国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C++中I/O模型之select模型實(shí)例

2020-01-26 15:13:23
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例講述了C++中I/O模型的select模型用法。分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:

復(fù)制代碼 代碼如下:
void main() 

    CInitSock initSock; 
    USHORT nPort = 9999; //監(jiān)聽的端口 
    SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (sListen == INVALID_SOCKET) 
    { 
        printf("socket error..."); 
        return; 
    } 
    sockaddr_in servAddr = {0}; 
    servAddr.sin_family = AF_INET; 
    servAddr.sin_port = ::htons(nPort); 
    servAddr.sin_addr.S_un.S_addr = INADDR_ANY;  
    if (SOCKET_ERROR == ::bind(sListen, (sockaddr*)&servAddr, sizeof(servAddr))) 
    { 
        int nError = ::GetLastError(); 
        printf("connect error.."); 
        return; 
    } 
    ::listen(sListen, 5); 
 
     
    //select模型處理過程 
    //1.初始化套接字集合,添加監(jiān)聽socket到這個(gè)集合 
    fd_set  fdSocket; 
    FD_ZERO(&fdSocket); 
    FD_SET(sListen, &fdSocket); 
    while (TRUE) 
    { 
        //2. 將集合的一個(gè)拷貝傳遞給select函數(shù) 
        //當(dāng)有事件發(fā)生時(shí),select移除未決的socket,然后返回   就是說(shuō)select返回時(shí) 集合的中socket就是發(fā)生事件的socket 
        fd_set fdRead = fdSocket; 
        int nRet = ::select(0, &fdRead, NULL, NULL, NULL); 
        if (nRet > 0) 
        { 
            //通過比較原來(lái)的fdSocket集合與經(jīng)過處理的fdRead集合 
            for (UINT i=0;i<fdSocket.fd_count;i++) 
            { 
                if (FD_ISSET(fdSocket.fd_array[i], &fdRead)) //就是這個(gè)觸發(fā)了 
                { 
                    if (fdSocket.fd_array[i] == sListen) //監(jiān)聽套接字接收到新連接  為神馬分兩種情況:因?yàn)橛|發(fā)Read集合的情況有兩種:有連接來(lái)了或數(shù)據(jù)可讀了.... 
                    { 
                        // 
                        if (fdSocket.fd_count < FD_SETSIZE) //FD_SETSIZE=64 
                        { 
                            sockaddr_in addrRemote = {0}; 
                            int nAddrLen = sizeof(addrRemote); 
                            SOCKET sNew = ::accept(sListen, (sockaddr*)&addrRemote, &nAddrLen); 
                            FD_SET(sNew, &fdSocket); 
                        } 
                        else     
                        { 
                            printf("too many connection...error"); 
                            continue; 
                        } 
                    } 
                    else  //有可讀的 
                    { 
                        char szContent[256]={0}; 
                        int nRecv = ::recv(fdSocket.fd_array[i], szContent, sizeof(szContent), 0); 
                        if (nRecv > 0) 
                        { 
                            szContent[nRecv] = '/0'; 
                            printf("recv data:%s", szContent); 
                        } 
                        else //沒讀到數(shù)據(jù) 
                        { 
                            ::closesocket(fdSocket.fd_array[i]); 
                            FD_CLR(fdSocket.fd_array[i], &fdSocket); 
                        } 
                    } 
                } 
            } 
        } 
        else 
        { 
            printf("nRet litter 0, error..."); 
            return; 
        } 
    } 
    ::closesocket(sListen); //與socket配對(duì)寫 
    printf("*******************************"); 
    getchar(); 
}

效果如下圖所示:

希望本文所述對(duì)大家的C++程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 清丰县| 嵊州市| 江北区| 滁州市| 佛冈县| 繁峙县| 东阿县| 宁德市| 太湖县| 新源县| 昌都县| 永平县| 九龙县| 灵璧县| 祁东县| 如东县| 比如县| 南宫市| 镇安县| 石楼县| 乐至县| 富民县| 瑞丽市| 龙南县| 安新县| 西乌| 湾仔区| 石棉县| 额尔古纳市| 台东县| 兴安盟| 界首市| 聊城市| 宝兴县| 富民县| 蒲城县| 五常市| 肃南| 井陉县| 孝感市| 克东县|