一般我们的网络编程都是用bind ,listen,accept,send/sendto,recv/recvfrom。在创建套接字的时候,是默认使用阻塞模式的,每当我们调用send/sendto等方法时,套接字都会进入阻塞状态,等到条件满足后才返回。当然为每个连接创建线程是个解决这个问题的好办法。如:比较容易想到的一种服务器模型就是采用一个主线程,负责监听客户端的连接请求,当接收到某个客户端的连接请求后,创建一个专门用于和该客户端通信的套接字和一个辅助线程。以后该客户端和服务器的交互都在这个辅助线程内完成。这种方法比较直观,程序非常简单而且可移植性好,但是不能利用平台相关的特性。例如,如果连接数增多的时候(成千上万的连接),那么线程数成倍增长,操作系统忙于频繁的线程间切换,而且大部分线程在其生命周期内都是处于非活动状态的,这大大浪费了系统的资源。

我们也可以通过ioctlsocket方法使用非阻塞模式套接字,但是这对程序员的代码量是个考验。

Select(选择)模型是Winsock中最常见的I/O模型。也是解决这二者问题的方案,和前两者比较有很大的进步。并且不会改变套接字的工作模式。

int select (int nfds,                           fd_set FAR * readfds,               fd_set FAR * writefds,              fd_set FAR * exceptfds,             const struct timeval FAR * timeout
);

该函数返回处于就绪态并且已经被包含在fd_set结构中的套接字总数。如果超时则返回0。

第一个参数nfds被忽略。

第二个参数readfds,可读性套接字集合指针。

第三个参数writefds,可写性套接字集合指针。

第四个参数exceptfds,检查错误套接字集合指针。

第五个参数timeout,等待时间。

readfds,writefds,exceptfds三个参数至少有一个不为NULL。

typedef struct fd_set {u_int fd_count;                 /* how many are SET? */SOCKET  fd_array[FD_SETSIZE];   /* an array of SOCKETs */
} fd_set;

fd_set是一个SOCKET队列,以下宏可以对该队列进行操作:

FD_CLR( s, *set) 从队列set删除句柄s;

FD_ISSET( s, *set) 检查句柄s是否存在与队列set中;

FD_SET( s, *set )把句柄s添加到队列set中;

FD_ZERO( *set ) 把set队列初始化成空队列.

Select模型工作流程:当把我们要监控的那些套接字根据各自的操作放入到readfds,writefds,exceptfds中,当select方法返回后,我们通过判断是否套接字还在那个readfds中,如果在,说明有数据可以读,调用recv方法读数据。其他集合一样。以监听套接字为例:Select()--------->FD_ISSET(listenSocket,&readSet)------->acceptSocket=accept(listenSocket,(sockaddr*)&addr,&len);  此时在调用accept就不会阻塞了。

转载于:https://www.cnblogs.com/pangblog/p/3310449.html

windows socket----select模型相关推荐

  1. Windows下select模型(以及EAGAIN、EWOULDBLOCK、EINTR)

    在这里记录一下,以前都是新项目用到了就从旧项目中拷贝. 自从将博客当作记事本,发现自己多了一个好习惯. Windows下select模型_程序员攻略-CSDN博客 套接字IO超时设置和使用select ...

  2. socket select模型

    由于socket recv()方法是堵塞式的,当多个客户端连接服务器时,其中一个socket的recv调用时,会产生堵塞,使其他连接不能继续. 如果想改变这种一直等下去的焦急状态,可以多线程来实现(不 ...

  3. 转:socket select模型示例

    // selectSocketMode.cpp : Defines the entry point for the console application. // #include "std ...

  4. 【转载】socket select模型

    由于socket recv()方法是堵塞式的,当多个客户端连接服务器时,其中一个socket的recv调用时,会产生堵塞,使其他连接不能继续. 如果想改变这种一直等下去的焦急状态,可以多线程来实现(不 ...

  5. u3d局域网游戏网络(c# socket select 模型)

    之前写了一篇. 发完之后第二天实际应用到游戏之后还是发现了一些小毛病. 比如网络模块有重复使用(多对象)的情况.所以将静态类该成了普通类. 比如安卓下会有些异常出现导致游戏逻辑不正常.所以网络相关的函 ...

  6. Windows Socket select函数使用

    最近做一个通信服务程序,读取数据时在工作线程中使用Socket 的select方式进行.测试时一直很稳定,并发性能也很好,但是到现场使用时,发现连接的设备,一部分数据通信和读取是正常的,一部分不正常. ...

  7. winsock select模型实现

    select模型的原理是在指定的socket 的数组中轮询的采集是否可写.可读.有异常的信息,然后将可以操做的套接字 保存在指定的数组中. // selectsocket.cpp : 定义控制台应用程 ...

  8. java socket编程 select_windows socket编程select模型使用

    int select( int nfds,            //忽略 fd_ser* readfds,    //指向一个套接字集合,用来检测其可读性 fd_set* writefds,   / ...

  9. Windows Socket五种I/O模型——代码全攻略

    如果你想在Windows平台上构建服务器应用,那么I/O模型是你必须考虑的.Windows操作系统提供了选择(Select).异步选择(WSAAsyncSelect).事件选择(WSAEventSel ...

  10. socket编程的select模型

    在掌握了socket相关的一些函数后,套接字编程还是比较简单的,日常工作中碰到很多的问题就是客户端/服务器模型中,如何让服务端在同一时间高效的处理多个客户端的连接,我们的处理办法可能会是在服务端不停的 ...

最新文章

  1. 《非暴力沟通》- 笔记
  2. legend3---lavarel多对多模型操作实例
  3. C#全局键盘监听(Hook)
  4. 0X8009310B (ASN:276) win7安装证书时出现错误消息:找不到与此证书文件相关联的证书申请微软官方文档
  5. JQuery进阶学习
  6. catia钣金根据线段折弯_钣金折弯加工注意事项有哪些?钣金折弯要点介绍
  7. recyclerview 设置分割线的高度
  8. iOS开发UI篇—Quartz2D简单使用(二)
  9. python查看网络连接_python – 检查网络连接
  10. 第二个Arduino小车 两轮自平衡
  11. C语言终极贪吃蛇代码,直接COPY上手。
  12. 矩阵如何运算?——线性代数
  13. c语言列宽作用,c语言|格式化输入输出详解
  14. 分频器的Verilog实现
  15. 《时间的秩序》-- 卡洛.罗韦利
  16. GIS+=地理信息+行业+大数据——纽约公开11亿条出租车和Uber原始数据下载及分析
  17. C语言知识-零零散散(四)
  18. 计算机毕业设计Android的手机音乐播放器app(源码+系统+mysql数据库+Lw文档)
  19. netsh端口映射与端口转发
  20. Python基础之:Python的数据结构

热门文章

  1. Reactive Streams规范及常见库
  2. Android开发:操作UI线程4种方法
  3. Java包装类、拆箱和装箱详解
  4. 【译】Private AI — Federated Learning with PySyft and PyTorch
  5. 【译】KNOWLEDGE EXTRACTION FROM UNSTRUCTURED TEXTS
  6. 一行命令搞定node.js 版本安装、升级与卸载
  7. protobuf java_ProtoBuf for java使用笔记 | 学步园
  8. seo 伪原创_SEO干货——文章到底如何伪原创?
  9. python按章节分割txt_python爬虫,爬取小说
  10. CVPR 2019 GCT:《Graph Convolutional Tracking》论文笔记