﻿<?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++博客-漫步者-文章分类-Network</title><link>http://www.cppblog.com/Walker/category/10300.html</link><description>先学会转文章，在仔细读文章，最后自己写点东西........</description><language>zh-cn</language><lastBuildDate>Sat, 23 Apr 2011 01:17:48 GMT</lastBuildDate><pubDate>Sat, 23 Apr 2011 01:17:48 GMT</pubDate><ttl>60</ttl><item><title>协议设计</title><link>http://www.cppblog.com/Walker/articles/131884.html</link><dc:creator>漫步者×&amp;……%￥</dc:creator><author>漫步者×&amp;……%￥</author><pubDate>Sun, 31 Oct 2010 02:25:00 GMT</pubDate><guid>http://www.cppblog.com/Walker/articles/131884.html</guid><description><![CDATA[关于协议设计的一点想法：<br><br>1. 协议的设计分成两个主要部分：链路的管理以及数据的收发。<br><br>2. 链路管理就是链路的配置，建立，断开。<br><br>3.重要的一点，两个设备之间的链路建立是顺序的，一条链路没有建好是不能建立下一条链路的。<br><br>4.一个设备在接收其他设备的链接时，可以同时处理，不会因为一条链路阻塞而阻塞另外一条。<br><br>5. 每条链路都有一个状态机<br><br>6.两个设备之间链路建立好了之后，可以建立多个通道。<br><br>7.设备之间的通道的建立必须是顺序的，一个通道建立不成功是不允许建立下一条通道的。<br><br>8.这样当建立多个通道时，再建立新通道时，首先要判断先前的通道是否已经建立好，只有建立好了才能建立新的。<br><br>9. Tx和Rx的设计，协议栈采用统一的一块内存来管理分配和释放。<br><br>10.协议是有流程的，必须按照流程来走，如果发送的request没有response，那么会有超时处理的，可以重连或者断开连接。<br><br>11. 协议是异步的，不存在一个函数直接建立连接并成功，只会等待连接建立好的response，来表示连接建立成功。<br><br>12. 数据的TX也是异步的。 
<img src ="http://www.cppblog.com/Walker/aggbug/131884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Walker/" target="_blank">漫步者×&……%￥</a> 2010-10-31 10:25 <a href="http://www.cppblog.com/Walker/articles/131884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>同步/异步与阻塞/非阻塞的区别 （转）</title><link>http://www.cppblog.com/Walker/articles/82900.html</link><dc:creator>漫步者×&amp;……%￥</dc:creator><author>漫步者×&amp;……%￥</author><pubDate>Thu, 14 May 2009 00:44:00 GMT</pubDate><guid>http://www.cppblog.com/Walker/articles/82900.html</guid><wfw:comment>http://www.cppblog.com/Walker/comments/82900.html</wfw:comment><comments>http://www.cppblog.com/Walker/articles/82900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Walker/comments/commentRss/82900.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Walker/services/trackbacks/82900.html</trackback:ping><description><![CDATA[<div class=postTitle><a id=viewpost1_TitleUrl class=postTitle2 href="http://www.cppblog.com/converse/archive/2009/05/13/82879.html"><font color=#1a8bc8>同步/异步与阻塞/非阻塞的区别</font></a> </div>
我喜欢用自己的语言通过联系现实生活中的一些现象解释一些概念,当我能做到这一点时,说明我已经理解了这个概念.今天要解释的概念是:同步/异步与阻塞/非阻塞的区别.<br><br>这两组概念常常让人迷惑,因为它们都是涉及到IO处理,同时又有着一些相类似的地方.<br><br>首先来解释同步和异步的概念,这两个概念与<span style="FONT-WEIGHT: bold">消息的通知机制</span>有关.<br><br>举个例子,比如我去银行办理业务,可能选择排队等候,也可能取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务了.<br>前者(排队等候)就是同步等待消息,而后者(等待别人通知)就是异步等待消息.在异步消息处理中,等待消息者(在这个例子中就是等待办理业务的人)往往注册一个回调机制,在所等待的事件被触发时由触发机制(在这里是柜台的人)通过某种机制(在这里是写在小纸条上的号码)找到等待该事件的人.<br>而在实际的程序中,同步消息处理就好比简单的read/write操作,它们需要等待这两个操作成功才能返回;而异步处理机制就是类似于select/poll之类的多路复用IO操作,当所关注的消息被触发时,由消息触发机制通知触发对消息的处理.<br><br>其次再来解释一下阻塞和非阻塞,这两个概念与<span style="FONT-WEIGHT: bold">程序等待消息(无所谓同步或者异步)时的状态</span>有关.<br>继续上面的那个例子,不论是排队还是使用号码等待通知,如果在这个等待的过程中,等待者除了等待消息之外不能做其它的事情,那么该机制就是阻塞的,表现在程序中,也就是该程序一直阻塞在该函数调用处不能继续往下执行.相反,有的人喜欢在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的,因为他(等待者)没有阻塞在这个消息通知上,而是一边做自己的事情一边等待.但是需要注意了,第一种同步非阻塞形式实际上是效率低下的,想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的;而后者,异步非阻塞形式却没有这样的问题,因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换.<br><br>很多人会把同步和阻塞混淆,我想是因为很多时候同步操作会以阻塞的形式表现出来,比如很多人会写阻塞的read/write操作,但是别忘了可以对fd设置O_NONBLOCK标志位,这样就可以将同步操作变成非阻塞的了;同样的,很多人也会把异步和非阻塞混淆,因为异步操作一般都不会在真正的IO操作处被阻塞,比如如果用select函数,当select返回可读时再去read一般都不会被阻塞,就好比当你的号码排到时一般都是在你之前已经没有人了,所以你再去柜台办理业务就不会被阻塞.<br><br>可见,同步/异步与阻塞/非阻塞是两组不同的概念,它们可以共存组合,也可以参见这里:<br>http://www.ibm.com/developerworks/cn/linux/l-async/<br>
<img src ="http://www.cppblog.com/Walker/aggbug/82900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Walker/" target="_blank">漫步者×&……%￥</a> 2009-05-14 08:44 <a href="http://www.cppblog.com/Walker/articles/82900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>信息安全之社会工程学[0]：基本常识扫盲</title><link>http://www.cppblog.com/Walker/articles/82263.html</link><dc:creator>漫步者×&amp;……%￥</dc:creator><author>漫步者×&amp;……%￥</author><pubDate>Fri, 08 May 2009 12:44:00 GMT</pubDate><guid>http://www.cppblog.com/Walker/articles/82263.html</guid><wfw:comment>http://www.cppblog.com/Walker/comments/82263.html</wfw:comment><comments>http://www.cppblog.com/Walker/articles/82263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Walker/comments/commentRss/82263.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Walker/services/trackbacks/82263.html</trackback:ping><description><![CDATA[<h3 class="post-title entry-title">&nbsp;<a href="http://program-think.blogspot.com/2009/05/social-engineering-0-overview.html"><font color=#800080>信息安全之社会工程学[0]：基本常识扫盲</font></a></h3>
<div class=post-header-line-1></div>
<div class="post-body entry-content">　　最近几年，信息安全方面的问题日益严重，许多同学深受其害（比如网络钓鱼、盗用银行卡、蠕虫木马泛滥、僵尸网络盛行等等）。俺窃以为，很大一部分原因在于相应的扫盲教育没有跟上。且不说普通的电脑菜鸟对信息安全一无所知，即便是很多IT公司的<strong>专业</strong>技术人员，对此也知之甚少。其后果就是：很多菜鸟级的攻击手法屡试不爽，很多平庸的攻击者屡屡得手。有鉴于此，俺打算抽空普及一下信息安全相关的东东，或许能对某些同学有所帮助。<!--program-think--><br>　　其实信息安全方面的话题非常之多，俺经过左思右想之后，决定先拿社会工程学来扫盲一下。至于为啥先说它，后面会解释原因。<br><br>　　★<strong>社会工程学是啥玩意儿？</strong><br>　　俺喜欢把信息安全分为&#8220;<strong>硬安全</strong>&#8221;和&#8220;<strong>软安全</strong>&#8221;两个部分。所谓&#8220;硬安全&#8221;主要包括具体的IT安全技术（比如防火墙、入侵检测、漏洞扫描、拒绝服务攻击、缓冲区溢出攻击、等等）；而&#8220;软安全&#8221;主要涉及管理、心理学、文化、人际交往等方面，与具体的IT技术无关。今天所说的社会工程学，实际上就是&#8220;软安全&#8221;的范畴。<br>　　通俗地说，社会工程就是：攻击者利用&#8220;<strong>人</strong>&#8221;自身的弱点（往往是心理学层面）来获取信息、影响他人，从而达到自己不可告人的目的。光这么说稍显简单，更详细的定义可以参见&#8220;<a href="http://en.wikipedia.org/wiki/Social_engineering_%28security%29" target=_blank rel=nofollow><font color=#0066ff>这里</font></a>&#8221;。不懂洋文的同学可以看&#8220;<a href="http://baike.baidu.com/view/118411.htm" target=_blank rel=nofollow><font color=#0066ff>这里</font></a>&#8221;。<br><br>　　★<strong>为啥要了解社会工程学？</strong><br>　　开头已经提到了安全基础知识的普及度不够。那为啥俺要先介绍社会工程学捏？主要有如下几点原因：<br>　　◇普及度不够<br>　　首先，社会工程是信息安全中一个经常被忽视的偏僻角落。即便很多IT安全领域的从业人员，往往也缺少社会工程学的相关<strong>常识</strong>。比如很多人都知道什么是防火墙、杀毒软件，但是却从来没有听说过<strong>社会工程学</strong>。<br>　　◇重视不够<br>　　大部分的安全厂商都把注意力集中在&#8220;硬安全&#8221;方面（比如现在防火墙厂商、杀毒厂商多如牛毛），很少有安全厂商把社会工程挂在嘴边的。以此<strong>相反</strong>的是：现有的信息安全攻击，大都以&#8220;软安全&#8221;作为攻击者的突破口，只有一小部分是纯粹通过&#8220;硬安全&#8221;来进行的。（这又是一个<a href="http://program-think.blogspot.com/2009/02/80-20-principle-0-overview.html" target=_blank><font color=#0066ff>二八原理</font></a>的生动例子）<br>　　为啥攻击者喜欢从&#8220;软安全&#8221;层面进行突破捏？因为人性的弱点是很难在短时间内得到改善的（尤其是人多大公司、大机构，更是如此）。所以，&#8220;软安全&#8221;方面会遗留很多可以利用的漏洞，攻击者只要善于利用这些漏洞，就可以轻易侵入。<br>　　◇用处大大滴<br>　　不过捏，光是鲜为人知、重视不足，还不至于让俺花这么多口水大力忽悠。还有另一个原因是：社会工程学的常识非常有用，而且它的用处不限于信息产业（几乎所有行业都用得着）。具体有些啥用处捏？<br>　　首先，了解起码的社会工程学常识能够让你对相关的攻击手法（攻击手法的介绍参见&#8220;<a href="http://program-think.blogspot.com/2009/05/social-engineering-1-gather-information.html"><font color=#0066ff>这里</font></a>&#8221;）有<strong>基本的</strong>防范，不至于轻易上当。要知道，有很多人被攻击者利用了之后，自己还浑然不觉。<br>　　其次，如果你是公司的老板或者某个管理层的头头，你可以在自己的职权范围内进行相关的扫盲培训（后面的帖子会介绍如何防范）。<br>　　最后，假如你看完本系列后，发现自己在社会工程方面很有天赋，那或许可以考虑朝这个方向发展。比如搞个商业间谍之类的工作干干，没准也很有前途哦。不过捏，一旦将来被抓被关、被杀被剐，本博主是概不负责滴 <strong>:-)</strong><br><br>　　★<strong>本系列帖子能给你啥帮助？</strong><br>　　如果你从来没有听说过社会工程学，仅仅想扫盲，那只需看本帖即可，后续的内容无需多看。<br>　　如果你希望对社会工程攻击能够有<strong>基本的</strong>防范，建议看看后续的&#8220;<a href="http://program-think.blogspot.com/2009/05/social-engineering-1-gather-information.html"><font color=#0066ff>攻击手法</font></a>&#8221;、&#8220;如何防范&#8221;。<br>　　如果你对社会工程学这门学问很有兴趣，建议看完本系列所有帖子。<br>　　如果你已经是社会工程学的老手，请不吝赐教，本系列帖子您老就不用看了。<br><br>　　★<strong>本系列帖子不能给你哪些帮助？</strong><br>　　本系列帖子<strong>不能</strong>帮你成为社会工程学的高手。要达到此目的，请先<strong>确保</strong>自己有这方面的天赋，接着再通过《<a href="http://en.wikipedia.org/wiki/The_Art_of_Deception" target=_blank rel=nofollow><font color=#800080>欺骗的艺术</font></a>》（<a href="http://en.wikipedia.org/wiki/Kevin_Mitnick" target=_blank rel=nofollow><font color=#800080>凯文&#183;米特尼克</font></a>所著）进行深造。<br>　　本系列帖子<strong>不能</strong>帮你化解<strong>所有的</strong>社会工程攻击。毕竟社会工程学的手法太多、涉及的面太广。有些新颖的手法，其设计之巧妙、用心之险恶，估计连俺都会轻易入套。<br><br>　　为了方便阅读，把本系列帖子的目录整理如下：<br>　　1、<a href="http://program-think.blogspot.com/2009/05/social-engineering-1-gather-information.html"><font color=#0066ff>攻击手法之信息收集</font></a><br>　　2、攻击手法之假冒身份<br>　　3、攻击手法之骗取信任<br>　　4、几个攻击的示例<br>　　5、你该如何防范？<br>　　6、书评：《欺骗的艺术》
<hr>
<span id=copyright_declare>追求原创，欢迎转载。<br>转载必须包含本声明、保持本文完整。并以超链形式注明作者<a href="http://program-think.blogspot.com/"><font color=#0066ff>编程随想</font></a>和本文原始地址：<br><a id=OriginalPostUrl href="http://program-think.blogspot.com/2009/05/social-engineering-0-overview.html"><font color=#800080>http://program-think.blogspot.com/2009/05/social-engineering-0-overview.html</font></a> </span></div>
<img src ="http://www.cppblog.com/Walker/aggbug/82263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Walker/" target="_blank">漫步者×&……%￥</a> 2009-05-08 20:44 <a href="http://www.cppblog.com/Walker/articles/82263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP连接connect等待时长控制的另一种方法</title><link>http://www.cppblog.com/Walker/articles/80472.html</link><dc:creator>漫步者×&amp;……%￥</dc:creator><author>漫步者×&amp;……%￥</author><pubDate>Sun, 19 Apr 2009 13:09:00 GMT</pubDate><guid>http://www.cppblog.com/Walker/articles/80472.html</guid><wfw:comment>http://www.cppblog.com/Walker/comments/80472.html</wfw:comment><comments>http://www.cppblog.com/Walker/articles/80472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Walker/comments/commentRss/80472.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Walker/services/trackbacks/80472.html</trackback:ping><description><![CDATA[在<span>TCP</span><span>网络应用开发中，作为客户端的程序经常需要主动连接服务器，这时你就需要建立一个</span><span>Socket</span><span>，然后调用</span><span>connect</span><span>函数连接到服务器地址。正常情况下，这并没有什么问题，但当服务器主机不存在的时候，</span><span>connect</span><span>函数可能会等待一分多钟才能返回。如果在主线程中调用</span><span>connect</span><span>函数，就会产生长时间无法响应的状况。</span>
<p><span>&nbsp;&nbsp; 在现代的互联网硬件TCP连接connect等待时长控制的另一种方法环境中，一分钟的等待有点太长了，我们需要缩短等待时间。</span></p>
<p><span>在</span><span>Linux</span><span>环境下，可以用</span><span>alarm</span><span>调用定时唤醒正在等待的线程，使</span><span>connect</span><span>函数从等待中返回，但在</span><span>Windows</span><span>下我没有找到类似的函数。如何让</span><span>connect</span><span>函数返回呢？</span></p>
<p><span>&nbsp;&nbsp; 经过实验，找到一个简单的方法：<strong>直接关闭</strong></span><strong><span>connect</span></strong><strong><span>函数使用的那个</span><span>socket</span></strong><strong><span>套接字，</span><span>connect</span></strong><strong><span>函数就会立即返回</span></strong><span>。这个方法感觉土了点，但确实管用。该方法的工作过程描述如下：</span></p>
<p><span><span>1）&nbsp;</span></span><span>创建</span><span>socket</span></p>
<p><span><span>2）&nbsp;</span></span><span>启动定时关闭该</span><span>socket</span><span>的线程</span></p>
<p><span><span>3）&nbsp;</span></span><span>调用</span><span>connect</span><span>函数连接服务器</span></p>
<p><span><span>4）&nbsp;</span></span><span>取消定时关闭线程的工作</span></p>
<p><span><span>5）&nbsp;</span></span><span>检查定时关闭线程的关闭操作是否已经执行</span></p>
<p><span><span>6）&nbsp;</span></span><span>检查</span><span>connect</span><span>返回值是否有效</span></p>
<p>&nbsp;</p>
<p><span>摘录一段示例代码如下：</span></p>
<p><span>SOCKET CTCPConnector::ConnectTo(</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int toIp,&nbsp;int toPort, </span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int localIp ,&nbsp;int localPort,</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int timeOut)</span></p>
<p><span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SOCKET Socket = socket(AF_INET, SOCK_STREAM, 0);</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>sockaddr_in InetAddr;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>InetAddr.sin_family<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>= AF_INET;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>InetAddr.sin_addr.s_addr = htonl(localIp);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>InetAddr.sin_port<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>= htons(localPort);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (localIp &gt; 0 &amp;&amp; localPort&gt;0)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (bind(Socket, (sockaddr *) &amp;InetAddr, sizeof(InetAddr)) &lt; 0)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return INVALID_SOCKET;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>InetAddr.sin_addr.s_addr= htonl(toIp);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>InetAddr.sin_port<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>= htons(toPort);</span></p>
<p>&nbsp;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span>CTimeOutClose Closer(Socket); //</span></strong></span><strong><span>这个是超时关闭线程</span></strong></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (timeOut &gt; 0)</span></strong></p>
<p><strong><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Closer.SetTimeOut(timeOut);// </span></strong><strong><span>设定超时时长</span></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int err = connect(Socket, (const sockaddr *)&amp;InetAddr, sizeof(InetAddr));</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (timeOut &gt;= 0)</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>Closer.Cancel();//</span></span><span>取消超时关闭</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (<span>Closer.HasDone()//</span></span><span>检查定时关闭线程的关闭操作是否已经执行</span></p>
<p><span>&amp;&amp; err &gt;= 0) // </span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>err = -1;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if ( err &lt; 0) //</span><span>检查</span><span>connect</span><span>返回值是否有效</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return INVALID_SOCKET;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return Socket;</span></p>
<p><span>}</span></p>
<p><span>&nbsp;&nbsp; 代码中</span><span>CTimeOutClose</span><span>类是启动关闭线程，等待一段时间后关闭指定的套接字。同时，该类还提供接口，用于取消操作和检查操作是否已经执行。</span></p>
<p><span>&nbsp;&nbsp; 虽然该方法需要启动一个新的线程，但对于大多数的应用来说，主动发起建立</span><span>TCP</span><span>连接的量都不会太多，所以对程序的性能并不会产生明显影响。</span></p>
<p><span>（以上代码可以在我上传的资源&#8220;<strong>回城卷轴网络通讯架构源代码</strong>&#8221;中找到，下载地址为：</span><span><a href="http://download.csdn.net/source/1023342">http://download.csdn.net/source/1023342</a></span><span>）</span></p>
<p><span>作者：苏林</span></p>
<img src ="http://www.cppblog.com/Walker/aggbug/80472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Walker/" target="_blank">漫步者×&……%￥</a> 2009-04-19 21:09 <a href="http://www.cppblog.com/Walker/articles/80472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>