Select模式开发[阻塞]

本文介绍了套接字Select模型在Windows Sockets编程中的应用,重点讨论了阻塞模式下套接字的I/O操作。通过select()函数,开发者可以判断多个套接字的可读写状态,避免阻塞和错误处理的复杂性。然而,select模型可能导致效率降低,因为它涉及到每次I/O操作前的两次函数调用。文中还提到了远程文件下载程序的服务器端和客户端关键代码。
摘要由CSDN通过智能技术生成
套接字Select模型是比较常用的一种I/O模型。利用该模型使得WindowsSockets应用程序可以在同一时间内管理和控制多个套接字。该模型的核心是select()函数。在使用该函数是,还需要用到FD_SET,FD_ZERO,FD_ISSET和FD_CLR四个宏。开发WindowsSocket程序时,应用程序需要这样的能力:当执行操作的套接字满足可读可写条件时,需要给应用程序发送通知,接收到这个通知后,应用程序再调用相应的WindowsSocketsAPI去执行函数调用。套接字的Select模型,就是能够使得应用程序具有这样能力的一种方式。套接字的Select模型,能够使WindowsSockets应用程序同时对多个套接字进行管理。调用select()检查当前各个套接字的当前状态。并且根据该函数的返回值,判断套接字的可读可写性。然后调用相应的WindwosSocketsAPI,完成数据的发送,接收。以一个远程文件下载程序为实例。

套接字Select模型 

阻塞模式的套接字执行I/O操作时,如果执行操作的条件没有得到满足,线程就会被阻塞在该调用的函数上。程序不得不处于等待状态。该调用函数什么时候返回,不得而知。

非阻塞模式套接字执行I/O操作时,在某种情况下,调用函数都会立即返回。软件开发人员必须编写更多的代码,对该函数返回的错误进行处理,这无疑增加了开发WindowsSockets应用程序的难度。另外,应用程序中往往需要在一个循环体内反复调用该函数,直到返回成功指示为止,这不是一种很好的做法。 

select模型

Select模式是windowsSocket中最常见的I/O模型。所以称其为Select模型,是因为它的核心是利用select()函数实现I/O管理。利用select()函数,WindowsSockets应用程序可以判断套接字上是否存在数据,或者能否向该套接字写入数据。

如上图:在调用recv()接收数据之前,先调用select()。如果此时系统没有可读的数据,那么select()会阻塞在这里。当系统存在可读的数据时,该函数返回。此时应用程序就可以调用recv()接收数据了。 应该可以看到Select模式为开发WindowsSockets应用程序,提供了调用某个函数前的通知机制。

select()函数

/*
1.select()函数 
int select(IN int nfds,_inout_opt fd_set FAR * readfds,_inout_opt fd_set FAR * writefds,_inout_opt fd_set FAR * exceptfds,IN const struct timeval FAR * timeout);//通过该函数,WindowsSockets应用程序可以判断套接字是否存在数据,或者能否向其写入数据。
参数:
int nfsd:被忽略,之所以仍然要提供这个参数,是为了保持与早期的Berkeley套接字应用程序兼容。
fd_set FAR* readfds:具有可读性套接字集合的指针
fd_set FAR* writefds:具有可写性套接字集合的指针
fd_set FAR* exceptfds:检查错误套接字集合的指针
timeval FAR* timeout:用于设置调用select()函数时的等待时间
返回值:失败返回SOCKET_ERROR,否则,返回。
调用select()时,readfds,writefds和sexceptfds 3个参数中至少有一个不能设置为NULL。并且,在该非空的参数中,必须至少包含一个套接字。否则select()将没有任何套接字可以等待。
select()返回后,会修改每个fd_set结构,删除那些不存在的没有完成I/O操作的套接字。

2.struct fd_set
#define FD_SETSIZE      64
typedef struct fd_set //是一个管理多个套接字的结构体
{
u_int fd_count;               //套接字数量
SOCKET  fd_array[FD_SETSIZE];   //套接字数组
} fd_set; //
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值