﻿<?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++博客-旭++</title><link>http://www.cppblog.com/zhangxu/</link><description>张旭的C++学习笔记</description><language>zh-cn</language><lastBuildDate>Sun, 19 Apr 2026 12:38:10 GMT</lastBuildDate><pubDate>Sun, 19 Apr 2026 12:38:10 GMT</pubDate><ttl>60</ttl><item><title>Linux FTP server 学习小结（C）</title><link>http://www.cppblog.com/zhangxu/archive/2007/12/10/38204.html</link><dc:creator>张旭</dc:creator><author>张旭</author><pubDate>Mon, 10 Dec 2007 14:58:00 GMT</pubDate><guid>http://www.cppblog.com/zhangxu/archive/2007/12/10/38204.html</guid><wfw:comment>http://www.cppblog.com/zhangxu/comments/38204.html</wfw:comment><comments>http://www.cppblog.com/zhangxu/archive/2007/12/10/38204.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangxu/comments/commentRss/38204.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangxu/services/trackbacks/38204.html</trackback:ping><description><![CDATA[&nbsp;
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从上周三，我才真正了解到我要做的东西（</span><span>FTPserver</span><span>）是一个涉及知识极其广泛的复杂程序。而并非之前以为的，单纯的</span><span>C\S</span><span>模式文件传输程序。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先按照老师的提示，配了</span><span>ftp</span><span>服务器和</span><span>web</span><span>服务器，熟悉了一些</span><span>ftp</span><span>命令和配置方法。但是对</span><span>ftp</span><span>的通信方式和具体过程还是一无所知。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接下来找来</span><span>RFC-FTP</span><span>协议来看，同时参考了</span><span>telnet</span><span>协议和</span><span>http</span><span>协议。结果还是一头雾水，搞不清楚协议中规定的东西到底应该怎样去实现。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我打算转变思路，动手做试验。模拟了一个服务器端程序，这个程序只能</span><span>send</span><span>一条信息和</span><span>recv</span><span>一条信息并且打印，然后用</span><span>linux</span><span>自带的</span><span>ftp</span><span>客户端程序去连接模拟服务器。我想他们之间肯定是有通信来往的，这样做可以观察客户端到底传给服务器怎样形式的信息。经过反复测试。终于搞明白了客户端和服务器之间严格按照</span><span>RFC-959</span><span>协议的规定一问一答的通讯方式。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接下来，我就没有着急动手继续写程序，而是去网上搜索了不少关于</span><span>ftp</span><span>协议的文档和讨论。了解了双</span><span>socket-</span><span>（控制通道，数据通道）。了解了主动传输和被动传输的区别。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;看了这些材料以后，我已经大概对整个</span><span>ftp</span><span>整个传输过程有一个了解。接下来继续完善了模拟服务器，能够用</span><span>ftp</span><span>客户端软件登陆和退出（只做肯定回应）。这样控制通道的通信已经可以正常对话了。剩下的一大问题就是数据通道的通信方式了。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: yellow">做到这里，我遇到了两个棘手的问题。</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: yellow">Listen（）监听函数是如何作用的？</span>按我的理解，listen函数是这道题目中&#8220;控制最大同时访问数&#8221;的关键。我在编码过程中对这个地方做了试验：当我在while（1）中执行accept时，当接收到客户端connect请求时，fork（）建立子进程去处理，父进程继续循环等待accept（），之前listen函数backlog为2。但结果是我仍然可以使用三个以上的ftp客户端进程去同时访问服务器，并保持连接不断开或者阻塞。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: yellow">两台电脑相互通信，如何取得适合对方访问的自己IP地址？</span>在客户端要求使用被动传输模式的时候，服务器要建立临时的数据传输通道，并把建好的本机地址+新端口，以&#8220;msg&#8230;. (xxx,xxx,xxx,xxx,xxx,xxx) \r\n&#8221;的形式发送给客户端，客户端根据所给的地址和端口号和服务器的数据传输通道建立连接。在C/C++里，可以使用gethostname函数获取本机名称，根据获取的名称，使用gethostbyname函数可以获取本机的IP地址。但是这个IP地址永远是127.0.0.1（至少我的程序中是这样的）。但是这个地址传给对方，对方并不能按照这个地址找到服务器（除非客户端和服务器在同一台电脑上）。如果客户端和服务器在同一局域网中的不同电脑上，那服务器应该传给客户端类似192.168.x.x的地址。如果在internet范围内则需要传送互联网上的IP地址。而真正的ftp服务器和客户端之间的通信，是可以发送适合对方访问自己的IP地址给对方的。而目前所了解到的函数，gethostname和gethostbyname函数并不能完成这项要求。</p>
<span>在网上查了很多资料，关于以上两个问题，有不少存在和我类似情况的提问，不过回答不甚详细。</span>
<img src ="http://www.cppblog.com/zhangxu/aggbug/38204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangxu/" target="_blank">张旭</a> 2007-12-10 22:58 <a href="http://www.cppblog.com/zhangxu/archive/2007/12/10/38204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux fork函数学习</title><link>http://www.cppblog.com/zhangxu/archive/2007/12/02/37640.html</link><dc:creator>张旭</dc:creator><author>张旭</author><pubDate>Sun, 02 Dec 2007 07:20:00 GMT</pubDate><guid>http://www.cppblog.com/zhangxu/archive/2007/12/02/37640.html</guid><wfw:comment>http://www.cppblog.com/zhangxu/comments/37640.html</wfw:comment><comments>http://www.cppblog.com/zhangxu/archive/2007/12/02/37640.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangxu/comments/commentRss/37640.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangxu/services/trackbacks/37640.html</trackback:ping><description><![CDATA[在编写socket ftp之前，我对fork函数进行了学习。<br>先看这段范例代码：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">sys</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">types.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>main&nbsp;()&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_62_392_Open_Image onclick="this.style.display='none'; Codehighlighter1_62_392_Open_Text.style.display='none'; Codehighlighter1_62_392_Closed_Image.style.display='inline'; Codehighlighter1_62_392_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_62_392_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_62_392_Closed_Text.style.display='none'; Codehighlighter1_62_392_Open_Image.style.display='inline'; Codehighlighter1_62_392_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_62_392_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_62_392_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;pid_t&nbsp;pid;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pid</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">fork();&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(pid&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">error&nbsp;in&nbsp;fork!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(pid&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">i&nbsp;am&nbsp;the&nbsp;child&nbsp;process,&nbsp;my&nbsp;process&nbsp;id&nbsp;is&nbsp;%dn</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,getpid());&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">i&nbsp;am&nbsp;the&nbsp;parent&nbsp;process,&nbsp;my&nbsp;process&nbsp;id&nbsp;is&nbsp;%dn</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,getpid());&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>这段代码写了一个使用fork函数创建子进程，父子进程同时运行而产生交错的，不一样的运行结果。<br>运行结果如下：<br>[root@localhost&nbsp;c]#&nbsp;./a.out <br>i&nbsp;am&nbsp;the&nbsp;child&nbsp;process,&nbsp;my&nbsp;process&nbsp;id&nbsp;is&nbsp;4286 <br>i&nbsp;am&nbsp;the&nbsp;parent&nbsp;process,&nbsp;my&nbsp;process&nbsp;id&nbsp;is&nbsp;4285&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fork在英文中是叉子，分叉的意思，在函数fork中，取后面的意思。很形象的表示程序从这里分叉，fork函数创建了子进程，子进程和父进程同时（其实是cpu分时处理）开始运行分叉之后的程序。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我把程序改写了一下：&nbsp;
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">sys</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">types.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>main()<br><img id=Codehighlighter1_50_642_Open_Image onclick="this.style.display='none'; Codehighlighter1_50_642_Open_Text.style.display='none'; Codehighlighter1_50_642_Closed_Image.style.display='inline'; Codehighlighter1_50_642_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_50_642_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_50_642_Closed_Text.style.display='none'; Codehighlighter1_50_642_Open_Image.style.display='inline'; Codehighlighter1_50_642_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_50_642_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_50_642_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pid_t&nbsp;pid;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n[%d]not&nbsp;fork&nbsp;pid=%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,getpid(),pid);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pid</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">fork();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n[%d]forked&nbsp;pid=%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,getpid(),pid);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pid</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_231_338_Open_Image onclick="this.style.display='none'; Codehighlighter1_231_338_Open_Text.style.display='none'; Codehighlighter1_231_338_Closed_Image.style.display='inline'; Codehighlighter1_231_338_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_231_338_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_231_338_Closed_Text.style.display='none'; Codehighlighter1_231_338_Open_Image.style.display='inline'; Codehighlighter1_231_338_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_231_338_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_231_338_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">error&nbsp;in&nbsp;fork!\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pid</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n[%d]in&nbsp;child&nbsp;process,p_id=%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,getpid(),getpid());<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_465_640_Open_Image onclick="this.style.display='none'; Codehighlighter1_465_640_Open_Text.style.display='none'; Codehighlighter1_465_640_Closed_Image.style.display='inline'; Codehighlighter1_465_640_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_465_640_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_465_640_Closed_Text.style.display='none'; Codehighlighter1_465_640_Open_Image.style.display='inline'; Codehighlighter1_465_640_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_465_640_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_465_640_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n[%d]in&nbsp;parent&nbsp;process,my&nbsp;pid=%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,getpid(),pid);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n[%d]in&nbsp;parent&nbsp;process,my&nbsp;getpid=%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,getpid(),getpid());<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p><br>程序运行结果如下：<br>[hardy@localhost fork]$ ./fork</p>
<p style="COLOR: red">[3819]not fork</p>
<p style="COLOR: red">[3820]forked pid=0</p>
<p style="COLOR: red">[3820]in child process,p_id=3820</p>
<p style="COLOR: red">[3819]forked pid=3820</p>
<p style="COLOR: red">[3819]in parent process,my pid=3820</p>
<p><span style="COLOR: red">[3819]in parent process,my getpid=3819</span><br><br>可以清楚的看到 not fork只打印了一次，其中[3819]是父进程的进程号，创建fork以后，fork函数返回给父进程的值pid是子进程的进程号[3820]，而在子进程中，pid值为零。也就是说子进程中，pid被置零。</p>
引用网上一位网友的解释&#8220;<span style="COLOR: #3366ff">其实就相当于链表，进程形成了链表，父进程pid(p 意味point)指向子进程的进程id, 因为子进程没有子进程，所以其pid为0.&nbsp; </span>&#8221; <br><br>下面有一个很有意思的程序：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">sys</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">types.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_55_381_Open_Image onclick="this.style.display='none'; Codehighlighter1_55_381_Open_Text.style.display='none'; Codehighlighter1_55_381_Closed_Image.style.display='inline'; Codehighlighter1_55_381_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_55_381_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_55_381_Closed_Text.style.display='none'; Codehighlighter1_55_381_Open_Image.style.display='inline'; Codehighlighter1_55_381_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_55_381_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_55_381_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_110_361_Open_Image onclick="this.style.display='none'; Codehighlighter1_110_361_Open_Text.style.display='none'; Codehighlighter1_110_361_Closed_Image.style.display='inline'; Codehighlighter1_110_361_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_110_361_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_110_361_Closed_Text.style.display='none'; Codehighlighter1_110_361_Open_Image.style.display='inline'; Codehighlighter1_110_361_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_110_361_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_110_361_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;pid</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;fork();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pid</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_189_249_Open_Image onclick="this.style.display='none'; Codehighlighter1_189_249_Open_Text.style.display='none'; Codehighlighter1_189_249_Closed_Image.style.display='inline'; Codehighlighter1_189_249_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_189_249_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_189_249_Closed_Text.style.display='none'; Codehighlighter1_189_249_Open_Image.style.display='inline'; Codehighlighter1_189_249_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_189_249_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_189_249_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">son\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_288_351_Open_Image onclick="this.style.display='none'; Codehighlighter1_288_351_Open_Text.style.display='none'; Codehighlighter1_288_351_Closed_Image.style.display='inline'; Codehighlighter1_288_351_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_288_351_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_288_351_Closed_Text.style.display='none'; Codehighlighter1_288_351_Open_Image.style.display='inline'; Codehighlighter1_288_351_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_288_351_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_288_351_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">father\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>大家想想看最后将出现几个son 几个father呢？<br>。<br>。<br>。<br>。<br>。<br>。<br>。<br><br>对一下答案吧：<br><span style="COLOR: red">[hardy@localhost fork]$ ./fork<br>father<br>son<br>son<br>son<br>father<br>father<br>son<br>father<br>son<br>son<br>father<br>father<br>son<br>father</span><br>总共7个son7个father。你答对了么？<br><br>这道题需要在纸上画画才好理解<br>for&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;i=0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;father&nbsp;&nbsp;&nbsp;&nbsp; father&nbsp;&nbsp;&nbsp;&nbsp; father<br>&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;son<br>&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;son&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;father<br>&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;son<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;son&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; father&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;father<br>&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;son<br>&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;son&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;father<br>&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;son<br>其中每一行分别代表一个进程的运行打印结果。<br>当产生子进程的时刻，子进程打印son，当子进程调用fork的生成子子进程，他就提升为father。<br>总结来说，father永远打印father，son在fork之前是son，fork之后就为father，同时生成新的son。<br>这个比喻就像真正的父子，孩子长大了生了小孩，孩子就成了父亲。而父亲永远是父亲。
<img src ="http://www.cppblog.com/zhangxu/aggbug/37640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangxu/" target="_blank">张旭</a> 2007-12-02 15:20 <a href="http://www.cppblog.com/zhangxu/archive/2007/12/02/37640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>智能猜数字程序中的疑问</title><link>http://www.cppblog.com/zhangxu/archive/2007/12/01/37614.html</link><dc:creator>张旭</dc:creator><author>张旭</author><pubDate>Sat, 01 Dec 2007 09:05:00 GMT</pubDate><guid>http://www.cppblog.com/zhangxu/archive/2007/12/01/37614.html</guid><wfw:comment>http://www.cppblog.com/zhangxu/comments/37614.html</wfw:comment><comments>http://www.cppblog.com/zhangxu/archive/2007/12/01/37614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangxu/comments/commentRss/37614.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangxu/services/trackbacks/37614.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天花了一下午的时间学习李老师新写的智能猜数字程序，从执行效率上来看，在取值范围比我做的大1万倍的情况下，计算次数几乎相同。所以我学习的重点集中在，算法是如何优化的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先回忆我自己的程序算法，是先创造一个结果全集（在取四位的情况下全集是1万），在根据提示逐步筛选出正确的答案。但是这种算法在全集总数巨大的时候（李老师的程序取8位，全集为1亿），那么程序的执行效率必然是大打折扣的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;智能猜数字游戏中最关键的就是计算机产生假设的那个函数，李老师的相关函数是<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;generate_new_answer&nbsp;(RECORD&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;ar,&nbsp;OPTIONS&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;opt)</span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我的疑问也主要集中在这部分，先说说我看明白的部分。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count)<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_20_576_Open_Image onclick="this.style.display='none'; Codehighlighter1_20_576_Open_Text.style.display='none'; Codehighlighter1_20_576_Closed_Image.style.display='inline'; Codehighlighter1_20_576_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_20_576_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_20_576_Closed_Text.style.display='none'; Codehighlighter1_20_576_Open_Image.style.display='inline'; Codehighlighter1_20_576_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_20_576_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_20_576_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;First&nbsp;step&nbsp;work<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;size&nbsp;=&nbsp;(unsigned&nbsp;long)&nbsp;pow&nbsp;(opt-&gt;total_num,&nbsp;opt-&gt;select_num)+2;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;size&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">select_num;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">计算集合的总数&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #008000"><img id=Codehighlighter1_193_239_Open_Image onclick="this.style.display='none'; Codehighlighter1_193_239_Open_Text.style.display='none'; Codehighlighter1_193_239_Closed_Image.style.display='inline'; Codehighlighter1_193_239_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_193_239_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_193_239_Closed_Text.style.display='none'; Codehighlighter1_193_239_Open_Image.style.display='inline'; Codehighlighter1_193_239_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_193_239_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_193_239_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;</span><span style="COLOR: #000000">*=</span><span style="COLOR: #000000">&nbsp;opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">total_num;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;size&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;size&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;&nbsp;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;j</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">select_num;&nbsp;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id=Codehighlighter1_330_530_Open_Image onclick="this.style.display='none'; Codehighlighter1_330_530_Open_Text.style.display='none'; Codehighlighter1_330_530_Closed_Image.style.display='inline'; Codehighlighter1_330_530_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_330_530_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_330_530_Closed_Text.style.display='none'; Codehighlighter1_330_530_Open_Image.style.display='inline'; Codehighlighter1_330_530_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_330_530_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_330_530_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">answer[ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count&nbsp;&nbsp;][opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">select_num</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">j</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">resource&nbsp;[(opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">total_num</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">j</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">total_num];<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">answer[ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">][j]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">resource&nbsp;[opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">total_num</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">answer[ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count]);<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面这一段是当还未进行猜测的时候触发的一段函数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5-9行是计算一下整个集合的数量，10选8的结果应该是10的8次方，1亿。其中变量i在之前静态声明。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11-15行是生成第一次和第二次要猜测的answer。至于为什么要固定第一次和第二次的猜测答案。在我的程序中也有类似的设定，我的全集是（0000-9999）规定第一次猜测9876，第二次猜测2345。这样做的好处是可以最大限度的加速猜测速度。如果第一次猜0000，而第二次猜1111的话，排除掉的结果比较少。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最后函数返回第一次的猜测结果。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(;&nbsp;i;&nbsp;i</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_19_26_Open_Image onclick="this.style.display='none'; Codehighlighter1_19_26_Open_Text.style.display='none'; Codehighlighter1_19_26_Closed_Image.style.display='inline'; Codehighlighter1_19_26_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_19_26_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_19_26_Closed_Text.style.display='none'; Codehighlighter1_19_26_Open_Image.style.display='inline'; Codehighlighter1_19_26_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_19_26_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_19_26_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面这个循环是当有了猜测数后，开始进行排除工作，最后产生一个有效的新的答案。i是集合中剩余结果的数量。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">answer[ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count][</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;j</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">select_num;&nbsp;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img id=Codehighlighter1_79_418_Open_Image onclick="this.style.display='none'; Codehighlighter1_79_418_Open_Text.style.display='none'; Codehighlighter1_79_418_Closed_Image.style.display='inline'; Codehighlighter1_79_418_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_79_418_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_79_418_Closed_Text.style.display='none'; Codehighlighter1_79_418_Open_Image.style.display='inline'; Codehighlighter1_79_418_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_79_418_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_79_418_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">answer[ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count][j]&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">resource&nbsp;[opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">total_num</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">])<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img id=Codehighlighter1_170_352_Open_Image onclick="this.style.display='none'; Codehighlighter1_170_352_Open_Text.style.display='none'; Codehighlighter1_170_352_Closed_Image.style.display='inline'; Codehighlighter1_170_352_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_170_352_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_170_352_Closed_Text.style.display='none'; Codehighlighter1_170_352_Open_Image.style.display='inline'; Codehighlighter1_170_352_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_170_352_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_170_352_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">answer[ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count][j]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">resource&nbsp;[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">answer[ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count][j</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">answer[ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count][opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">select_num]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img id=Codehighlighter1_371_408_Open_Image onclick="this.style.display='none'; Codehighlighter1_371_408_Open_Text.style.display='none'; Codehighlighter1_371_408_Closed_Image.style.display='inline'; Codehighlighter1_371_408_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_371_408_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_371_408_Closed_Text.style.display='none'; Codehighlighter1_371_408_Open_Image.style.display='inline'; Codehighlighter1_371_408_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_371_408_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_371_408_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面这段是进入循环之后的第一段代码，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1行，猜测次数加1.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2-13行从注释来看这是生成一个新的答案系列，<img src="http://www.cppblog.com/CuteSoft_Client/CuteEditor/images/emquestion.gif" align=absMiddle border=0>可是我只能看出这是对本次对比筛选的答案的检查，看是否超出全集中的范围。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;j</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count;&nbsp;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img id=Codehighlighter1_38_287_Open_Image onclick="this.style.display='none'; Codehighlighter1_38_287_Open_Text.style.display='none'; Codehighlighter1_38_287_Closed_Image.style.display='inline'; Codehighlighter1_38_287_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_38_287_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_38_287_Closed_Text.style.display='none'; Codehighlighter1_38_287_Open_Image.style.display='inline'; Codehighlighter1_38_287_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_38_287_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_38_287_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;compare&nbsp;with&nbsp;all&nbsp;records</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;give_answer_tip&nbsp;(tip,&nbsp;ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">answer[j],&nbsp;ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">answer[ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count],&nbsp;opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">select_num);<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(tip[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">tip[j][</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;tip[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">tip[j][</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">])<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img id=Codehighlighter1_240_277_Open_Image onclick="this.style.display='none'; Codehighlighter1_240_277_Open_Text.style.display='none'; Codehighlighter1_240_277_Closed_Image.style.display='inline'; Codehighlighter1_240_277_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_240_277_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_240_277_Closed_Text.style.display='none'; Codehighlighter1_240_277_Open_Image.style.display='inline'; Codehighlighter1_240_277_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_240_277_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_240_277_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面这段是进入循环之后的第二段代码，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将这个结果和前几次的猜测做&#8220;猜数字判断&#8221;，如果和之前的猜测结果不完全相同的，则跳出。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/CuteSoft_Client/CuteEditor/images/emquestion.gif" align=absMiddle border=0><strong>这一点不太明白。首先为什么要和之前的结果做比对。之前的结果是猜数和答案的关系。而新猜数和旧猜数之间的关系能说明什么呢？这不是惯常的思路。</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count)<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img id=Codehighlighter1_28_215_Open_Image onclick="this.style.display='none'; Codehighlighter1_28_215_Open_Text.style.display='none'; Codehighlighter1_28_215_Closed_Image.style.display='inline'; Codehighlighter1_28_215_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_28_215_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_28_215_Closed_Text.style.display='none'; Codehighlighter1_28_215_Open_Image.style.display='inline'; Codehighlighter1_28_215_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_28_215_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_28_215_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;pass&nbsp;all&nbsp;records&nbsp;check,&nbsp;record&nbsp;new&nbsp;answer</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy&nbsp;(ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">answer[ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">],&nbsp;ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">answer[ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count],&nbsp;opt</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">select_num);<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">answer[ar</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">count]);<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当上一个循环没有break时，也就是（当前数字和之前猜数）的比对结果和（之前猜数和答案）的比对结果都不一样的时候。这该数字为新的猜数。返回。
<img src ="http://www.cppblog.com/zhangxu/aggbug/37614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangxu/" target="_blank">张旭</a> 2007-12-01 17:05 <a href="http://www.cppblog.com/zhangxu/archive/2007/12/01/37614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP/IP编程实现远程文件传输</title><link>http://www.cppblog.com/zhangxu/archive/2007/12/01/37594.html</link><dc:creator>张旭</dc:creator><author>张旭</author><pubDate>Fri, 30 Nov 2007 17:27:00 GMT</pubDate><guid>http://www.cppblog.com/zhangxu/archive/2007/12/01/37594.html</guid><wfw:comment>http://www.cppblog.com/zhangxu/comments/37594.html</wfw:comment><comments>http://www.cppblog.com/zhangxu/archive/2007/12/01/37594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangxu/comments/commentRss/37594.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangxu/services/trackbacks/37594.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在TCP/IP网络结构中，为了保证网络安全，网络人员往往需要在路由器上添加防火墙，禁止非法用户用ftp等安全危害较大的TCP/IP协议访问主机。而有时系统维护人员需要用ftp将一些文件从中心机房主机传到前端网点主机上，比如应用程序的替换升级。如果每次传输文件时都要打开防火墙，未免显得有些繁琐，要是在自己的应用程序中增加一个专门的文件传输模块，那将是十分愉快的事情。 &nbsp;&nbsp;<a href='http://www.cppblog.com/zhangxu/archive/2007/12/01/37594.html'>阅读全文</a><img src ="http://www.cppblog.com/zhangxu/aggbug/37594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangxu/" target="_blank">张旭</a> 2007-12-01 01:27 <a href="http://www.cppblog.com/zhangxu/archive/2007/12/01/37594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket编程学习笔记（1）</title><link>http://www.cppblog.com/zhangxu/archive/2007/12/01/37591.html</link><dc:creator>张旭</dc:creator><author>张旭</author><pubDate>Fri, 30 Nov 2007 16:22:00 GMT</pubDate><guid>http://www.cppblog.com/zhangxu/archive/2007/12/01/37591.html</guid><wfw:comment>http://www.cppblog.com/zhangxu/comments/37591.html</wfw:comment><comments>http://www.cppblog.com/zhangxu/archive/2007/12/01/37591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangxu/comments/commentRss/37591.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangxu/services/trackbacks/37591.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:   今天重新把socket编程中的每一个函数的功能和说明都仔细的看了一遍，也有了更深一层的理解。在经历一次面试的失利之后，我觉得最大的问题就出在没有对学过的知识力求甚解，导致对概念不清楚。所以在看这部分知识的时候，倍加用心的研究。<br>  socket编程中主要用到一个结构 sockaddr和以下几个函数，socket(),bind(),connect()，listen(),accept(),send(),recv()。&nbsp;&nbsp;<a href='http://www.cppblog.com/zhangxu/archive/2007/12/01/37591.html'>阅读全文</a><img src ="http://www.cppblog.com/zhangxu/aggbug/37591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangxu/" target="_blank">张旭</a> 2007-12-01 00:22 <a href="http://www.cppblog.com/zhangxu/archive/2007/12/01/37591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>