Winsock中提供了一些I/O模型帮助应用程序以异步方式在一个或多个套接字上管理I/O。

  这样的I/O模型有六种:阻塞(blocking)模型,选择(select)模型,WSAAsyncSelect模型,WSAEventSelect模型,重叠(overlapped)模型,完成端口(completion port)模型。

  选择模型:

  目的:允许想要避免在套接字调用上阻塞的应用程序有能力管理多个套接字。

  一、select函数
             select函数可以确定一个或者多个套接字的状态。如果套接字上没有网络事件发生,便进入等待状态,以便执行同步I/O。

1   int select(int nfds,         //仅是为了与套接字兼容,忽略 2 fd_set* readfds, //指向一个套接字集合,检查其可读性 3 fd_set* writefds, //检查一个套接字集合,检查其可写性 4 fd_set* exceptfds //指向一个套接字集合,检查错误 5 const struct timeval* timeout //指定函数最长等待时间,如果为NULL,则等待时间为无限长 6 ); 

  函数调用成功,返回发生网络事件的所有的套接字数量的总和。如果超过了时间限制,返回0,失败则返回SOCKET_ERROR。

  1、套接字集合
        fd_set结构可以把多个套接字连接在一起,形成一个套接字集合。select函数可以测试这个集合中哪些套接字有事件发生。

    WINSOCK2.h中的定义如下:

1 typedef struct fd_set{
2     u_int fd_count;      //下面数组的大小 3 SOCKET fd_array[FD_SETSIZE]; //套接字句柄数组 4 }

    WINSOCK中定义的4个操作fd_set套接字集合的宏:

1     FD_ZERO(*set);     //初始化set为空集合。集合使用前应该总是清空。
2     FD_CLR(s,*set); //从set移除套接字s 3 FD_ISSET(s,*set) //检查s是不是set的成员,如果是返回TRUE. 4 FD_SET(s,*set) //添加套接字到集合

   2、设置超时
       最后的参数timeout是timeval结构的指针,它指定了select函数等待的最长的时间。如果设为NULL,select将会无限阻塞,直到有网络事件发生。

    timeval结构定义如下:

1  typedef struct timeval
2 {
3 long tv_sec; //指示等待多少秒 4 long tv_usec; //指示等待多少毫秒 5 }timeval;

  服务器端代码:

 1  2
 3 CInitSock theSock;  //初始化Winsock库
 4 int main()  5 {  6 USHORT nport = 4567; //此服务器监听的端口号  7 SOCKET sListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  8  sockaddr_in sin;  9 sin.sin_family = AF_INET; 10 sin.sin_port = htons(nPort); 11 sin.sin_addr.S_un.S_addr = INADDR_ANY; //绑定监听套接字到本地 12 if(bind(sListen,(sockaddr*)&sin,sizeof(sin)==SOCKET_ERROR) //绑定套接字失败 13  { 14 printf("Failed bind()n\"); 15 return -1; 16  } 17 listen(sListen,5); //进入监听模式 18 fd_set fdSocket; //创建套接字集合 19 FD_ZERO(&fdSocket); //初始化套接字结合 20 FD_SET(&sListen,&fdSocket); //将监听套接字添加进套接字集合中 21 while(TRUE) 22  { 23 fd_set fdRead = fdSocket; //将fdSocket集合拷贝到fdRead 24 int nRet = select(0,&fdRead,NULL,NULL,NULL); //当有事件发生发生时,select函数将移除fdRead集合中没有未决I/O操作的套接字句柄,然后返回。 25 if(nRet>0) 26  { 27 //通过将原来的fdSocket集合与select处理过的fdRead集合比较,确定有哪些套接字有未决I/O,进一步处理这些I/O。 28 for(int i=0;i<(int)fdSocket.fd_count;i++) 29       { 30 if(FD_ISSET(fdSocket.fd_array[i],&fdRead)) 31       { 32 if(fdSocket.fd_count<FD_SETSIZE) 33       { 34  sockaddr_in addrRemote; 35 int nAddrLen = sizeof(addrRemote); 36 SOCKET sNew = accept(sListen,(SOCKADDR*)&addrRemote,&nAddrlen); 37 FD_SET(sNew,&fdSocket); 38 printf("接收到连接(%s)\n",inet_ntoa(addrRemote.sin_addr)); 39       } 40 else 41  { 42 printf("Too Much Connections!"); 43 continue; 44  } 45       } 46 else 47  { 48 char szText[256]; 49 int nRecv = recv(fdSocket.fd_array[i],szText,strlen(szText),0); //接收 50 if(nRecv>0) 51  { 52 szText[nRecv] = '\0'; 53 printf("接收到数据:%s\n",szText); 54  } 55 else 56  { 57  closesocket(fdRead.fd_array[i]); 58 FD_CLR(fdSocket.fd_array[i],&fdSocket); 59  } 60  } 61  } 62  } 63  } 64   else 65   { 66 printf("Failed select()\n"); 67 break; 68   } 69   } 70   return 0; 71 }

转载于:https://www.cnblogs.com/suvllian/p/5470156.html

Winsock—I/O模型之选择模型(一)相关推荐

  1. 非期望产出的sbm模型_线性模型 vs. Logistic模型——离散选择模型之二

    前言:为什么因变量是分类变量的时候,我们会选择Logistic模型.而非最常见的线性回归模型?或者,换个说法:线性回归模型的劣势是什么?Logistic模型的优势又是什么?--针对这些问题,本文为您详 ...

  2. [转载-FLUENT学习]流动仿真计算时湍流模型的选择

    转自新浪博客<闲谈CFD(6)--FLUENT中常用的湍流模型>.以下为转载内容 本文内容摘自<精通CFD工程仿真与案例实战>.实际上也是帮助文档的翻译,英文好的可直接参阅帮助 ...

  3. TCP/IP网络模型之异步选择模型

    异步选择模型是基于窗口实现 窗口的创建如下: 1.创建窗口结构体 typedef struct tagWNDCLASSEXW {UINT cbSize;UINT style;WNDPROC lpfnW ...

  4. TCP/IP 事件选择模型

    服务端: 1.打开网络库 int WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData); 2.校验版本号 2 != HIBYTE(wsaData ...

  5. 机器学习中的模型评价、模型选择及算法选择

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 正确使用模型评估.模型选择和算法选择技术无论是对机器学习学术研究还是工业场景应用都至关重要.本文将对这三个任务的相关技术 ...

  6. 第六课.模型评估与模型选择

    目录 导语 模型评估 回归任务的评估指标 分类任务的评估指标 过拟合现象 过拟合的原因 过拟合解决办法 模型选择与调整超参数 正则化 留出法 交叉验证 网格搜索 实验:线性回归预测股票走势 实验说明 ...

  7. Science Bulletin:绝对丰度的植物根际微生物群落“扩增-选择”模型

    Science Bulletin: 基于绝对丰度的植物根际微生物群落"扩增-选择"组装模型 2020年3月7日,Science Bulletin在线发表中科院分子植物科学卓越创新中 ...

  8. R语言构建logistic回归模型并评估模型:构建基于混淆矩阵计算分类评估指标的自定义函数、阳性样本比例(垃圾邮件比例)变化对应的分类器性能的变化、基于数据阳性样本比例选择合适的分类评估指标

    R语言构建logistic回归模型并评估模型:构建基于混淆矩阵计算分类评估指标的自定义函数.阳性样本比例(垃圾邮件比例)变化对应的分类器性能的变化.基于数据阳性样本比例选择合适的分类评估指标 目录

  9. 主成分分析(Principle Component Analysis)PCA的核心思想是什么?PCA算法的优缺点?增量PCA模型, 随机PCA, 模型、 核化PCA分别是什么?使用时如何选择?

    主成分分析(Principle Component Analysis)PCA的核心思想是什么?增量PCA模型, 随机PCA, 模型. 核化PCA分别是什么?使用时如何选择? 主成分分析(Princip ...

最新文章

  1. 2021年春季学期-信号与系统-第九次作业参考答案
  2. COM原理与应用之COM的实现
  3. 指南:如何运用谷歌Google Shopping和Product Listing Ads
  4. ggplot2中显示坐标轴_R可视化08|ggplot2图层标度图层(scale layer)图例篇
  5. 确保您的Silverlight 1.0运行时间组件是最新版本
  6. 案例 月工作列表 c# 1614099857
  7. 独立站卖家不可缺的推广引流?
  8. 在Windows上安装FFmpeg程序
  9. 手机聊天记录备份与恢复的方法汇总
  10. IOS8 keyboardWillShow 在UIKeyboardWillShowNotification 调用两次 问题解决
  11. 计算机里pow函数是什么,pow函数是什么?
  12. 一些花里胡哨——底盘旋转、闪烁星星
  13. 移动开发程序员的悲哀是什么?
  14. 九. MySQL InnoDB 底层结构
  15. js replace() 使用
  16. python识图找图_Python实现识别图片中的所有人脸并显示出来
  17. 支付宝小程序动态绑定样式
  18. 360 政企安全集团基于 Flink 的 PB 级数据即席查询实践
  19. ug计算机内存不足,你的UG内存不足你怎么办的呢?告诉你一个小技巧吧
  20. 买低配车,更保值?!坊间有一句戏言:买车都要买低配

热门文章

  1. 对C#下函数,委托,事件的一点理解!
  2. 信号系统的一些基本概念
  3. java.io几种读写文件的方式
  4. 修改特征码的相关知识
  5. oracle伪客户端的安装(oracle不安装客户端)
  6. Linux内核自旋锁使用笔记
  7. bzoj3545 Peaks
  8. 详解keepalived配置和使用
  9. 高仿书旗小说 Flutter版,支持iOS、Android
  10. 2016极客大奖颁奖盛典落幕 50个大奖勾勒中国创新图谱