- 1、本文档共34页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
网络编程实用教程第二版_第8章
8.4.3 重叠I/O模型的关键函数和数据结构 1.创建套接字 SOCKET s = WSASocket(AF_INET, SOCK_STEAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); 2.WSAOVERLAPPED结构 typedef? struct ?_WSAOVERLAPPED?{? DWORD?Internal;? DWORD?InternalHigh;? DWORD?Offset; DWORD?OffsetHigh; WSAEVENT?hEvent; //?此参数用来关联WSAEvent对象? }?WSAOVERLAPPED,?*LPWSAOVERLAPPED;? 3.输入输出系列函数 int?WSARecv(? SOCKET?s,? //?用来接收数据的套接字? LPWSABUF ?lpBuffers, //?指向WSABUF结构数组的指针,接收缓冲区 DWORD ?dwBufferCount, //?数组中成员的数量? LPDWORD? lpNumberOfBytesRecvd,? //?如果接收操作立即完成,此参数返回所接收到数据的字节数。? LPDWORD ?lpFlags,? //?标志位,设置为0?即可? LPWSAOVERLAPPED? lpOverlapped, //指向WSAOVERLAPPED结构指针,用来?绑定重叠结构? LPWSAOVERLAPPED_COMPLETION_ROUTINE ? lpCompletionRoutine? //?指向完成例程的指针,若选择事件通知的方式,应设置为?NULL? );? 4.WSAWaitForMultipleEvents函数 DWORD?WSAWaitForMultipleEvents(? DWORD?cEvents, //?等候事件的总数量? const?WSAEVENT*?lphEvents, //事件数组的指针? BOOL?fWaitAll,?? //?如果设置为?TRUE,则事件数组中所有事件被传信时,函数才会返回?, //?如果设置为FALSE,则任何一个事件被传信时,函数就返回?,一般设置为FALSE。 DWORD?dwTimeout,? //?超时时间,如果超时,函数会返回?WSA_WAIT_TIMEOUT?。 //?如果设置为0,函数会立即返回?。 //?如果设置为?WSA_INFINITE只有在某一个事件被传信后才会返回?。 BOOL?fAlertable?//?在完成例程方式中使用,选择事件通知应设置为FALSE? );? 5.WSAGetOverlappedResult函数 BOOL?WSAGetOverlappedResult(? SOCKET? s,? LPWSAOVERLAPPED ?lpOverlapped,?? LPDWORD lpcbTransfer,?? BOOL ?fWait,? LPDWORD ?lpdwFlags? );? 8.4.4 使用事件通知实现重叠模型的步骤 1.定义变量 2.创建监听套接字,并在指定的端口上监听连接请求 3.接受一个客户端的连接请求 4.建立并初始化重叠结构 5.以WSAOVERLAPPED结构为参数,在套接字上投递WSARecv请求 6.调用WSAWaitForMultipleEvents函数,等待重叠操作返回的结果 7.使用WSAResetEvent函数重设当前这个用完的事件对象 8.使用WSAGetOverlappedResult函数取得重叠调用的返回状态 9.使用接收到的数据 10.回到第5步,在套接字上继续投递WSARecv请求,重复步骤6~9 8.5完成端口模型 完成端口I/O模型(I/O completion port,IOCP)是最复杂的一种I/O模型。当应用程序需要管理为数众多的套接字时,完成端口模型提供了最佳的系统性能。这个模型也提供了最好的伸缩性,它非常适合用来处理成百上千个套接字。 8.5.1 什么是完成端口(completion port)模型 完成端口I/O模型是应用程序使用线程池处理异步I/O请求的一种机制。首先创建一个Win32完成端口对象,再创建一定数量的工作线程,应用程序发出一些异步I/O请求,当这些请求完成时,系统将把这些工作项目排序到完成端口,这样,在完成端口上等待的线程池便可以处理这些完成的I/O,为已经完成的重叠I/O请求提供服务。 8.5.2 使用完成端口模型的方法 1.创建完成端口对象 2.I/O服务线程和完成端口 3.完
文档评论(0)