Windows IO模型-Select模型(同步阻塞模型)

来源:互联网 发布:交行信用卡 知乎 编辑:程序博客网 时间:2024/06/05 11:29

参考博客:http://zxxapple.iteye.com/blog/1554692    套接字Select

阻塞和非阻塞的区别在于:进程访问数据时,数据未就绪,进行是否需要等待阻塞:进程等到有结果再返回,函数返回。非阻塞:请求完立即返回,不论是否接收到数据。

异步和同步的区别在于:主动查看还是被动通知的区别,访问数据的机制不同。同步:主动请求,并等待I\O操作完毕,当数据读写时阻塞。异步:主动投递请求后可以,可处理其它事情,被调用者通过状态、事件、回调函数来通知被调用者。读取数据不阻塞。

Select 模型(同步阻塞模型)

Select按顺序查看数组中socket的状态,将发生网络事件的socket留在数组中,可以解决一个服务器对多个客户端的问题。

同步阻塞的优点:能够保证数据及时到达,配合多进程。

同步阻塞的缺点:1.处理客户端数量有限(64) 2.占用太多cpu时间,仍属于阻塞;FD_SETSIZE 64

适用范围:适合小型网络通信。

typedef  UINT_PTR   SOCKET

typedef  unsigned int   UINT_PTR

Select同步阻塞  头文件<Winsock2.h>

int select(

  _In_     int nfds,            //Ignored

  _Inout_  fd_set *readfds,        //读缓冲区---有数据要接收

  _Inout_  fd_set *writefds,       //写缓冲区

  _Inout_  fd_set *exceptfds,      //处理错误的集合

 _In_const struct timeval *timeout //阻塞时间,希望查看数组查看多久

);

typedef struct timeval {

  long tv_sec;    //秒,

  long tv_usec;   //毫秒

} timeval;

 

新建集合:fd_set  fdsets;

清空集合:FD_ZERO(&fdsets);

socket,加入到集合中FD_SET(sock,&fdsets);

查看socket是否在集合内:FD_ISSET(sock,&fdsets);

从集合中删除一个文件描述符:FD_CLR(sock,&fdsets)

使用示例:

//主线程中;

SOCKET s=accet(socketListen,....);   //默认创建的socket为阻塞模式;

//记录accept到的socket。

.....

//工作线程中

fd_set set;

TIMEVAL tv;

tv.tv_sec = 0;

Tv.tv_usec = 100;

while(1)

{

FD_ZERO(&set);     //将你的套节字集合清空

FD_SET(s, &set);    //将套接字加入到集合,这里是一个读数据的套节字s

select(0,&set,NULL,NULL,&tv); //检查套节字是否可读,集合中只保留满足条件的套接字

 //阻塞时间,数组查看多久//这里select是否出错没有写

if(FD_ISSET(s, &set) )//检查s是否在这个集合里面,

{

  recv(s,...);                 //把数据拷到进程时,阻塞.

}

//do something here

}



阅读全文
0 0
原创粉丝点击