- 1、本文档共71页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]网络编程实用教程_第6章
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 3. 单句柄数据和单I/O操作数据 一个工作者线程从GetQueuedCompletionStatus调用接收到I/O完成通知后,在参数 lpCompletionKey和lpOverlapped中,会包含一些必要的套接字信息。 利用这些信息,可通过完成端口继续在一个套接字上的I/O处理。 通过这些参数,可获得两方面重要的套接字数据:单句柄数据、单I/O操作数据。 lpCompletionKey,包含 “单句柄数据”,在一个套接字首次与完成端口关联到一起时,这些数据便与一个特定的套接字句柄对应起来了,它们是在进行CreateIoCompletionPort API调用时由CompletionKey参数传递的。 * lpOverlapped参数,包含一个OVERLAPPED结构,其后跟随“单I/O操作数据”。 工作者线程处理一个完成数据包时(将数据原封不动打转回去,接受连接,投递另一个线程, 等等), “单I/O操作数据”信息是它必须要知道的。 单I/O 操作数据可以是追加到一个OVERLAPPED结构末尾的、任意数量的字节。 需要将一个OVERLAPPED结构传递给一个函数时,一个简单的方法是先定义一个结构,然后将OVERLAPPED结构作为新结构的第一个元素使用。 * 可定义如下数据结构实现对单I/O操作数据的管理: typedef struct {OVERLAPPED Overlapped; WSABUF DataBuf; CHAR Buffer[DATA_BUFSIZE]; BOOL OperationType; }PER_IO_OPERATION_DATA 该结构演示了通常要与I/O操作关联在一起的某些重要数据元素。在这个结构中,用于已完成I/O操作的数据缓冲区是非常有用的。 * 要想调用一个Winsock API函数,同时为其分配一个OVERLAPPED结构,既可将自己的结构“造型”为一个OVERLAPPED指针,亦可简单地撤消对结构中的OVERLAPPED元素的引用。 PER_IO_OPERATION_DATA PerIoData; //可以象下边这样调用一个函数 WSARecv(socket,…,(OVERLAPPED *)PerIoData; //或者象下边这样 WSARecv(socket,…,( PerIoData.Overlapped)); * 在工作线程的后部分,等GetQueuedCompletionStatus函数返回了一个重叠结构(和完成键)后,便可通过撤消对OperationType成员的引用,调查到底是哪个操作投递到了这个句柄之上(只需将返回的重叠结构造型为自己的PER_IO_OPERATION_DATA结构)。 对单I/O操作数据来说,它最大的一个优点便是允许在同一个句柄上,同时管理多个I/O操作(读/写,多个读,多个写,等等)。 * 大家此时或许会产生这样的疑问:在同一个套接字上,真的有必要同时投递多个I/O操作吗?答案在于系统的“伸缩性”,或者说“扩展能力”。 例如,假定我们的机器安装了多个中央处理器,每个处理器都在运行一个工作者线程,那么在同一个时候,完全可能有几个不同的处理器在同一个套接字上,进行数据的收发操作。 为了完成前述的简单回应服务器示例,需要提供一个ServerWorkerThread(服务器工作者线程)函数。 如何设计一个工作者线程例程,令其使用单句柄数据以及单I/O操作数据,为I/O请求提供服务。 * 如何正确地关闭I/O完成端口,特别是同时运行了一个或多个线程,在几个不同的套接字上执行I/O操作的时候? 要避免的一个重要问题是:在进行重叠I/O操作的同时,强行释放一个OVERLAPPED结构。 最好的办法是针对每个套接字句柄调用closesocket函数,任何尚未进行的重叠I/O操作都会完成。 一旦所有套接字句柄都已关闭,便需在完成端口上终止所有工作者线程的运行。 需要使用PostQueuedCompletionStatus函数,向每个工作者线程都发送一个特殊的完成数据包,该函数会指示每个线程都“立即结束并退出”。 * 下面是PostQueuedCompletionStatus函数的定义: BOOL PostQueuedCompletionStatus( HANDLE CompletlonPort, DW0RD dwNumberOfBytesTrlansferred, DWORD dwCompletlonKey,
您可能关注的文档
最近下载
- 项目管理知识体系指南.pptx VIP
- 2025年春季学期开学思政第一课:以科技创新铸就民族复兴之魂7篇.pdf
- 青海电网新型储能电站调度运行管理办法-10.10.docx VIP
- (部编版一年级语文下册生字练字帖).pdf
- 计算机控制系统课后习题答案1.pdf VIP
- GB_T 31497-2024 信息技术 安全技术 信息安全管理 监视、测量、分析和评价.pdf
- 《企业现金流量管理国内外文献综述》4000字.docx
- 《公共管理》教学大纲(本科).pdf VIP
- GB55015-2021 建筑节能与可再生能源利用通用规范.docx
- 《电机学》(华中科技大学)中国大学MOOC(慕课)章节测验试题(答案).pdf
文档评论(0)