C++中I/O模型之select模型实例

 更新时间:2014年10月20日 14:33:55   投稿:shichen2014  
这篇文章主要介绍了C++中I/O模型的select模型,实例讲述了I/O模型的用法,具有一定的参考借鉴价值,需要的朋友可以参考下

本文实例讲述了C++中I/O模型的select模型用法。分享给大家供大家参考。具体实现方法如下:

复制代码 代码如下:
void main() 

    CInitSock initSock; 
    USHORT nPort = 9999; //监听的端口 
    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.初始化套接字集合,添加监听socket到这个集合 
    fd_set  fdSocket; 
    FD_ZERO(&fdSocket); 
    FD_SET(sListen, &fdSocket); 
    while (TRUE) 
    { 
        //2. 将集合的一个拷贝传递给select函数 
        //当有事件发生时,select移除未决的socket,然后返回   就是说select返回时 集合的中socket就是发生事件的socket 
        fd_set fdRead = fdSocket; 
        int nRet = ::select(0, &fdRead, NULL, NULL, NULL); 
        if (nRet > 0) 
        { 
            //通过比较原来的fdSocket集合与经过处理的fdRead集合 
            for (UINT i=0;i<fdSocket.fd_count;i++) 
            { 
                if (FD_ISSET(fdSocket.fd_array[i], &fdRead)) //就是这个触发了 
                { 
                    if (fdSocket.fd_array[i] == sListen) //监听套接字接收到新连接  为神马分两种情况:因为触发Read集合的情况有两种:有连接来了或数据可读了.... 
                    { 
                        // 
                        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 //没读到数据 
                        { 
                            ::closesocket(fdSocket.fd_array[i]); 
                            FD_CLR(fdSocket.fd_array[i], &fdSocket); 
                        } 
                    } 
                } 
            } 
        } 
        else 
        { 
            printf("nRet litter 0, error..."); 
            return; 
        } 
    } 
    ::closesocket(sListen); //与socket配对写 
    printf("*******************************"); 
    getchar(); 
}

效果如下图所示:

希望本文所述对大家的C++程序设计有所帮助。

相关文章

  • C++ 中私有继承的作用

    C++ 中私有继承的作用

    这篇文章主要介绍了C++ 中私有继承的作用的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • C语言 数据结构与算法之字符串详解

    C语言 数据结构与算法之字符串详解

    这篇文章将带大家深入了解C语言数据结构与算法中的字符串,文中主要是介绍了字符串的定义、字符串的比较以及一些串的抽象数据类型,感兴趣的可以学习一下
    2022-01-01
  • C++获取本地时间常见方法汇总

    C++获取本地时间常见方法汇总

    这篇文章主要介绍了C++获取本地时间的常见方法,帮助大家更好的理解和学习C++,感兴趣的朋友可以了解下
    2020-08-08
  • 解析C语言中结构体struct的对齐问题

    解析C语言中结构体struct的对齐问题

    这篇文章主要介绍了C语言中结构体struct的对齐问题,作者深入到内存分配方面来进行解析,需要的朋友可以参考下
    2016-04-04
  • C++获取文件大小的4种常见技巧分享

    C++获取文件大小的4种常见技巧分享

    这篇文章主要介绍了C++获取文件大小的4种常见技巧分享,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • c++实现加载so动态库中的资源

    c++实现加载so动态库中的资源

    下面小编就为大家带来一篇c++实现加载so动态库中的资源。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • 怎么通过C语言自动生成MAC地址

    怎么通过C语言自动生成MAC地址

    以下是对使用C语言自动生成MAC地址的实现代码进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-09-09
  • C++基础入门教程(四):枚举和指针

    C++基础入门教程(四):枚举和指针

    这篇文章主要介绍了C++基础入门教程(四):枚举和指针,本文重点讲解了指针,有幽默搞笑的语言描述了指针,需要的朋友可以参考下
    2014-11-11
  • C++的函数与指针

    C++的函数与指针

    今天小编就为大家分享一篇关于C++函数与指针的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-10-10
  • c++函数指针和回调函数示例

    c++函数指针和回调函数示例

    这篇文章主要介绍了c++函数指针和回调函数示例,需要的朋友可以参考下
    2014-05-05

最新评论