浅谈Windows网络模型之重叠IO模型.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈Windows网络模型之重叠IO模型.doc

在Winsock中,重叠 I/O(Overlapped I/O)模型能达到更佳的系统性能,高于之前的选择模型,异步选择模型和事件选择模型。重叠模型的基本设计原理便是让应用程序使用一个重叠的数据结构(WSAOVERLAPPED),一次投递一个或多个 Winsock I/O 请求。针对这些提交的请求,在它们完成之后,我们的应用程序会收到通知,于是我们就可以对数据进行处理了。 使用重叠I/O模型必须使用 WSA_FLAG_OVERLAPPED 这个标志,创建一个套接字。例如: 1 SOCKET s = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); 如果使用socket这个函数的话,会默认自动使用WSA_FLAG_OVERLAPPED。 创建好套接字后,将其与本地接口绑定到一起之后便可以开始重叠I/O操作了。不过需要注意的时,在重叠I/O的状态下不能使用send、recv等函数,他们被WSASend、WSARecv函数替换掉了。基本上都是以WSA开头的Winsock函数,主要有一下几种: WSASend WSASendTo WSARecv WSARecvFrom WSAloctl AcceptEx TrnasmitFile 使用时还要指定一个WSAOVERLAPPED结构(可选)。 通常情况下,调用这些函数会返回WSA_IO_PENDING,这就说明函数调用成功了,但是I/O函数还没完成。 当调用这些函数的时候,如果指定了WSAOVERLAPPED参数,函数完成后会立即返回,无论套接字是否为阻塞模式,可以通过等待时间对象通知或者通过完成例程来得知I/O请求是否成功。通常情况下第一种时间通知的方法比较常用。 这里只需要注意一点,重叠函数(如:WSARecv)的参数中都有一个 Overlapped 参数,我们可以假设是把我们的WSARecv这样的操作“绑定”到这个重叠结构上,提交一个请求,而不是将操作立即完成,其他的事情就交给重叠结构去做,而其中重叠结构又要与Windows的事件对象“绑定”在一起,这样我们调用完 WSARecv 以后就可以“坐享其成”,等到重叠操作完成以后,自然会有与之对应的事件来通知我们操作完成,然后我们就可以来根据重叠操作的结果取得我们想要的数据了。 重叠I/O的事件通知方法要求将Win32事件对象和WSAOVERLAPPED结构关联在一起。I/O操作完成后,事件的状态就会变为已传信。 下面是WSAOVERLAPPED结构体的定义: 1 2 3 4 5 6 7 8 9 10 11 typedef struct _WSAOVERLAPPED { ??ULONG_PTR Internal; ??ULONG_PTR InternalHigh; ??union { ?????struct { ???????DWORD Offset; ???????DWORD OffsetHigh; ?????};??? PVOID Pointer; ??}; ??HANDLE hEvent; } WSAOVERLAPPED,? *LPWSAOVERLAPPED; Internal, InternalHigh, Offset, OffsetHigh为系统内部使用,通常情况下不作修改。 hEvent则需要传递一个事件句柄。可用 WSACreateEvent 函数来创建一个事件对象句柄。一旦创建好一个事件句柄,简单地将重叠结构的 hEvent 字段分配给事件句柄,再使用重叠结构,调用一个Winsock函数即可,比如 WSASend 或 WSARecv。 一个重叠 I/O 请求最终完成后,我们的应用程序要负责取回重叠 I/O 操作的结果。一个重叠请求操作最终完成之后,在事件通知方法中,Winsock会更改与一个 WSAOVERLAPPED 结构对应的一个事件对象的事件传信状态,将其从“未传信”变成“已传信”。由于一个事件对象已分配给 WSAOVERLAPPED 结构,所以只需简单地调用 WSAWaitForMultipleEvents 函数, 从而判断出一个重叠 I/O 调用在什么时候完成。 发现一次重叠请求完成之后,需要调用WSAGetOverlappedResult函数来判断那个重叠调用到底是成功还是失败了。该函数定义如下: 1 2 3 4 5 6 7 BOOL WSAAPI WSAGetOverlappedResult( ??__in????????? SOCKET s, ??__in????????? LPWSAOVERLAPPED lpOverlapped, ??__out???????? LPDWORD lpcbTransfer, ??__in??

文档评论(0)

aiwendang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档