1. 事件通知
重叠I / O的事件通知方法要求将Wi n 3 2事件对象与W S A O V E R L A P P E D结构关联在一起。若使
用一个W S A O V E R L A P P E D结构,发出像W S A S e n d和W S A R e c v这样的I / O调用,它们会立即返回。
通常,大家会发现这些I / O 调用会以失败告终,返回S O C K E T _ E R R O R 。使用
W S A G e t L a s t E r r o r函数,便可获得与错误状态有关的一个报告。这个错误状态意味着I / O操作
正在进行。稍后的某个时间,我们的应用程序需要等候与W S A O V E R L A P P E D结构对应的事
件对象,了解一个重叠I / O请示何时完成。W S A O V E R L A P P E D结构在一个重叠I / O请求的初始
化,及其后续的完成之间,提供了一种沟通或通信机制。下面是这个结构的定义:
其中,I n t e r n a l、I n t e r n a l H i g h、O ff s e t和O ff s e t H i g h字段均由系统在内部使用,不应由应用
程序直接进行处理或使用。而另一方面, h E v e n t字段有点儿特殊,它允许应用程序将一个事
件对象句柄同一个套接字关联起来。大家可能会觉得奇怪,如何将一个事件对象句柄分配给
该字段呢?正如我们早先在W S A E v e n t S e l e c t模型中讲述的那样,可用W S A C r e a t e E v e n t函数来
创建一个事件对象句柄。一旦创建好一个事件句柄,简单地将重叠结构的h E v e n t字段分配给
事件句柄,再使用重叠结构,调用一个Wi n s o c k函数即可,比如W S A S e n d或W S A R e c v。
一个重叠I / O请求最终完成后,我们的应用程序要负责取回重叠I / O操作的结果。一个重叠
请求操作最终完成之后,在事件通知方法中, Wi n s o c k会更改与一个W S A O V E R L A P P E D结构
对应的一个事件对象的事件传信状态,将其从“未传信”变成“已传信”。由于一个事件对象
已分配给W S A O V E R L A P P E D结构,所以只需简单地调用W S AWa i t F o r M u l t i p l e E v e n t s函数,从
而判断出一个重叠I / O调用在什么时候完成。该函数已在我们前面讲述WSAEventSelect I/O模
型时介绍过了。W S AWa i t F o r M u l t i p l e E v e n t s函数会等候一段规定的时间,等待一个或多个事
件对象进入“已传信”状态。在此再次提醒大家注意: W S AWa i t F o r M u l t i p l e E v e n t s函数一次
最多只能等待6 4个事件对象。发现一次重叠请求完成之后,接着需要调用W S A G e t O v e r l a p p e d
R e s u l t(取得重叠结构)函数,判断那个重叠调用到底是成功,还是失败。该函数的定义如