windows socket----select模型
来源:互联网 发布:李维嘉暴瘦 知乎 编辑:程序博客网 时间:2024/06/06 02:58
一般我们的网络编程都是用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就不会阻塞了。
- windows socket----select模型
- windows socket----select模型
- Windows socket select模型
- windows socket之select模型
- Windows socket之Select模型开发
- Windows socket之Select模型开发
- Windows Socket编程的select模型
- Windows socket之Select模型开发
- Windows socket之Select模型开发
- Windows socket之Select模型开发
- WINDOWS SOCKET编程SELECT模型使用
- windows Socket编程之select网络模型
- Windows socket之Select模型开发
- Windows Socket I/O模型之 Select模式
- windows下实现socket 的 通讯的 select 模型
- Windows socket I/O模型 之 select(1)
- Windows socket I/O模型 之 select(2)
- Windows socket I/O模型 之 select(1)
- TQ2440裸板---流水灯(详细注释)
- Spring3.0中的异常处理配置方法
- 《Win32多线程程序设计》读书笔记(二)(同步机制)
- VB ACCESS数据库的修改、删除、添加
- 如何在网页中动态改变样式
- windows socket----select模型
- 计算机学科专业基础综合
- 【2037 今年暑假不AC】
- hdu 4710 Balls Rearrangement 数论
- java web总结
- 类似于百度搜索
- 使用 ActiveMQ 示例
- 考研政治篇
- MYSQL数据库数据导入mongoDB