io复用select理解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | USHORT nPort = 4567; //此服务器监听端口号 //创建监听套接字 SOCKET sListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); sockaddr_in sin ; sin .sin_family = AF_INET; sin .sin_port = htons(nPort); sin .sin_addr.S_un.S_addr = INADDR_ANY; //绑定套接字到本地机器 if (bind(sListen,(sockaddr*)& sin , sizeof ( sin ))==SOCKET_ERROR) { printf ( "Failed bind()\n" ); return -1; } //进入监听模式 listen(sListen,5); //select模型处理过程 //1)初始化一个套接字集合fdSocket,添加监听套接字句柄到这个集合 fd_set fdSocket; //所有可用的套接字集合 FD_ZERO(&fdSocket); FD_SET(sListen,&fdSocket); while (TRUE) { //2)将fdSocket集合的一个拷贝fdRead传递给select函数 //当有事件发生时,select函数将移除fdRead集合中没有未决I/O操作的套接字句柄,然后返回。 fd_set fdRead = fdSocket; int nRet = select(0,&fdRead,NULL,NULL,NULL); if (nRet>0) { //3)通过将原来的fdSocket集合与select处理过的fdRead集合比较 //确定都有哪些套接字有未决I/O,并进一步处理 for ( int i=0; i<( int )fdSocket.fd_count; i++) { if (FD_ISSET(fdSocket.fd_array[i],&fdRead)) { if (fdSocket.fd_array[i]==sListen) //(1)监听套接字接收到新连接 { if (fdSocket.fd_count<FD_SETSIZE) { sockaddr_in addrRemote; int nAddrLen = sizeof (addrRemote); SOCKET sNew = accept(sListen,(sockaddr*)&addrRemote,&nAddrLen); FD_SET(sNew,&fdSocket); printf ( "接收到连接(%s)\n" ,inet_ntoa(addrRemote.sin_addr)); } else { printf ( "Too much connections!\n" ); continue ; } } else { char szText[256]; int nRecv = recv(fdSocket.fd_array[i],szText, strlen (szText),0); if (nRecv>0) //(2) 可读 { szText[nRecv] = '\0' ; printf ( "接收到数据:%s\n" ,szText); char str[] = "One World,One Dream!\r\n" ; send(fdSocket.fd_array[i],str, strlen (str),0); } else //(3) 连接关闭、重启或者中断 { closesocket(fdSocket.fd_array[i]); FD_CLR(fdSocket.fd_array[i],&fdSocket); } } } } } else { printf ( "Failed select()\n" ); break ; } } return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2020-01-08 字体名称
2020-01-08 pdfium单元测试
2020-01-08 Linux下虚拟打印机CUPS
2020-01-08 子类父类指针多态接口转换
2020-01-08 IFX_SystemFontInfo抽象数据只能定义指针
2020-01-08 ibus-libpinyin
2020-01-08 调用指针,判断