socket的overlapped(重叠) I\O和其他socket I\O模型的区别

在刚开始接触socket I\O模型的时候,一眼看去,好像WSAEventSelect模型和overlapped I\O的模型是差不多的。看网上的示例代码,都是先把一个事件对象和socket绑定,然后等待事件对象的激活再进行相应的操作。但是经过仔细研究之后发现两者的差别是非常之大的。

区别:

1.发起I\O请求的流程:

WSAEventSelect模型:是在绑定的socket上有注册过的感兴趣的网络事件被触发时,事件对象才被激活(如FD_READ,FD_CLOSE等)。在此之前,程序是没有向操作系统提交任何读写(I\O)请求的。只有在等待事件对象被激活后,根据激活事件对象的网络事件(是FD_READ,还是FD_CLOSE等),才来向操作系统提出I\O请求,而此时socket里的数据都已经准备好了(对于读数据来说),所以在提出I\O请求后会马上完成I\O请求而成功返回。

overlapped I\O的模型:把每一个I\O请求绑定一个事件对象。先发出请求后各个I\O请求会被放在操作系统的I\O请求队列里。如果某一个I\O请求完成,则该请求绑定的事件对象被激活。在wait到激活事件对象后,说明数据已经读取或写完成了(如果是读的话,数据已经被拷贝到用户的缓冲区里了,可以用了)。

2.事件对象和socket的绑定关系:

WSAEventSelect模型:一般情况下是一个事件对象对应一个socket,这个对应关系是1对1的。也就是说监测这个事件对象就是在监测这个socket。

overlapped I\O的模型:一个I\O请求绑定一个事件对象,I\O请求和事件对象是1对1的,但是在同一段时间,有可能会在同一个socket上发请多个I\O请求。这样的话,socket和事件对象是1对n(即1对多)。也就是说监测一个事件对象,是在监测一个socket的某一次I\O请求。


3.应用场合:

WSAEventSelect模型:适合在有多个socket通信的环境下,这样可以对每个socket进行管理,在对应的时候对某一个socket做对应的操作。

overlapped I\O的模型:适合只有一个socket通信,但是在很短的时间内,发起了多个I\O请求。这样可以管理各个I\O请求,并在各个I\O请求完成后做相应的操作。当然这个模型也可以用于多个socket通信的情况下,只不过就是在wait到事件对象后,在调用GetOverlappedResult(HANDLE hFile,LPOVERLAPPED lpOverlapped,
LPDWORD lpNumberOfBytesTransferred, BOOL bWait)函数时,要把hFile和lpOverlapped里的event对应上。只有在多个socket上同时发起多个I\O请求的情况下才会这样用。我在项目中还没碰到过这种情况。


4.重叠I\O模型,和其他模型比到底重叠在哪里:

WSAEventSelect模型:在每个socket上,某个socket触发FD_READ或FD_CLOSE等等网络事件后,才针对该socket进行I\O请求,发起请求后请求马上执行,要么成功,要么失败(失败后可以再次发起请求)。这些请求都是马上执行的,如果有这个socket上的I\O请求正在执行,马上返回失败,而不会放在请求队列里排队等待(因为创建这个socket时,没有指定overlapped属性)。所以针对一个socket的I\O请求重叠不起来。

overlapped I\O的模型:在针对同一个socket,可以在同一时间发起多个I\O请求。这些I\O请求发起后如果不能马上执行(在这个socket上已经有I\O请求在执行了),那么这些针对这一个socket的I\O请求就被放在请求队列里等待完成了,等待加执行这些工作都是操作系统帮你完成的,等某一个I\O请求完成,该请求所对应的事件对象就被激活了。

可以说重叠I\O,是针对一个socket来说的,向该socket同时发起的所有I\O请求,都能被操作系统接收并完成。而这些I\O请求对于这个socket来说就是重叠的I\O请求。


只有对这些I\O模型理解了,才能知道他们的适用场合,要不然就会向刚开始接触一样,感觉貌似他们的差别不大。等弄清楚后才发现,他们有本质上的区别。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值