当前位置: 首页 > 编程笔记 >

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

燕烨
2023-03-14
本文向大家介绍C++中I/O模型之select模型实例,包括了C++中I/O模型之select模型实例的使用技巧和注意事项,需要的朋友参考一下

本文实例讲述了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++程序设计有所帮助。

 类似资料:
  • 绝大部分的嵌入式系统都包括一些 I/O(Input/Output,输入 / 输出)设备,例如仪器上的数据显示屏、工业设备上的串口通信、数据采集设备上用于保存数据的 Flash 或 SD 卡,以及网络设备的以太网接口等,都是嵌入式系统中容易找到的 I/O 设备例子。 本章主要介绍 RT-Thread 如何对不同的 I/O 设备进行管理,读完本章,我们会了解 RT-Thread 的 I/O 设备模型,

  • 主要函数 函数 描述 [[epoll_create epoll_create]] 创建一个epoll的文件描述符 [[epoll_ctl epoll_ctl]] epoll的事件注册函数 [[epoll_wait epoll_wait]] 收集在epoll监控的事件中已经发送的事件 结构体 epoll_event typedef union epoll_data { void *ptr;

  • 本文向大家介绍C++之WSAAsyncSelect模型实例,包括了C++之WSAAsyncSelect模型实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++中WSAAsyncSelect模型的用法。分享给大家供大家参考。具体实现方法如下: TCPServer.cpp源文件如下: TCPServer.h头文件如下: TCPClient.cpp源文件如下: TCPClient.h头文件

  • 本文向大家介绍探索Java I/O 模型的演进,包括了探索Java I/O 模型的演进的使用技巧和注意事项,需要的朋友参考一下 相关概念 同步和异步 描述的是用户线程与内核的交互方式: 同步是指用户线程发起 I/O 请求后需要等待或者轮询内核 I/O 操作完成后才能继续执行; 异步是指用户线程发起 I/O 请求后仍继续执行,当内核 I/O 操作完成后会通知用户线程,或者调用用户线程注册的回调函数。

  • 什么是同步?什么是异步?阻塞和非阻塞又有什么区别?本文先从 Unix 的 I/O 模型讲起,介绍了5种常见的 I/O 模型。而后再引出 Java 的 I/O 模型的演进过程,并用实例说明如何选择合适的 Java I/O 模型来提高系统的并发量和可用性。 由于,Java 的 I/O 依赖于操作系统的实现,所以先了解 Unix 的 I/O 模型有助于理解 Java 的 I/O。 相关概念 同步和异步

  • 问题内容: JS小提琴 问题: 我的页面中有一个SELECT元素,其中填充了。它还具有一个具有默认值的。 当我更改值时,可以适应。但是下拉列表在启动时显示了一个空插槽,应该在其中选择了具有默认值的项目。 码 使用JS: 问题答案: 您可以在选项元素上使用ng- selected 指令。它表达了如果诚实将设置所选属性。 在这种情况下: 演示版