本文实例讲述了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 指令。它表达了如果诚实将设置所选属性。 在这种情况下: 演示版