﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-绿野仙踪-文章分类-WinSoket 编程</title><link>http://www.cppblog.com/wandy/category/1137.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 May 2008 14:15:29 GMT</lastBuildDate><pubDate>Wed, 28 May 2008 14:15:29 GMT</pubDate><ttl>60</ttl><item><title>Overlapped 模型与 CompletionPort模型</title><link>http://www.cppblog.com/wandy/articles/4231.html</link><dc:creator>飞烟</dc:creator><author>飞烟</author><pubDate>Thu, 16 Mar 2006 03:36:00 GMT</pubDate><guid>http://www.cppblog.com/wandy/articles/4231.html</guid><wfw:comment>http://www.cppblog.com/wandy/comments/4231.html</wfw:comment><comments>http://www.cppblog.com/wandy/articles/4231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wandy/comments/commentRss/4231.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wandy/services/trackbacks/4231.html</trackback:ping><description><![CDATA[
		<p>
				<u>
						<font color="#0000ff">
								<a class="" title="重叠端口应用示例" href="/Files/wandy/IOcmp.rar" target="">示例下载</a>
						</font>
				</u>
				<br />      Win32重叠I/O(OverLapped I/O)的机制允许发起一个操作，然后在操作完成之后接受到信息。对于那种需要很长时间才能完成的操作来说重叠操作，有着很重要的意义。我们可以在发起一个操作后，在监听线程中等待操作完成，而主线程可以做其他的事情。<br />      在Win2000上，提供的可扩展的I/O模型就是使用完成端口。完成端口对在Windows的内部做了优化，提供了更高的效率。<br />      可以把完成端口看成一个系统维护的队列，操作系统将完成的重叠操作通知消息放到完成端口队列，由于暴露“操作完成”，所以命名为“完成端口”。<br />         应用完成端口的步骤：<br />                  1.创建完成端口句柄：<br />                        HANDLE hIocp;<br />                        hIocp=CreateCompletiom(<br />                                                      INVALID_HANDLE_VALUE,<br />                                                      NULL,<br />                                                      (ULONG_PRT)0,<br />                                                       0);<br />                        if(   hIocp == NULL){<br />                                          //创建失败。<br />                        }<br />                  2.关联SOCKET 描述符与完成端口句柄<br />                        SOCKET s;<br />                        s=socket(AF_INET,SOCKE_STREAM,0);<br />                        if (s == INVALID_SOCKET){<br />                              ///SOCKET 创建失败处理      <br />                           }<br />                        if( CreateCompletionPort((HANDLE)s, hIocp,(ULONG_PRT)0,0) == NULL){<br />                              //关联失败<br />                           }<br />                  3.创建监听线程.， 监听线程可以创建多个，根据具体需要而定。<br />                           CreateThread(CoPortThread,......);<br />                  4.监听线程函数：<br />                        DWORD CoPortThread(LPVOID lpParam){<br />                                    while(true){<br />                                             bResult = GetQueuedCompletionStatus(ghCompletionPort, &amp;dwNumRead, (DWORD*)&amp;pCntx, &amp;lpOverlapped, INFINITE);</p>
		<p>                                            if (bResult == FALSE &amp;&amp; lpOverlapped == NULL)<br />                                               {                     <br />                                                                  FatalError("WorkerThread - GetQueuedCompletionStatus()错误.\n");<br />                                                        }<br />                                            else if (bResult == FALSE &amp;&amp; lpOverlapped != NULL)<br />                                                     {<br />                                                                                 fprintf(stderr,"用户非正常退出.\n"); <br />                                                        }<br />                                               else if (dwNumRead == 0)<br />                                                        {    <br />                                                                                          fprintf(stderr, "用户已经退出.\n");<br />                                                                                          fprintf(stderr, "------------------.\n");<br />                                                              }<br />                                                 else<br />                                                              {<br />                                                                        printf("recv data from client: %s\n", pCntx-&gt;InBuffer);<br />                                                                  <br />                                                                 }<br />                                     }<br />                              }</p>
<img src ="http://www.cppblog.com/wandy/aggbug/4231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wandy/" target="_blank">飞烟</a> 2006-03-16 11:36 <a href="http://www.cppblog.com/wandy/articles/4231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>