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++显式类型转换示例详解,需要的朋友可以参考下
    2014-04-04
  • 简单总结C语言中各种类型的指针的概念

    简单总结C语言中各种类型的指针的概念

    这篇文章主要简单总结了C语言中各种类型的指针的概念,指针可以说是C语言本身所具有的最大特性,平时根据不同使用场合习惯地将其简单分类,需要的朋友可以参考下
    2016-03-03
  • 详解C/C++ QT QChart 绘制组件应用

    详解C/C++ QT QChart 绘制组件应用

    Qtcharts 组件基于GraphicsView模式实现,其核心是QChartView和QChart的二次封装版。本文重点给大家介绍C/C++ QT QChart 绘制组件应用的相关知识,感兴趣的朋友一起看看吧
    2021-11-11
  • C\C++实现读写二进制文件的方法详解

    C\C++实现读写二进制文件的方法详解

    这篇文章主要为大家详细介绍了C\C++实现读写二进制文件的方法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2023-03-03
  • Qt5连接并操作PostgreSQL数据库的实现示例

    Qt5连接并操作PostgreSQL数据库的实现示例

    本文主要介绍了Qt5连接并操作PostgreSQL数据库的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • C++ sort排序函数用法详解

    C++ sort排序函数用法详解

    本文主要介绍了C++ sort排序函数用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C语言文件操作的入门详解教程

    C语言文件操作的入门详解教程

    这篇文章主要给大家介绍了关于C语言文件操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 最新clion2020激活码附安装教程(亲测有效)

    最新clion2020激活码附安装教程(亲测有效)

    这篇文章主要介绍了最新clion2020激活码附安装教程(亲测有效),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 深入了解C语言中的字符串和内存函数

    深入了解C语言中的字符串和内存函数

    本文主要带大家来学习一些常用的库函数。有了这些库函数,我们可以更加方便地操作字符串和内存,从而提升我们的编码效率。话不多说,我们开始吧
    2022-11-11
  • Qt编写地图之实现经纬度坐标纠偏

    Qt编写地图之实现经纬度坐标纠偏

    地图应用中都涉及到一个问题就是坐标纠偏的问题,这个问题的是因为根据地方规则保密性要求不允许地图厂商使用标准的GPS坐标,而是要用国家定义的偏移标准。本文将详细讲解如何在Qt中实现经纬度坐标纠偏,需要的可以参考一下
    2022-03-03

最新评论