﻿<?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>博客园-Alive</title><link>http://www.cnblogs.com/wayne1017/</link><description>Because black represent reality!</description><language>zh-cn</language><lastBuildDate>Tue, 16 Mar 2010 19:40:35 GMT</lastBuildDate><pubDate>Tue, 16 Mar 2010 19:40:35 GMT</pubDate><ttl>60</ttl><item><title>一个很棒的ORACLE参数绑定问题的解决</title><link>http://www.cnblogs.com/wayne1017/archive/2007/05/15/746573.html</link><dc:creator>肥猫</dc:creator><author>肥猫</author><pubDate>Mon, 14 May 2007 18:04:00 GMT</pubDate><guid>http://www.cnblogs.com/wayne1017/archive/2007/05/15/746573.html</guid><description><![CDATA[<p>阅读: 771 评论: 2 作者: <a href="http://www.cnblogs.com/wayne1017/" target="_blank">肥猫</a> 发表于 2007-05-15 02:04 <a href="http://www.cnblogs.com/wayne1017/archive/2007/05/15/746573.html" target="_blank">原文链接</a></p><p><font size=2>在最近做的一个项目里面碰到了类似下面的问题(为了便于阐述，进行了适当的简化)：<br>Dim&nbsp;strsql As String<br>For i=0 to N<br>&nbsp;&nbsp;&nbsp; <font color=#ff0000>strsql="UPDATE TABLE SET NAME='wayne' WHERE NAME = :strName"</font><br>&nbsp;&nbsp;&nbsp; Dim cmd As New OracleCommand(strsql, mOracleCnnDB)<br>&nbsp;&nbsp;&nbsp; For j= 0 to M<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.Parameters.Add(New OracleParameter(":strName", OracleType.VarChar)).Value = EmptyToDBNull( strName(j) )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.ExecuteNonQuery()<br>&nbsp;&nbsp;&nbsp; Next<br>Next<br></font><font size=2><font color=#408080>其中EmptyToDBNull函数依据输入的字符串str给出输出value，若str=""则value=DBNull.Value；若str&lt;&gt;""则value=str<br></font>注意上面的strsql语句，本意是想利用ORACLE的参数绑定，减少对SQL语句的编译，提高程序性能。但是却发现一个严重的问题：<br>当在第二层循环中对绑定的参数:strName进行赋值的时候，<strong>如果strName(j)的值不为空</strong>，比如strName(0)="Jack"，那么strsql语句实际上是：<br><font color=#0080ff>UPDATE TABLE SET NAME='wayne' WHERE NAME='Jack'</font><br>毫无疑问，这个SQL语句是可以正确执行的，会将所有NAME字段值等于'Jack'的记录的NAME字段值更新为'wayne'。<br><strong>如果某一个strName(j)值为空的话</strong>，比如strName(2)=""，好了，问题就来了，此时strsql语句变成了<br><font color=#0080ff>UPDATE TABLE SET NAME='wayne' WHERE NAME=''</font><br>很明显，这个SQL语句虽然可以执行，但却并不是我们预想的结果，因为这个SQL语句不会更新任何记录。我们知道，在ORACLE中对于空值的判断应该采用下面的方式：<br><font color=#0080ff>UPDATE TABLE SET NAME='wayne' WHERE NAME IS NULL</font><br>这样才能将所有为空值的NAME字段更新为'wayne'。</font></p>
<p><font size=2><strong>下面我们要做的工作就是怎么样才能改进这个strsql语句，使它能真正适应我们的需求呢？<br></strong>有人给出下面的解决方法，思路就是在前期生成strsql语句时候就通过判断:strName变量是否为空，从而生成不同的strsql语句，即如下形式：<br>If strName(j) &lt;&gt; ""<br>&nbsp;&nbsp;&nbsp; strsql="UPDATE TABLE SET NAME='wayne' WHERE NAME = :strName"<br>Else<br>&nbsp;&nbsp;&nbsp; strsql="UPDATE TABLE SET NAME='wayne' WHERE NAME IS NULL"<br>End If<br>很明显，这种改法并不符合我们预期的想法，一旦这样改的话，就失去了参数绑定的优势了，与普通不用参数绑定的方式效率一样了。<br>还有人说，根本不能按照你预想的方式写出这样的strsql语句。想仅仅通过NAME=:strName来统一空值和非空值是决不可能的。<br><br>问题当然是可以解决的啦，不然就没有这篇随笔啦，呵呵。最后，就让我们看看怎么解决这个问题：<br>其实是在MSDN上面找到我们需要的解决办法，在MSDN中有一节</font><a href="http://www.microsoft.com/china/MSDN/library/data/dataAccess/BestPractiCEs+forUsingADO.NET.mspx?mfr=true" target=_blank><font size=2>&#8221;数据访问：使用 ADO.NET 的最佳实践（ADO.NET 技术文档）&#8220;</font></a><font size=2>中讲到了&#8220;测试Null&#8221; 和&#8220;把Null作为参数值传递&#8221;，原文是这样写的：</font></p>
<p><font size=2><strong>测试 Null</strong><br>如果表（在数据库中）中的列允许为空，就不能测试参数值是否&#8220;等于&#8221;空。相反，需要写一个 WHERE 子句，测试列和参数是否都为空。下面的 SQL 语句返回一些行，它们的 LastName 列等于赋给 @LastName 参数的值，或者 LastName 列和 @LastName 参数都为空。<br><font color=#ff0000>SELECT * FROM Customers　WHERE (LastName = @LastName) OR (LastName IS NULL AND @LastName IS NULL)</font></font></p>
<p><font size=2><strong>把 Null 作为参数值传递</strong><br>对数据库的命令中，当把空值作为参数值发送时，不能使用 null（Visual Basic .NET 中为 Nothing）。而需要使用 DBNull.Value。例如：<br>'Visual Basic<br>Dim param As SqlParameter = New SqlParameter("@Name", SqlDbType.NVarChar, 20)<br>param.Value = DBNull.Value<br>//C#<br>SqlParameter param = new SqlParameter("@Name", SqlDbType.NVarChar, 20);<br>param.Value = DBNull.Value;</font></p>
<p><font size=2>基于上面的两点参考，不难将我们的程序中的strsql修改为如下形式即可：<br></font><font color=#ff0000 size=2><strong>strsql="UPDATE TABLE SET NAME='wayne' WHERE&nbsp;(NAME = :strName) OR (NAME IS NULL AND NVL(:strName,'空白值')='空白值')"<br></strong></font><font color=#000000><font size=2>问题迎刃而解了，哈哈。<br><br>p.s.推荐大家一个很好用的下载微软Webcast课程的C#编写的开源工具：</font><a href="http://www.ireaper.net/" target=_blank><font size=2>IReaper</font></a></font></p>
<img src="http://www.cnblogs.com/wayne1017/aggbug/746573.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/wayne1017/archive/2007/05/15/746573.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wayne1017/archive/2007/05/15/746573.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/58878/" target="_blank">Google手机上市74天仅售13.5万部 远少于iPhone</a><span style="color:gray">(2010-03-16 22:54)</span><br/>· <a href="http://news.cnblogs.com/n/58877/" target="_blank">星际争霸2破解进度：实现主机和客户端连接</a><span style="color:gray">(2010-03-16 22:43)</span><br/>· <a href="http://news.cnblogs.com/n/58876/" target="_blank">iPhone、WM、Symbian、Android移动开发前景分析</a><span style="color:gray">(2010-03-16 22:03)</span><br/>· <a href="http://news.cnblogs.com/n/58874/" target="_blank">搜狐旧将樊功臣全面接管搜狗 欲重振搜索业务</a><span style="color:gray">(2010-03-16 21:32)</span><br/>· <a href="http://news.cnblogs.com/n/58873/" target="_blank">腾讯昨推QQ会员官方店 全面向淘宝宣战</a><span style="color:gray">(2010-03-16 21:28)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/58848/" target="_blank">IT蚁族：蜗居和逃离</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Hadoop学习笔记二  安装部署</title><link>http://www.cnblogs.com/wayne1017/archive/2007/03/20/678724.html</link><dc:creator>肥猫</dc:creator><author>肥猫</author><pubDate>Mon, 19 Mar 2007 16:00:00 GMT</pubDate><guid>http://www.cnblogs.com/wayne1017/archive/2007/03/20/678724.html</guid><description><![CDATA[<p>阅读: 11791 评论: 18 作者: <a href="http://www.cnblogs.com/wayne1017/" target="_blank">肥猫</a> 发表于 2007-03-20 00:00 <a href="http://www.cnblogs.com/wayne1017/archive/2007/03/20/678724.html" target="_blank">原文链接</a></p><p style="FONT-SIZE: 14pt">本文主要是以安装和使用<a title=hadoop-0.12.0 style="FONT-SIZE: 14pt" href="http://ftp.wayne.edu/apache/lucene/hadoop/">hadoop-0.12.0</a>为例，指出在部署Hadoop的时候容易遇到的问题以及如何解决。</p>
<p style="FONT-SIZE: 14pt"><br><span style="COLOR: #0000ff">硬件环境<br></span>共有3台机器，均使用的FC5系统，Java使用的是jdk1.6.0。IP配置如下：<br>dbrg-1：202.197.18.72<br>dbrg-2：202.197.18.73<br>dbrg-3：202.197.18.74</p>
<p style="FONT-SIZE: 14pt"><span style="COLOR: #ff6600">这里有一点需要强调的就是，务必要确保每台机器的主机名和IP地址之间能正确解析</span>。</p>
<p style="FONT-SIZE: 14pt">一个很简单的测试办法就是ping一下主机名，比如在dbrg-1上ping dbrg-2，如果能ping通就OK！若不能正确解析，可以修改/etc/hosts文件，如果该台机器作Namenode用，则需要在hosts文件中加上集群中所有机器的IP地址及其对应的主机名；如果该台机器作Datanode用，则只需要在hosts文件中加上本机IP地址和Namenode机器的IP地址。</p>
<p style="FONT-SIZE: 14pt">以本文为例，dbrg-1中的/etc/hosts文件看起来就应该是这样的：<br>127.0.0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localhost&nbsp;&nbsp;&nbsp;&nbsp; localhost<br>202.197.18.72&nbsp;&nbsp;&nbsp;&nbsp; dbrg-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbrg-1<br>202.197.18.73&nbsp;&nbsp;&nbsp;&nbsp; dbrg-2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbrg-2<br>202.197.18.74&nbsp;&nbsp;&nbsp;&nbsp; dbrg-3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbrg-3</p>
<p style="FONT-SIZE: 14pt">dbrg-2中的/etc/hosts文件看起来就应该是这样的：<br>127.0.0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localhost&nbsp;&nbsp;&nbsp; localhost<br>202.197.18.72&nbsp;&nbsp;&nbsp;&nbsp; dbrg-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbrg-1<br>202.197.18.73&nbsp;&nbsp;&nbsp;&nbsp; dbrg-2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbrg-2 </p>
<p style="FONT-SIZE: 14pt">在上一篇学习笔记中提到过，对于Hadoop来说，在HDFS看来，节点分为Namenode和Datanode，其中Namenode只有一个，Datanode可以是很多；在MapReduce看来，节点又分为Jobtracker和Tasktracker，其中Jobtracker只有一个，Tasktracker可以是很多。<br>我是将namenode和jobtracker部署在dbrg-1上，dbrg-2,dbrg-3作为datanode和tasktracker。当然你也可以将namenode，datanode，jobtracker，tasktracker全部部署在一台机器上</p>
<p style="FONT-SIZE: 14pt"><br><span style="COLOR: #0000ff">目录结构</span><br>由于<span style="COLOR: #ff6600">Hadoop要求所有机器上hadoop的部署目录结构要相同，并且都有一个相同的用户名的帐户</span>。<br>我的三台机器上是这样的：都有一个dbrg的帐户，主目录是/home/dbrg<br>Hadoop部署目录结构如下：/home/dbrg/HadoopInstall，所有的hadoop版本放在这个目录中。<br>将hadoop0.12.0压缩包解压至HadoopInstall中，为了方便以后升级，<span style="COLOR: #ff6600">建议建立一个链接指向要使用的hadoop版本</span>，不妨设为hadoop<br>[dbrg@dbrg-1:HadoopInstall]$ln&nbsp; -s&nbsp; hadoop0.12.0&nbsp;&nbsp; hadoop<br>这样一来，所有的配置文件都在/hadoop/conf/目录中，所有执行程序都在/hadoop/bin目录中。<br>但是由于上述目录中hadoop的配置文件和hadoop的安装目录是放在一起的，这样一旦日后升级hadoop版本的时候所有的配置文件都会被覆盖，因此<span style="COLOR: #ff6600">建议将配置文件与安装目录分离</span>，一种比较好的方法就是建立一个存放配置文件的目录，/home/dbrg/HadoopInstall/hadoop-config/，然后将/hadoop/conf/目录中的hadoop_site.xml，slaves，hadoop_env.sh三个文件拷贝到hadoop-config/目录中(这个问题很奇怪，在官网上的<a title="Getting Started With Hadoop" style="FONT-SIZE: 14pt" href="http://wiki.apache.org/lucene-hadoop/GettingStartedWithHadoop">Getting Started With Hadoop</a>中说是只需要拷贝这个三个文件到自己创建的目录就可以了，但我在实际配置的时候发现还必须把masters这个文件也拷贝到hadoop-conf/目录中才行，不然启动Hadoop的时候就会报错说找不到masters这个文件)，并指定环境变量$HADOOP_CONF_DIR指向该目录。环境变量在/home/dbrg/.bashrc和/etc/profile中设定。<br><span style="COLOR: #ff6600">综上所述，为了方便以后升级版本，我们需要做到配置文件与安装目录分离，并通过设定一个指向我们要使用的版本的hadoop的链接，这样可以减少我们对配置文件的维护</span>。在下面的部分，你就会体会到这样分离以及链接的好处了。</p>
<p style="FONT-SIZE: 14pt"><br><span style="COLOR: #0000ff">SSH设置<br></span>在Hadoop启动以后，Namenode是通过<a title=SSH style="FONT-SIZE: 14pt" href="http://www.ssh.com/products/ssh_secure_shell/">SSH</a>（Secure Shell）来启动和停止各个节点上的各种守护进程的，这就需要在节点之间执行指令的时候是不需要输入密码的方式，故我们需要配置SSH使用无密码公钥认证的方式。<br>首先要保证每台机器上都装了SSH服务器，且都正常启动。实际中我们用的都是<a title=OpenSSH style="FONT-SIZE: 14pt" href="http://www.openssh.com/">OpenSSH</a>，这是SSH协议的一个免费开源实现。FC5中默认安装的OpenSSH版本是OpenSSH4.3P2。<br>以本文中的三台机器为例，现在dbrg-1是主节点，它需要主动发起SSH连接到dbrg-2和dbrg-3，对于SSH服务来说，dbrg-1就是SSH客户端，而dbrg-2、dbrg-3则是SSH服务端，因此在dbrg-2，dbrg-3上需要确定sshd服务已经启动。简单的说，在dbrg-1上需要生成一个密钥对，即一个私钥，一个公钥。将公钥拷贝到dbrg-2，dbrg-3上，这样，比如当dbrg-1向dbrg-2发起ssh连接的时候，dbrg-2上就会生成一个随机数并用dbrg-1的公钥对这个随机数进行加密，并发送给dbrg-1；dbrg-1收到这个加密的数以后用私钥进行解密，并将解密后的数发送回dbrg-2，dbrg-2确认解密的数无误后就允许dbrg-1进行连接了。这就完成了一次公钥认证过程。</p>
<p style="FONT-SIZE: 14pt">对于本文中的三台机器，首先在dbrg-1上生成密钥对：<br>[dbrg@dbrg-1:~]$ssh-keygen&nbsp; -t&nbsp; rsa<br>这个命令将为dbrg-1上的用户dbrg生成其密钥对，询问其保存路径时直接回车采用默认路径，当提示要为生成的密钥输入passphrase的时候，直接回车，也就是将其设定为空密码。生成的密钥对id_rsa，id_rsa.pub，默认存储在/home/dbrg/.ssh目录下。然后将id_rsa.pub的内容复制到每个机器(也包括本机)的/home/dbrg/.ssh/authorized_keys文件中，如果机器上已经有authorized_keys这个文件了，就在文件末尾加上id_rsa.pub中的内容，如果没有authorized_keys这个文件，直接cp或者scp就好了，下面的操作假设各个机器上都没有authorized_keys文件。</p>
<p style="FONT-SIZE: 14pt">对于dbrg-1<br>[dbrg@dbrg-1:.ssh]$cp id_rsa.pub authorized_keys</p>
<p style="FONT-SIZE: 14pt">对于dbrg-2（dbrg-3同dbrg-2的方法）<br>[dbrg@dbrg-2:~]$mkdir .ssh<br>[dbrg@dbrg-1:.ssh]$scp authorized_keys dbrg-2:/home/dbrg/.ssh/<br>此处的scp就是通过ssh进行远程copy，此处需要输入远程主机的密码，即dbrg-2机器上dbrg帐户的密码，当然，你也可以用其他方法将authorized_keys文件拷贝到其他机器上</p>
<p style="FONT-SIZE: 14pt">[dbrg@dbrg-2:.ssh]$chmod 644 authorized_keys<br><span style="COLOR: #ff6600">这一步非常关键，必须保证authorized_keys只对其所有者有读写权限，其他人不允许有写的权限，否则SSH是不会工作的。我就曾经在配置SSH的时候郁闷了好久。</span></p>
<p style="FONT-SIZE: 14pt">[dbrg@dbrg-2:.ssh]ls -la<br>drwx------ 2 dbrg dbrg .<br>drwx------ 3 dbrg dbrg ..<br>&nbsp;-rw-r--r-- 1 dbrg dbrg authorized_keys<br><span style="COLOR: #ff6600">注意每个机器上的.ssh目录的ls -la都应该和上面是一样的</span></p>
<p style="FONT-SIZE: 14pt">接着，在三台机器上都需要对sshd服务进行配置(其实是可以不用配置的，完成了上面的那些操作了以后SSH就已经可以工作了)，在三台机器上修改文件/etc/ssh/sshd_config<br>#去除密码认证<br>PasswordAuthentication&nbsp; no<br>AuthorizedKeyFile&nbsp;&nbsp; .ssh/authorized_keys</p>
<p style="FONT-SIZE: 14pt">至此各个机器上的SSH配置已经完成，可以测试一下了，比如dbrg-1向dbrg-2发起ssh连接<br>[dbrg@dbrg-1:~]$ssh&nbsp; dbrg-2<br>如果ssh配置好了，就会出现以下提示信息<br>The authenticity of host [dbrg-2] can't be established. <br>Key fingerprint is 1024 5f:a0:0b:65:d3:82:df:ab:44:62:6d:98:9c:fe:e9:52. <br>Are you sure you want to continue connecting (yes/no)?<br>OpenSSH告诉你它不知道这台主机，但是你不用担心这个问题，因为你是第一次登录这台主机。键入&#8220;yes&#8221;。这将把这台主机的&#8220;识别标记&#8221;加到&#8220;~/.ssh/know_hosts&#8221;文件中。第二次访问这台主机的时候就不会再显示这条提示信息了。<br>然后你会发现不需要输入密码就可以建立ssh连接了，恭喜你，配置成功了<br><span style="COLOR: #ff6600">不过，别忘了测试本机ssh&nbsp; dbrg-1</span></p>
<p style="FONT-SIZE: 14pt"><br><span style="COLOR: #0000ff">Hadoop环境变量<br></span>在/home/dbrg/HadoopInstall/hadoop-conf目录下的hadoop_env.sh中设置Hadoop需要的环境变量，<span style="COLOR: #ff6600">其中JAVA_HOME是必须设定的变量</span>。HADOOP_HOME变量可以设定也可以不设定，如果不设定，HADOOP_HOME默认的是bin目录的父目录，即本文中的/home/dbrg/HadoopInstall/hadoop。我的是这样设置的<br>export&nbsp; HADOOP_HOME=/home/dbrg/HadoopInstall/hadoop<br>export&nbsp; JAVA_HOME=/usr/java/jdk1.6.0<br>从这个地方就可以看出前面所述的创建hadoop0.12.0的链接hadoop的优点了，当以后更新hadoop的版本的时候，就不需要在改配置文件，只需要更改链接就可以了。</p>
<p style="FONT-SIZE: 14pt"><br><span style="COLOR: #0000ff">Hadoop配置文件<br></span>如前所述，在hadoop-conf/目录下，打开slaves文件，该文件用来指定所有的从节点，<span style="COLOR: #ff6600">一行指定一个主机名</span>。即本文中的dbrg-2，dbrg-3，因此slaves文件看起来应该是这样的<br>dbrg-2<br>dbrg-3<br>在conf/目录中的hadoop-default.xml中包含了Hadoop的所有配置项，但是不允许直接修改！可以在hadoop-conf/目录下的hadoop-site.xml里面定义我们需要的项，其值会覆盖hadoop-default.xml中的默认值。可以根据自己的实际需要来进行定制。以下是我的配置档：<br>&lt;?xml version="1.0"?&gt;<br>&lt;?xml-stylesheet type="text/xsl" href="configuration.xsl"?&gt; <br>&lt;!-- Put site-specific property overrides in this file. --&gt;<br>&lt;configuration&gt;<br>&lt;property&gt;<br>&nbsp; &lt;name&gt;fs.default.name&lt;/name&gt;<br>&nbsp; &lt;value&gt;dbrg-1:9000&lt;/value&gt;<br>&nbsp; &lt;description&gt;The name of the default file system. Either the literal string "local" or a host:port for DFS.&lt;/description&gt;<br>&lt;/property&gt;<br>&lt;property&gt;<br>&nbsp; &lt;name&gt;mapred.job.tracker&lt;/name&gt;<br>&nbsp; &lt;value&gt;dbrg-1:9001&lt;/value&gt;<br>&nbsp; &lt;description&gt;The host and port that the MapReduce job tracker runs at. If "local", then jobs are run in-process as a single map and reduce task.&lt;/description&gt;<br>&lt;/property&gt;<br>&lt;property&gt;<br>&nbsp; &lt;name&gt;hadoop.tmp.dir&lt;/name&gt;<br>&nbsp; &lt;value&gt;/home/dbrg/HadoopInstall/tmp&lt;/value&gt;<br>&nbsp; &lt;description&gt;A base for other temporary directories.&lt;/description&gt;<br>&lt;/property&gt;<br>&lt;property&gt;<br>&nbsp; &lt;name&gt;dfs.name.dir&lt;/name&gt;<br>&nbsp; &lt;value&gt;/home/dbrg/HadoopInstall/filesystem/name&lt;/value&gt;<br>&nbsp; &lt;description&gt;Determines where on the local filesystem the DFS name node should store the name table. If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy. &lt;/description&gt;<br>&lt;/property&gt;<br>&lt;property&gt;<br>&nbsp; &lt;name&gt;dfs.data.dir&lt;/name&gt;<br>&nbsp; &lt;value&gt;/home/dbrg/HadoopInstall/filesystem/data&lt;/value&gt;<br>&nbsp; &lt;description&gt;Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices. Directories that do not exist are ignored.&lt;/description&gt;<br>&lt;/property&gt;<br>&lt;property&gt;<br>&nbsp; &lt;name&gt;dfs.replication&lt;/name&gt;<br>&nbsp; &lt;value&gt;1&lt;/value&gt;<br>&nbsp; &lt;description&gt;Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time.&lt;/description&gt;<br>&lt;/property&gt;<br>&lt;/configuration&gt;</p>
<p style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><span style="COLOR: #0000ff">部署Hadoop</span><br>前面讲的这么多Hadoop的环境变量和配置文件都是在dbrg-1这台机器上的，现在需要将hadoop部署到其他的机器上，<span style="COLOR: #ff6600">保证目录结构一致</span>。<br>[dbrg@dbrg-1:~]$scp&nbsp; -r&nbsp; /home/dbrg/HadoopInstall&nbsp; dbrg-2:/home/dbrg/<br>[dbrg@dbrg-1:~]$scp&nbsp; -r&nbsp; /home/dbrg/HadoopInstall&nbsp; dbrg-3:/home/dbrg/<br>至此，可以说，Hadoop已经在各个机器上部署完毕了下面就让我们开始启动Hadoop吧</p>
<p style="FONT-SIZE: 14pt"><br><span style="COLOR: #0000ff">启动Hadoop</span><br>启动之前，我们<span style="COLOR: #ff6600">先要格式化namenode</span>，先进入~/HadoopInstall/hadoop目录，执行下面的命令<br>[dbrg@dbrg-1:hadoop]$bin/hadoop&nbsp; namenode&nbsp; -format<br>不出意外，应该会提示格式化成功。如果不成功，就去hadoop/logs/目录下去查看日志文件<br>下面就该正式启动hadoop啦，在bin/下面有很多启动脚本，可以根据自己的需要来启动。<br><span style="COLOR: #339966">* start-all.sh 启动所有的Hadoop守护。包括namenode, datanode, jobtracker, tasktrack<br>* stop-all.sh 停止所有的Hadoop<br>* start-mapred.sh 启动Map/Reduce守护。包括Jobtracker和Tasktrack<br>* stop-mapred.sh 停止Map/Reduce守护<br>* start-dfs.sh 启动Hadoop DFS守护.Namenode和Datanode<br>* stop-dfs.sh 停止DFS守护</span></p>
<p style="FONT-SIZE: 14pt">在这里，简单启动所有守护<br>[dbrg@dbrg-1:hadoop]$bin/start-all.sh</p>
<p style="FONT-SIZE: 14pt">同样，如果要停止hadoop，则<br>[dbrg@dbrg-1:hadoop]$bin/stop-all.sh</p>
<p style="FONT-SIZE: 14pt"><br><span style="COLOR: #0000ff">HDFS操作<br></span>运行bin/目录的hadoop命令，可以查看Haoop所有支持的操作及其用法，这里以几个简单的操作为例。</p>
<p style="FONT-SIZE: 14pt">建立目录<br>[dbrg@dbrg-1:hadoop]$bin/hadoop&nbsp; dfs&nbsp; -mkdir&nbsp; testdir<br>在HDFS中建立一个名为testdir的目录</p>
<p style="FONT-SIZE: 14pt">复制文件<br>[dbrg@dbrg-1:hadoop]$bin/hadoop&nbsp; dfs&nbsp; -put&nbsp; /home/dbrg/large.zip&nbsp; testfile.zip<br>把本地文件large.zip拷贝到HDFS的根目录/user/dbrg/下，文件名为testfile.zip</p>
<p style="FONT-SIZE: 14pt">查看现有文件<br>[dbrg@dbrg-1:hadoop]$bin/hadoop&nbsp; dfs&nbsp; -ls</p>
<img src="http://www.cnblogs.com/wayne1017/aggbug/678724.html?type=1" width="1" height="1" alt=""/><p>评论: 18　<a href="http://www.cnblogs.com/wayne1017/archive/2007/03/20/678724.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wayne1017/archive/2007/03/20/678724.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/58878/" target="_blank">Google手机上市74天仅售13.5万部 远少于iPhone</a><span style="color:gray">(2010-03-16 22:54)</span><br/>· <a href="http://news.cnblogs.com/n/58877/" target="_blank">星际争霸2破解进度：实现主机和客户端连接</a><span style="color:gray">(2010-03-16 22:43)</span><br/>· <a href="http://news.cnblogs.com/n/58876/" target="_blank">iPhone、WM、Symbian、Android移动开发前景分析</a><span style="color:gray">(2010-03-16 22:03)</span><br/>· <a href="http://news.cnblogs.com/n/58874/" target="_blank">搜狐旧将樊功臣全面接管搜狗 欲重振搜索业务</a><span style="color:gray">(2010-03-16 21:32)</span><br/>· <a href="http://news.cnblogs.com/n/58873/" target="_blank">腾讯昨推QQ会员官方店 全面向淘宝宣战</a><span style="color:gray">(2010-03-16 21:28)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/58848/" target="_blank">IT蚁族：蜗居和逃离</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Hadoop学习笔记一  简要介绍</title><link>http://www.cnblogs.com/wayne1017/archive/2007/03/18/668768.html</link><dc:creator>肥猫</dc:creator><author>肥猫</author><pubDate>Sat, 17 Mar 2007 18:04:00 GMT</pubDate><guid>http://www.cnblogs.com/wayne1017/archive/2007/03/18/668768.html</guid><description><![CDATA[<p>阅读: 27400 评论: 15 作者: <a href="http://www.cnblogs.com/wayne1017/" target="_blank">肥猫</a> 发表于 2007-03-18 02:04 <a href="http://www.cnblogs.com/wayne1017/archive/2007/03/18/668768.html" target="_blank">原文链接</a></p><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 这里先大致介绍一下Hadoop.<br>&nbsp;&nbsp;&nbsp; 本文大部分内容都是从官网</span><a title=Hadoop href="http://lucene.apache.org/hadoop"><span style="FONT-SIZE: 14pt">Hadoop</span></a><span style="FONT-SIZE: 14pt">上来的。其中有一篇</span><a title=介绍HDFS的pdf文档 href="http://lucene.apache.org/hadoop/hdfs_design.pdf"><span style="FONT-SIZE: 14pt">介绍HDFS的pdf文档</span></a><span style="FONT-SIZE: 14pt">，里面对Hadoop介绍的比较全面了。我的这一个系列的Hadoop学习笔记也是从</span><a title=这里 href="http://wiki.apache.org/lucene-hadoop/GettingStartedWithHadoop"><span style="FONT-SIZE: 14pt">这里</span></a><span style="FONT-SIZE: 14pt">一步一步进行下来的，同时又参考了网上的很多文章，对学习Hadoop中遇到的问题进行了归纳总结。<br>&nbsp;&nbsp;&nbsp; 言归正传，先说一下Hadoop的来龙去脉。谈到Hadoop就不得不提到</span><a title=Lucene href="http://lucene.apache.org/"><span style="FONT-SIZE: 14pt">Lucene</span></a><span style="FONT-SIZE: 14pt">和</span><a title=Nutch href="http://lucene.apache.org/nutch/"><span style="FONT-SIZE: 14pt">Nutch</span></a><span style="FONT-SIZE: 14pt">。首先，<span style="COLOR: #0000ff">Lucene并不是一个应用程序，而是提供了一个纯Java的高性能全文索引引擎工具包</span>，它可以方便的嵌入到各种实际应用中实现全文搜索/索引功能。<span style="COLOR: #0000ff">Nutch是一个应用程序，是一个以Lucene为基础实现的搜索引擎应用</span>，Lucene为Nutch提供了文本搜索和索引的API，Nutch不光有搜索的功能，还有数据抓取的功能。在nutch0.8.0版本之前，Hadoop还属于Nutch的一部分，而从nutch0.8.0开始，将其中实现的NDFS和MapReduce剥离出来成立一个新的开源项目，这就是Hadoop，而nutch0.8.0版本较之以前的Nutch在架构上有了根本性的变化，那就是完全构建在Hadoop的基础之上了。在Hadoop中实现了Google的GFS和MapReduce算法，使Hadoop成为了一个分布式的计算平台。<br>&nbsp;&nbsp;&nbsp;其实，Hadoop并不仅仅是一个用于存储的分布式文件系统，而是设计用来在由通用计算设备组成的大型集群上执行分布式应用的框架。<br><br>&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">Hadoop包含两个部分：</span><br><br>&nbsp;&nbsp;&nbsp;<strong>1、HDFS<br></strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;即Hadoop Distributed File System (Hadoop分布式文件系统)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HDFS具有高容错性，并且可以被部署在低价的硬件设备之上。HDFS很适合那些有大数据集的应用，并且提供了对数据读写的高吞吐率。HDFS是一个master/slave的结构，就通常的部署来说，在master上只运行一个Namenode，而在每一个slave上运行一个Datanode。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HDFS支持传统的层次文件组织结构，同现有的一些文件系统在操作上很类似，比如你可以创建和删除一个文件，把一个文件从一个目录移到另一个目录，重命名等等操作。Namenode管理着整个分布式文件系统，对文件系统的操作（如建立、删除文件和文件夹）都是通过Namenode来控制。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面是HDFS的结构：</span><br>
<div align=center src_cetemp="/images/cnblogs_com/wayne1017/HDFSArch.JPG">
<div align=center src_cetemp="/images/cnblogs_com/wayne1017/HDFSArch.JPG"><img height=645 alt="" src="http://www.cnblogs.com/images/cnblogs_com/wayne1017/HDFSArch.JPG" width=861 border=0></div>
</div>
<br><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从上面的图中可以看出，Namenode，Datanode，Client之间的通信都是建立在TCP/IP的基础之上的。当Client要执行一个写入的操作的时候，命令不是马上就发送到Namenode，Client首先在本机上临时文件夹中缓存这些数据，当临时文件夹中的数据块达到了设定的Block的值（默认是64M）时，Client便会通知Namenode，Namenode便响应Client的RPC请求，将文件名插入文件系统层次中并且在Datanode中找到一块存放该数据的block，同时将该Datanode及对应的数据块信息告诉Client，Client便这些本地临时文件夹中的数据块写入指定的数据节点。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HDFS采取了副本策略，其目的是为了提高系统的可靠性，可用性。HDFS的副本放置策略是三个副本，一个放在本节点上，一个放在同一机架中的另一个节点上，还有一个副本放在另一个不同的机架中的一个节点上。当前版本的hadoop0.12.0中还没有实现，但是正在进行中，相信不久就可以出来了。<br><br>&nbsp;&nbsp;&nbsp;<strong>2、MapReduce的实现<br></strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><a title=MapReduce href="http://labs.google.com/papers/mapreduce.html"><span style="FONT-SIZE: 14pt">MapReduce</span></a><span style="FONT-SIZE: 14pt">是Google 的一项重要技术，它是一个编程模型，用以进行大数据量的计算。对于大数据量的计算，通常采用的处理手法就是并行计算。至少现阶段而言，对许多开发人员来说，并行计算还是一个比较遥远的东西。MapReduce就是一种简化并行计算的编程模型，它让那些没有多少并行计算经验的开发人员也可以开发并行应用。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MapReduce的名字源于这个模型中的两项核心操作：Map和 Reduce。也许熟悉Functional Programming（</span><a title=函数式编程 href="http://chn.blogbeta.com/232.html"><span style="FONT-SIZE: 14pt">函数式编程</span></a><span style="FONT-SIZE: 14pt">）的人见到这两个词会倍感亲切。简单的说来，Map是把一组数据一对一的映射为另外的一组数据，其映射的规则由一个函数来指定，比如对[1, 2, 3, 4]进行乘2的映射就变成了[2, 4, 6, 8]。Reduce是对一组数据进行归约，这个归约的规则由一个函数指定，比如对[1, 2, 3, 4]进行求和的归约得到结果是10，而对它进行求积的归约结果是24。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关于MapReduce的内容，建议看看孟岩的这篇</span><a title="MapReduce:The free lunch is not over!" href="http://www.mengyan.org/blog/archives/2006/11/15/138.html"><span style="FONT-SIZE: 14pt">MapReduce:The Free Lunch Is Not Over!</span></a><br><br><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;好了，作为这个系列的第一篇就写这么多了，我也是刚开始接触Hadoop，下一篇就是讲Hadoop的部署，谈谈我在部署Hadoop时遇到的问题，也给大家一个参考，少走点弯路。</span><br>
<img src="http://www.cnblogs.com/wayne1017/aggbug/668768.html?type=1" width="1" height="1" alt=""/><p>评论: 15　<a href="http://www.cnblogs.com/wayne1017/archive/2007/03/18/668768.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wayne1017/archive/2007/03/18/668768.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/58878/" target="_blank">Google手机上市74天仅售13.5万部 远少于iPhone</a><span style="color:gray">(2010-03-16 22:54)</span><br/>· <a href="http://news.cnblogs.com/n/58877/" target="_blank">星际争霸2破解进度：实现主机和客户端连接</a><span style="color:gray">(2010-03-16 22:43)</span><br/>· <a href="http://news.cnblogs.com/n/58876/" target="_blank">iPhone、WM、Symbian、Android移动开发前景分析</a><span style="color:gray">(2010-03-16 22:03)</span><br/>· <a href="http://news.cnblogs.com/n/58874/" target="_blank">搜狐旧将樊功臣全面接管搜狗 欲重振搜索业务</a><span style="color:gray">(2010-03-16 21:32)</span><br/>· <a href="http://news.cnblogs.com/n/58873/" target="_blank">腾讯昨推QQ会员官方店 全面向淘宝宣战</a><span style="color:gray">(2010-03-16 21:28)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/58848/" target="_blank">IT蚁族：蜗居和逃离</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Linux下网络传输测速程序小记</title><link>http://www.cnblogs.com/wayne1017/archive/2007/03/09/665931.html</link><dc:creator>肥猫</dc:creator><author>肥猫</author><pubDate>Thu, 08 Mar 2007 18:09:00 GMT</pubDate><guid>http://www.cnblogs.com/wayne1017/archive/2007/03/09/665931.html</guid><description><![CDATA[<p>阅读: 2071 评论: 0 作者: <a href="http://www.cnblogs.com/wayne1017/" target="_blank">肥猫</a> 发表于 2007-03-09 02:09 <a href="http://www.cnblogs.com/wayne1017/archive/2007/03/09/665931.html" target="_blank">原文链接</a></p><strong>一、题外话<br></strong><br><span style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近需要在linux下做一个网络测速的小程序，将服务端内存中缓存的一个大文件整个的从服务端发送到客户端，并缓存到客户端的内存中，以此抛开硬盘读取速度的影响，测量网络实际的传输速度。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 小程序分为一个服务端server和一个客户端client,网上有很多类似的示例程序，但多少都有问题，后面我会提到。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先，如果你是linux下编程的新手，需要看很多基础性的知识的话，建议你可以去这个网站看看，因为我也是新手，我的很多问题都是在这个论坛找到答案的</span><a title=linux286社区 href="http://www.linux286.com/"><span style="FONT-SIZE: 12pt">linux286社区<img src="http://www.cnblogs.com/CuteSoft_Client/CuteEditor/images/emthup.gif" align=absMiddle border=0></span></a><span style="FONT-SIZE: 12pt">但有一个缺点就是回答问题的高手很少，帖子倒是不少，而且有的质量还不错！<br></span><br><strong>二、基础知识</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 言归正传，先看一下Linux下的TCP/IP实现结构。如下图：<br>
<div style="FONT-SIZE: 12pt">
<div style="WIDTH: 606px; HEIGHT: 455px" align=center src_cetemp="http://www.cnblogs.com/images/cnblogs_com/wayne1017/TCPIP.JPG"><img style="WIDTH: 606px; HEIGHT: 455px" height=455 alt="" src="http://www.cnblogs.com/images/cnblogs_com/wayne1017/TCPIP.JPG" width=606></div>
<br>
<div style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Linux用一系列相互连接层的软件实现TCP/IP协议族，该套软件分为两个层次，分别为BSD套接字(BSD Socket)与INET套接字(INET Socket)。套接字是网络上运行的两个程序之间的双向通信链路中的端点，应用程序通过套接字使用通信链路提供的服务。每一个连接的两端都存在着一个套接字，实际上，套接字就是一个编程接口，为网络应用程序提供各种接口函数。下面是几个关于创建套接字的知识点，有助于理解：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、文件套接字和网络套接字，前者存在于套接字文件系统中，让用户以文件的方式访问网络连接；后者存在于系统底层，用户不能直接访问。但文件套接字与网络套接字一一对应，文件套接字的操作实际上就是由网络套接字完成的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、socket()函数用于在套接字文件系统中创建套接字文件，套接字文件的操作表为socket_file_ops，它指向文件套接字操作表(proto_ops，实际上是操作函数集合)。系统支持不同的文件套接字，就会提供不同的文件套接字操作表供套接字文件进行链接。系统支持多种网络协议时，也会提供多种网络套接字操作表(proto，实际上也是操作函数集合)，网络套接字指向特定的操作表，就表示支持特定的协议。由socket函数执行，将创建的套接字文件(文件套接字)与网络套接字链接起来，就完成了文件套接字的操作与具体协议操作的链接。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、文件套接字用socket结构描述，网络套接字用sock结构描述。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、套接字的协议族确定了对套接字的创建操作。套接字的类型确定了对文件套接字的操作。<br><br><strong>三、函数清单</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是一些常用的函数介绍：<br><span style="COLOR: #0000ff"><strong>socket</strong><br>int socket(int domain, int type,int protocol)</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; domain：说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等)。 AF_UNIX只能够用于单一的Unix系统进程间通信，而AF_INET是针对Internet的，因而可以允许在远程主机之间通信(当我们man socket时发现domain可选项是PF_*而不是AF_*，因为glibc是posix的实现所以用PF代替了AF，不过我们都可以使用的)。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type：我们网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等) SOCK_STREAM表明我们用的是TCP协议，这样会提供按顺序的，可靠、双向、面向连接的比特流。SOCK_DGRAM表明我们用的是UDP协议，这样只会提供定长的、不可靠、无连接的通信。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protocol：由于我们指定了type，所以这个地方我们一般只要用0来代替就可以了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; socket：为网络通讯做基本的准备。成功时返回文件描述符，失败时返回-1，看errno可知道出错的详细情况。<br><br><span style="COLOR: #0000ff"><strong>bind</strong><br>int bind(int sockfd, struct sockaddr *my_addr, int addrlen)</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sockfd：是由socket调用返回的文件描述符。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addrlen：是sockaddr结构的长度。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my_addr：是一个指向sockaddr的指针。sockaddr的定义<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct sockaddr{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unisgned short as_family;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char sa_data[14];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不过由于系统的兼容性，我们一般不用这个头文件，而使用另外一个结构(struct sockaddr_in) 来代替。sockaddr_in的定义<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct sockaddr_in{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned short sin_family;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned short int sin_port;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struct in_addr sin_addr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char sin_zero[8];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们主要使用Internet所以sin_family一般为AF_INET，sin_addr设置为INADDR_ANY表示可以和任何的主机通信，sin_port是我们要监听的端口号，sin_zero[8]是用来填充的。bind将本地的端口同socket返回的文件描述符捆绑在一起。成功是返回0，失败的情况和socket一样。<br><br><span style="COLOR: #0000ff"><strong>listen</strong><br>int listen(int sockfd,int backlog)</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sockfd：是bind后的文件描述符。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; backlog：设置请求排队的最大长度。当有多个客户端程序和服务端相连时，使用这个表示可以介绍的排队长度。listen函数将bind的文件描述符变为监听套接字。返回的情况和bind一样。<br><br><span style="COLOR: #0000ff"><strong>accept</strong><br>int accept(int sockfd, struct sockaddr *addr,int *addrlen)<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sockfd：是listen后的文件描述符。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addr，addrlen是用来给客户端的程序填写的，服务器端只要传递指针就可以了。 bind，listen和accept是服务器端用的函数，accept调用时，服务器端的程序会一直阻塞到有一个客户程序发出了连接。 accept成功时返回最后的服务器端的文件描述符，这个时候服务器端可以向该描述符写信息了。失败时返回-1。<br><br><span style="COLOR: #0000ff"><strong>connect<br></strong>int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sockfd：socket返回的文件描述符.。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serv_addr:：储存了服务器端的连接信息，其中sin_add是服务端的地址。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addrlen：serv_addr的长度。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connect函数是客户端用来同服务端连接的。成功时返回0，sockfd是同服务端通讯的文件描述符失败时返回-1。<br><br><strong>四、示例代码<br></strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 光说不练假把式，下面就是我的程序的代码，分为server.c，client.c两个文件，为了简单化，这里的服务端只同一个客户端建立连接，故没有用很多地方的while(1)循环来不停的监听客户端的建立连接，程序里面的很多代码都是从网上拿下来直接用的，方便:-)<br><br><span style="COLOR: #ff0000">服务器端代码：server.c<br></span>
<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 id=Code_Closed_Image_032254 onclick="this.style.display='none'; Code_Closed_Text_032254.style.display='none'; Code_Open_Image_032254.style.display='inline'; Code_Open_Text_032254.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_032254 style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_032254.style.display='none'; Code_Closed_Image_032254.style.display='inline'; Code_Closed_Text_032254.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_032254 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Code_Open_Text_032254 style="DISPLAY: none"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img id=Codehighlighter1_0_307_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_307_Open_Text.style.display='none'; Codehighlighter1_0_307_Closed_Image.style.display='inline'; Codehighlighter1_0_307_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_0_307_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_307_Closed_Text.style.display='none'; Codehighlighter1_0_307_Open_Image.style.display='inline'; Codehighlighter1_0_307_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span id=Codehighlighter1_0_307_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">/**/</span><span id=Codehighlighter1_0_307_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">***********************************************************************<br><img src="http://www.cnblogs.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;Linux下网络编程，服务端程序代码&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.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;&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;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;&nbsp;&nbsp;&nbsp;./server&nbsp;PORTNUMBER&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;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;&nbsp;&nbsp;&nbsp;(其中PORTNUMBER是服务端用于监听的端口)&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;<br><img src="http://www.cnblogs.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;&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;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*@author&nbsp;wayne&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>***********************************************************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdlib.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">errno.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">netdb.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ctype.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.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.cnblogs.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.cnblogs.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">socket.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">netinet</span><span style="COLOR: #000000">/</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.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">time.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_539_1008_Open_Image onclick="this.style.display='none'; Codehighlighter1_539_1008_Open_Text.style.display='none'; Codehighlighter1_539_1008_Closed_Image.style.display='inline'; Codehighlighter1_539_1008_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_539_1008_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_539_1008_Closed_Text.style.display='none'; Codehighlighter1_539_1008_Open_Image.style.display='inline'; Codehighlighter1_539_1008_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_539_1008_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">/**/</span><span id=Codehighlighter1_539_1008_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">***********************************************************************<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*用这个my_write()函数代替本来的write()函数原因有以下几点：<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*ssize_t&nbsp;write(int&nbsp;fd,const&nbsp;void&nbsp;*buf,size_t&nbsp;nbytes)<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*write函数将buf中的nbytes字节内容写入文件描述符fd，成功时返回写的字节数，失败时返回-1，&nbsp;并设置errno变量。<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*在网络程序中,向套接字文件描述符进行写操作时有两种可能：<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;&nbsp;&nbsp;&nbsp;1)write的返回值大于0，表示写了部分或者是全部的数据。<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;&nbsp;&nbsp;&nbsp;2)返回的值小于0，此时出现了错误。我们要根据错误类型来处理。<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果错误为EINTR表示在写的时候出现了中断错误。<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果为EPIPE表示网络连接出现了问题(对方已经关闭了连接)。<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>***********************************************************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;my_write(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;fd,</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buffer,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;length)<br><img id=Codehighlighter1_1057_1459_Open_Image onclick="this.style.display='none'; Codehighlighter1_1057_1459_Open_Text.style.display='none'; Codehighlighter1_1057_1459_Closed_Image.style.display='inline'; Codehighlighter1_1057_1459_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1057_1459_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1057_1459_Closed_Text.style.display='none'; Codehighlighter1_1057_1459_Open_Image.style.display='inline'; Codehighlighter1_1057_1459_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_1057_1459_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1057_1459_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;bytes_left;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">尚未写的文件大小</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;written_bytes;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">已经写的文件大小</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">ptr;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ptr</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">buffer;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;bytes_left</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">length;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(bytes_left</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_1186_1445_Open_Image onclick="this.style.display='none'; Codehighlighter1_1186_1445_Open_Text.style.display='none'; Codehighlighter1_1186_1445_Closed_Image.style.display='inline'; Codehighlighter1_1186_1445_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1186_1445_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1186_1445_Closed_Text.style.display='none'; Codehighlighter1_1186_1445_Open_Image.style.display='inline'; Codehighlighter1_1186_1445_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1186_1445_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1186_1445_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">开始写</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;written_bytes</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">write(fd,ptr,bytes_left);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">出现了写错误</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(written_bytes</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_1274_1376_Open_Image onclick="this.style.display='none'; Codehighlighter1_1274_1376_Open_Text.style.display='none'; Codehighlighter1_1274_1376_Closed_Image.style.display='inline'; Codehighlighter1_1274_1376_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1274_1376_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1274_1376_Closed_Text.style.display='none'; Codehighlighter1_1274_1376_Open_Image.style.display='inline'; Codehighlighter1_1274_1376_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1274_1376_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1274_1376_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">中断错误，置零重新写</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(errno</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">EINTR)<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;written_bytes</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">其他错误，退出不写了</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&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.cnblogs.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">return</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.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.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从剩下的地方继续写</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes_left</span><span style="COLOR: #000000">-=</span><span style="COLOR: #000000">written_bytes;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">written_bytes;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br><img id=Codehighlighter1_1495_4641_Open_Image onclick="this.style.display='none'; Codehighlighter1_1495_4641_Open_Text.style.display='none'; Codehighlighter1_1495_4641_Closed_Image.style.display='inline'; Codehighlighter1_1495_4641_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1495_4641_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1495_4641_Closed_Text.style.display='none'; Codehighlighter1_1495_4641_Open_Image.style.display='inline'; Codehighlighter1_1495_4641_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_1495_4641_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1495_4641_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sockfd,new_fd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">监听套接字、连接套接字</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;sockaddr_in&nbsp;server_addr;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">服务器地址结构</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;sockaddr_in&nbsp;client_addr;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">客户端地址结构</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sin_size,portnumber;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">地址长度、端口</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;FILE&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">fp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">文件指针</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;nfilesize;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">文件大小</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp; </span><span style="COLOR: #000000">str[128];&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">文件名</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;yes</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">Y</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">流程控制</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;timeval&nbsp;tpstart,tpend;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">用于记录文件传输时间</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;&nbsp;timeuse;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">文件传输所用时间<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在用户没有输入端口号或者端口号输入不正确时，提示用户输入正确的端口号<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">判断输入参数是否为2个，即./server&nbsp;PORTNUMBER是否有PORTNUMBER这个参数</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(argc</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_1921_1990_Open_Image onclick="this.style.display='none'; Codehighlighter1_1921_1990_Open_Text.style.display='none'; Codehighlighter1_1921_1990_Closed_Image.style.display='inline'; Codehighlighter1_1921_1990_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1921_1990_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1921_1990_Closed_Text.style.display='none'; Codehighlighter1_1921_1990_Open_Image.style.display='inline'; Codehighlighter1_1921_1990_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1921_1990_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1921_1990_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Usage:%s&nbsp;portnumber\a\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,argv[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">判断端口号是否合法</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((portnumber</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">atoi(argv[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]))</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_2043_2112_Open_Image onclick="this.style.display='none'; Codehighlighter1_2043_2112_Open_Text.style.display='none'; Codehighlighter1_2043_2112_Closed_Image.style.display='inline'; Codehighlighter1_2043_2112_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2043_2112_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2043_2112_Closed_Text.style.display='none'; Codehighlighter1_2043_2112_Open_Image.style.display='inline'; Codehighlighter1_2043_2112_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_2043_2112_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_2043_2112_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Usage:%s&nbsp;portnumber\a\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,argv[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">服务器端开始建立socket描述符</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((sockfd</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">socket(AF_INET,SOCK_STREAM,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">))</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;&nbsp;<br><img id=Codehighlighter1_2188_2261_Open_Image onclick="this.style.display='none'; Codehighlighter1_2188_2261_Open_Text.style.display='none'; Codehighlighter1_2188_2261_Closed_Image.style.display='inline'; Codehighlighter1_2188_2261_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2188_2261_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2188_2261_Closed_Text.style.display='none'; Codehighlighter1_2188_2261_Open_Image.style.display='inline'; Codehighlighter1_2188_2261_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_2188_2261_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_2188_2261_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Socket&nbsp;error:%s\n\a</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,strerror(errno));<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">服务器端填充&nbsp;sockaddr结构</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;bzero(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">server_addr,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;sockaddr_in));<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;server_addr.sin_family</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">AF_INET;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;server_addr.sin_addr.s_addr</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">htonl(INADDR_ANY);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;server_addr.sin_port</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">htons(portnumber);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">捆绑sockfd描述符，服务器绑定地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(bind(sockfd,(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;sockaddr&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">server_addr),</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;sockaddr))</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_2565_2636_Open_Image onclick="this.style.display='none'; Codehighlighter1_2565_2636_Open_Text.style.display='none'; Codehighlighter1_2565_2636_Closed_Image.style.display='inline'; Codehighlighter1_2565_2636_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2565_2636_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2565_2636_Closed_Text.style.display='none'; Codehighlighter1_2565_2636_Open_Image.style.display='inline'; Codehighlighter1_2565_2636_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_2565_2636_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_2565_2636_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Bind&nbsp;error:%s\n\a</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,strerror(errno));<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">监听sockfd描述符，服务器执行监听操作，将套接字转换为监听套接字&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(listen(sockfd,</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_2707_2780_Open_Image onclick="this.style.display='none'; Codehighlighter1_2707_2780_Open_Text.style.display='none'; Codehighlighter1_2707_2780_Closed_Image.style.display='inline'; Codehighlighter1_2707_2780_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2707_2780_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2707_2780_Closed_Text.style.display='none'; Codehighlighter1_2707_2780_Open_Image.style.display='inline'; Codehighlighter1_2707_2780_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_2707_2780_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_2707_2780_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Listen&nbsp;error:%s\n\a</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,strerror(errno));<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">服务器不断的接受连接并进行处理<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">while(1)<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">服务器调用函数接受连接，服务器调用函数后进入阻塞状态,直到客户程序建立连接</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sin_size</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;sockaddr_in);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">接受连接后产生新的通信套接字，监听套接字继续处于监听状态</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((new_fd</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">accept(sockfd,(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;sockaddr&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">client_addr),</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">sin_size))</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_3015_3091_Open_Image onclick="this.style.display='none'; Codehighlighter1_3015_3091_Open_Text.style.display='none'; Codehighlighter1_3015_3091_Closed_Image.style.display='inline'; Codehighlighter1_3015_3091_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_3015_3091_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3015_3091_Closed_Text.style.display='none'; Codehighlighter1_3015_3091_Open_Image.style.display='inline'; Codehighlighter1_3015_3091_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_3015_3091_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_3015_3091_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Accept&nbsp;error:%s\n\a</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,strerror(errno));<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cnblogs.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.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">显示客户端的IP地址</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Server&nbsp;get&nbsp;connection&nbsp;from&nbsp;%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,inet_ntoa(client_addr.sin_addr));<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(toupper(yes)</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">Y</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_3219_4506_Open_Image onclick="this.style.display='none'; Codehighlighter1_3219_4506_Open_Text.style.display='none'; Codehighlighter1_3219_4506_Closed_Image.style.display='inline'; Codehighlighter1_3219_4506_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_3219_4506_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3219_4506_Closed_Text.style.display='none'; Codehighlighter1_3219_4506_Open_Image.style.display='inline'; Codehighlighter1_3219_4506_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_3219_4506_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_3219_4506_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">提示用户输入文件路径</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Please&nbsp;input&nbsp;the&nbsp;file&nbsp;location:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,str);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;((fp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">fopen(str,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">r</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)<br><img id=Codehighlighter1_3343_3485_Open_Image onclick="this.style.display='none'; Codehighlighter1_3343_3485_Open_Text.style.display='none'; Codehighlighter1_3343_3485_Closed_Image.style.display='inline'; Codehighlighter1_3343_3485_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_3343_3485_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3343_3485_Closed_Text.style.display='none'; Codehighlighter1_3343_3485_Open_Image.style.display='inline'; Codehighlighter1_3343_3485_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_3343_3485_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_3343_3485_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">File&nbsp;open&nbsp;error,Retry!\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.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">Please&nbsp;input&nbsp;the&nbsp;file&nbsp;location:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,str);<br><img src="http://www.cnblogs.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;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">exit(1);</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取打开的文件的大小，并将文件整个读入内存中</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fseek(fp,</span><span style="COLOR: #000000">0L</span><span style="COLOR: #000000">,SEEK_END);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfilesize</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">ftell(fp);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)malloc(nfilesize);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fread(p,nfilesize,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,fp);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将要传输的文件的大小信息发送给客户端</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(my_write(new_fd,(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nfilesize,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_3727_3802_Open_Image onclick="this.style.display='none'; Codehighlighter1_3727_3802_Open_Text.style.display='none'; Codehighlighter1_3727_3802_Closed_Image.style.display='inline'; Codehighlighter1_3727_3802_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_3727_3802_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3727_3802_Closed_Text.style.display='none'; Codehighlighter1_3727_3802_Open_Image.style.display='inline'; Codehighlighter1_3727_3802_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_3727_3802_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_3727_3802_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Write&nbsp;Error:%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,strerror(errno));<br><img src="http://www.cnblogs.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.cnblogs.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><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Begin&nbsp;to&nbsp;transfer&nbsp;the&nbsp;file!\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取传输初始时间</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gettimeofday(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">tpstart,NULL);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">传输文件</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(my_write(new_fd,p,nfilesize)</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_3972_4030_Open_Image onclick="this.style.display='none'; Codehighlighter1_3972_4030_Open_Text.style.display='none'; Codehighlighter1_3972_4030_Closed_Image.style.display='inline'; Codehighlighter1_3972_4030_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_3972_4030_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3972_4030_Closed_Text.style.display='none'; Codehighlighter1_3972_4030_Open_Image.style.display='inline'; Codehighlighter1_3972_4030_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_3972_4030_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_3972_4030_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Transfer&nbsp;failed!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.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.cnblogs.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><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获取传输结束时间</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gettimeofday(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">tpend,NULL);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">计算整个传输用时</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeuse</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1000000</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(tpend.tv_sec</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">tpstart.tv_sec)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">(tpend.tv_usec</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">tpstart.tv_usec);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeuse</span><span style="COLOR: #000000">/=</span><span style="COLOR: #000000">1000000</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Transfer&nbsp;Succeed!\nFile&nbsp;Name:&nbsp;%s\nFile&nbsp;Size:&nbsp;%d&nbsp;bytes\nTotal&nbsp;Time:&nbsp;%f&nbsp;seconds\nTransfer&nbsp;Speed:&nbsp;%f&nbsp;bytes/second</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,str,nfilesize,timeuse,((</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">)nfilesize)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">timeuse);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(p);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">释放文件内存</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">关闭文件</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\nTransfer&nbsp;another&nbsp;file?(Y/N):&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%c</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">yes);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br><img src="http://www.cnblogs.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.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这个通讯已经结束，关闭通信套接字，结束本次连接的操作</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(new_fd);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">循环下一个&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">}</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;close(sockfd);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">关闭监听套接字</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Server&nbsp;Exit!~~\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></span></div>
<br><span style="COLOR: #ff0000">客户端代码：client.c<br></span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>
<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 id=Code_Closed_Image_032316 onclick="this.style.display='none'; Code_Closed_Text_032316.style.display='none'; Code_Open_Image_032316.style.display='inline'; Code_Open_Text_032316.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_032316 style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_032316.style.display='none'; Code_Closed_Image_032316.style.display='inline'; Code_Closed_Text_032316.style.display='inline';" height=16 src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_032316 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Code_Open_Text_032316 style="DISPLAY: none"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><img id=Codehighlighter1_0_326_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_326_Open_Text.style.display='none'; Codehighlighter1_0_326_Closed_Image.style.display='inline'; Codehighlighter1_0_326_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_0_326_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_326_Closed_Text.style.display='none'; Codehighlighter1_0_326_Open_Image.style.display='inline'; Codehighlighter1_0_326_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span id=Codehighlighter1_0_326_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">/**/</span><span id=Codehighlighter1_0_326_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">***********************************************************************<br><img src="http://www.cnblogs.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;Linux下网络编程，客户端程序代码&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.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;&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;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;&nbsp;&nbsp;&nbsp;./client&nbsp;IPADDRESS&nbsp;PORTNUMBER&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;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;&nbsp;&nbsp;&nbsp;(其中IPADDRESS是服务端IP地址，PORTNUMBER是服务端用于监听的端口)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.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;&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;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*@author&nbsp;wayne&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>***********************************************************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdlib.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">errno.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">netdb.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ctype.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.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.cnblogs.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.cnblogs.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">socket.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">netinet</span><span style="COLOR: #000000">/</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_537_913_Open_Image onclick="this.style.display='none'; Codehighlighter1_537_913_Open_Text.style.display='none'; Codehighlighter1_537_913_Closed_Image.style.display='inline'; Codehighlighter1_537_913_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_537_913_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_537_913_Closed_Text.style.display='none'; Codehighlighter1_537_913_Open_Image.style.display='inline'; Codehighlighter1_537_913_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_537_913_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">/**/</span><span id=Codehighlighter1_537_913_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">***********************************************************************<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*用这个my_read()函数代替本来的read()函数原因有以下几点：<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*ssize_t&nbsp;read(int&nbsp;fd,void&nbsp;*buf,size_t&nbsp;nbyte)<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*read函数是负责从fd中读取内容。当读成功时，read返回实际所读的字节数；如果<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*返回的值是0，表示已经读到文件的结束了；小于0表示出现了错误。<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;&nbsp;&nbsp;&nbsp;1)如果错误为EINTR说明read出错是由中断引起的，继续读。<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;&nbsp;&nbsp;&nbsp;2)如果是ECONNREST表示网络连接出了问题，停止读取。<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>***********************************************************************</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;my_read(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;fd,</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buffer,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;length)<br><img id=Codehighlighter1_960_1457_Open_Image onclick="this.style.display='none'; Codehighlighter1_960_1457_Open_Text.style.display='none'; Codehighlighter1_960_1457_Closed_Image.style.display='inline'; Codehighlighter1_960_1457_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_960_1457_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_960_1457_Closed_Text.style.display='none'; Codehighlighter1_960_1457_Open_Image.style.display='inline'; Codehighlighter1_960_1457_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_960_1457_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_960_1457_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;bytes_left;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">尚未读取的文件大小</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;bytes_read;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">已经读取的文件大小</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">ptr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ptr</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">buffer;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;bytes_left</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">length;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(bytes_left</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_1092_1407_Open_Image onclick="this.style.display='none'; Codehighlighter1_1092_1407_Open_Text.style.display='none'; Codehighlighter1_1092_1407_Closed_Image.style.display='inline'; Codehighlighter1_1092_1407_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1092_1407_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1092_1407_Closed_Text.style.display='none'; Codehighlighter1_1092_1407_Open_Image.style.display='inline'; Codehighlighter1_1092_1407_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1092_1407_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1092_1407_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">开始读</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes_read</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">read(fd,ptr,bytes_left);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">出现了读取错误</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(bytes_read</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_1173_1278_Open_Image onclick="this.style.display='none'; Codehighlighter1_1173_1278_Open_Text.style.display='none'; Codehighlighter1_1173_1278_Closed_Image.style.display='inline'; Codehighlighter1_1173_1278_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1173_1278_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1173_1278_Closed_Text.style.display='none'; Codehighlighter1_1173_1278_Open_Image.style.display='inline'; Codehighlighter1_1173_1278_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1173_1278_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1173_1278_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">错误类型是EINTR，重新读</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(errno</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">EINTR)<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes_read</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">其他类型的错误，退出不读了</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&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 src="http://www.cnblogs.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">return</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.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.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">文件读取结束了，退出循环</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&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">(bytes_read</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">计算新的剩余量，同时移动buffer指针，继续读</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes_left</span><span style="COLOR: #000000">-=</span><span style="COLOR: #000000">bytes_read;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">bytes_read;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">返回值与read()函数保持一致</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(length</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">bytes_left);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">argv[])<br><img id=Codehighlighter1_1493_3562_Open_Image onclick="this.style.display='none'; Codehighlighter1_1493_3562_Open_Text.style.display='none'; Codehighlighter1_1493_3562_Closed_Image.style.display='inline'; Codehighlighter1_1493_3562_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_1493_3562_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1493_3562_Closed_Text.style.display='none'; Codehighlighter1_1493_3562_Open_Image.style.display='inline'; Codehighlighter1_1493_3562_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_1493_3562_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1493_3562_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sockfd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">通信套接字描述符</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buffer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">缓冲区</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;sockaddr_in&nbsp;server_addr;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">服务器地址结构</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;hostent&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">host;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">主机地址与名称信息结构</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;portnumber,nbytes;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">端口号、字节数</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;FILE&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">fp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">文件指针</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;nfilesize;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">文件大小</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;yes</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">Y</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">流程控制<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">提示用户输入完整的命令行参数</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(argc</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_1765_1843_Open_Image onclick="this.style.display='none'; Codehighlighter1_1765_1843_Open_Text.style.display='none'; Codehighlighter1_1765_1843_Closed_Image.style.display='inline'; Codehighlighter1_1765_1843_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1765_1843_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1765_1843_Closed_Text.style.display='none'; Codehighlighter1_1765_1843_Open_Image.style.display='inline'; Codehighlighter1_1765_1843_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1765_1843_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1765_1843_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Usage:%s&nbsp;hostname&nbsp;portnumber\a\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,argv[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果利用用户输入的域名无法获得正确的主机地址信息，则退出</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">((host</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">gethostbyname(argv[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]))</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)<br><img id=Codehighlighter1_1921_1977_Open_Image onclick="this.style.display='none'; Codehighlighter1_1921_1977_Open_Text.style.display='none'; Codehighlighter1_1921_1977_Closed_Image.style.display='inline'; Codehighlighter1_1921_1977_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1921_1977_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1921_1977_Closed_Text.style.display='none'; Codehighlighter1_1921_1977_Open_Image.style.display='inline'; Codehighlighter1_1921_1977_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1921_1977_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1921_1977_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Gethostname&nbsp;error\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果用户输入的端口不正确，则提示并退出</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">((portnumber</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">atoi(argv[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]))</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_2038_2116_Open_Image onclick="this.style.display='none'; Codehighlighter1_2038_2116_Open_Text.style.display='none'; Codehighlighter1_2038_2116_Closed_Image.style.display='inline'; Codehighlighter1_2038_2116_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2038_2116_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2038_2116_Closed_Text.style.display='none'; Codehighlighter1_2038_2116_Open_Image.style.display='inline'; Codehighlighter1_2038_2116_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_2038_2116_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_2038_2116_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Usage:%s&nbsp;hostname&nbsp;portnumber\a\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,argv[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">客户程序开始建立&nbsp;sockfd描述符，创建通信套接字</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">((sockfd</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">socket(AF_INET,SOCK_STREAM,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">))</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_2199_2272_Open_Image onclick="this.style.display='none'; Codehighlighter1_2199_2272_Open_Text.style.display='none'; Codehighlighter1_2199_2272_Closed_Image.style.display='inline'; Codehighlighter1_2199_2272_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2199_2272_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2199_2272_Closed_Text.style.display='none'; Codehighlighter1_2199_2272_Open_Image.style.display='inline'; Codehighlighter1_2199_2272_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_2199_2272_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_2199_2272_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Socket&nbsp;Error:%s\a\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,strerror(errno));<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">客户程序填充服务端的地址信息</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;bzero(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">server_addr,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(server_addr));<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;server_addr.sin_family</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">AF_INET;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;server_addr.sin_port</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">htons(portnumber);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;server_addr.sin_addr</span><span style="COLOR: #000000">=*</span><span style="COLOR: #000000">((</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;in_addr&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)host</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">h_addr);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">客户程序发起连接请求&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(connect(sockfd,(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;sockaddr&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">server_addr),</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;sockaddr))</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_2568_2642_Open_Image onclick="this.style.display='none'; Codehighlighter1_2568_2642_Open_Text.style.display='none'; Codehighlighter1_2568_2642_Closed_Image.style.display='inline'; Codehighlighter1_2568_2642_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2568_2642_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2568_2642_Closed_Text.style.display='none'; Codehighlighter1_2568_2642_Open_Image.style.display='inline'; Codehighlighter1_2568_2642_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_2568_2642_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_2568_2642_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Connect&nbsp;Error:%s\a\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,strerror(errno));<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Connection&nbsp;Succeed!\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(toupper(yes)</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">Y</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_2707_3484_Open_Image onclick="this.style.display='none'; Codehighlighter1_2707_3484_Open_Text.style.display='none'; Codehighlighter1_2707_3484_Closed_Image.style.display='inline'; Codehighlighter1_2707_3484_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2707_3484_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2707_3484_Closed_Text.style.display='none'; Codehighlighter1_2707_3484_Open_Image.style.display='inline'; Codehighlighter1_2707_3484_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_2707_3484_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_2707_3484_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">读取服务端发送的文件大小信息</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">((nbytes</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">my_read(sockfd,(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)buffer,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">))</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_2782_2853_Open_Image onclick="this.style.display='none'; Codehighlighter1_2782_2853_Open_Text.style.display='none'; Codehighlighter1_2782_2853_Closed_Image.style.display='inline'; Codehighlighter1_2782_2853_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2782_2853_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2782_2853_Closed_Text.style.display='none'; Codehighlighter1_2782_2853_Open_Image.style.display='inline'; Codehighlighter1_2782_2853_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_2782_2853_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_2782_2853_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Read&nbsp;Error:%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,strerror(errno));<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cnblogs.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.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfilesize</span><span style="COLOR: #000000">=*</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)buffer;<br><img src="http://www.cnblogs.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">Initial&nbsp;parameters:&nbsp;&nbsp;&nbsp;\nFileSize:%d&nbsp;bytes\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,nfilesize);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">打开文件</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((fp</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">fopen(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/home/dbrg/receive</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">w</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)<br><img id=Codehighlighter1_3015_3073_Open_Image onclick="this.style.display='none'; Codehighlighter1_3015_3073_Open_Text.style.display='none'; Codehighlighter1_3015_3073_Closed_Image.style.display='inline'; Codehighlighter1_3015_3073_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_3015_3073_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3015_3073_Closed_Text.style.display='none'; Codehighlighter1_3015_3073_Open_Image.style.display='inline'; Codehighlighter1_3015_3073_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_3015_3073_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_3015_3073_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">File&nbsp;open&nbsp;error!\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cnblogs.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.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将服务端发送的文件缓冲到内存中</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)malloc(nfilesize);<br><img src="http://www.cnblogs.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;((nbytes</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">my_read(sockfd,p,nfilesize))</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_3183_3254_Open_Image onclick="this.style.display='none'; Codehighlighter1_3183_3254_Open_Text.style.display='none'; Codehighlighter1_3183_3254_Closed_Image.style.display='inline'; Codehighlighter1_3183_3254_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_3183_3254_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_3183_3254_Closed_Text.style.display='none'; Codehighlighter1_3183_3254_Open_Image.style.display='inline'; Codehighlighter1_3183_3254_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_3183_3254_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.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_3183_3254_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Read&nbsp;Error:%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,strerror(errno));<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&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.cnblogs.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.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将内存中的内容写入文件中</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(p,nfilesize,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,fp);&nbsp;&nbsp;&nbsp;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.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">Transfer&nbsp;Succeed!Recived&nbsp;file&nbsp;size&nbsp;:&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,nbytes);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(p);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">释放内存</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">关闭文件</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Receive&nbsp;another&nbsp;file?(Y/N):&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%c</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">yes);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">结束通讯，关闭套接字，关闭连接</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;close(sockfd);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Client&nbsp;Exit!~~\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></span></div>
</div>
<div style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以在一台机器上实验，也可以在不同的机器上实验。首先运行server，再运行client，不妨假定端口为8888<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;./server 8888
<div style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ./client 202.197.18.73 8888<br><br><strong>五、CODING过程中遇到的问题及解决<br></strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、server_addr.sin_addr=*((struct in_addr *)host-&gt;h_addr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这句话刚开始一直报错：提领指向不完全类型的指针<br>可是对照书本开其中host对应的struct hostent怎么也不能发现问题，最后才在网上发现，原来是少include一个头文件netdb.h编译通过:)<br></div>
<div style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、关于客户端参数的问题<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开始的时候，由于第1个问题不知道是少头文件造成的，我就将程序改成了客户端输入的第二个参数直接就是IP地址。在server和client运行在同一台电脑上的时候是没有问题的，但是当server是一台机器，client又是另一台机器的时候，发现无法建立连接了。</div>
<div style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在将第1个问题解决了以后，即客户端的第二个参数可以直接输入服务端机器名的时候，在本机上输入机器名运行是OK的。但是将client放在另一台机器上的时候发现，客户端第二个参数输入机器名是无法建立连接的，输入IP地址反而可以建立连接。</div>
<div style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在还不太清楚问题所在！<br></div>
<div style="FONT-SIZE: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、关于文件传输的问题<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当传送一个小文件的时候，不管是在同一台机器还是不同的机器，都没有问题。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当传送一个大文件的时候，不管是在同一台机器还是不同的机器，都不行。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最终搞定了。问题出在write和read这两个函数上。如果直接用的话，由于在网络写数据的过程中有可能是由于中断导致传输出错的。因此用了两个重写的写和读的函数，用于在中断后继续传输。<br><br><strong>六、套接字编程中的5个隐患</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #ff0000">1、忽略返回状态</span>
<p style="FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一个隐患很明显，但它是开发新手最容易犯的一个错误。如果您忽略函数的返回状态，当它们失败或部分成功的时候，您也许会迷失。反过来，这可能传播错误，使定位问题的源头变得困难。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 捕获并检查每一个返回状态，而不是忽略它们。考虑清单 1 显示的例子，一个套接字 send 函数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 清单 1. 忽略 API 函数返回状态<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int status, sock, mode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Create a new stream (TCP) socket */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock = socket( AF_INET, SOCK_STREAM, 0 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status = send( sock, buffer, buflen, MSG_DONTWAIT );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (status == -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* send failed */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf( "send failed: %s\n", strerror(errno) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* send succeeded -- or did it? */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;清单 1 探究一个函数片断，它完成套接字 send 操作（通过套接字发送数据）。函数的错误状态被捕获并测试，但这个例子忽略了 send 在无阻塞模式（由 MSG_DONTWAIT 标志启用）下的一个特性。<br>send API 函数有三类可能的返回值：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果数据成功地排到传输队列，则返回 0。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果排队失败，则返回 -1（通过使用 errno 变量可以了解失败的原因）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果不是所有的字符都能够在函数调用时排队，则最终的返回值是发送的字符数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于 send 的 MSG_DONTWAIT 变量的无阻塞性质，函数调用在发送完所有的数据、一些数据或没有发送任何数据后返回。在这里忽略返回状态将导致不完全的发送和随后的数据丢失。</p>
<p style="FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff0000">2、对等套接字闭包</span></p>
<p style="FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UNIX 有趣的一面是您几乎可以把任何东西看成是一个文件。文件本身、目录、管道、设备和套接字都被当作文件。这是新颖的抽象，意味着一整套的 API 可以用在广泛的设备类型上。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;考虑 read API 函数，它从文件读取一定数量的字节。read 函数返回读取的字节数（最高为您指定的最大值）；或者 -1，表示错误；或者 0，如果已经到达文件末尾。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果在一个套接字上完成一个 read 操作并得到一个为 0 的返回值，这表明远程套接字端的对等层调用了 close API 方法。该指示与文件读取相同 —— 没有多余的数据可以通过描述符读取（参见清单 2）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;清单 2．适当处理 read API 函数的返回值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int sock, status;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock = socket( AF_INET, SOCK_STREAM, 0 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status = read( sock, buffer, buflen );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (status &gt; 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Data read from the socket */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else if (status == -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Error, check errno, take action... */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else if (status == 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Peer closed the socket, finish the close */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close( sock );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Further processing... */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同样，可以用 write API 函数来探测对等套接字的闭包。在这种情况下，接收 SIGPIPE 信号，或如果该信号阻塞，write 函数将返回 -1 并设置 errno 为 EPIPE。</p>
<p style="FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff0000">3、地址使用错误</span></p>
<p style="FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;您可以使用 bind API 函数来绑定一个地址（一个接口和一个端口）到一个套接字端点。可以在服务器设置中使用这个函数，以便限制可能有连接到来的接口。也可以在客户端设置中使用这个函数，以便限制应当供出去的连接所使用的接口。bind 最常见的用法是关联端口号和服务器，并使用通配符地址（INADDR_ANY），它允许任何接口为到来的连接所使用。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind 普遍遭遇的问题是试图绑定一个已经在使用的端口。该陷阱是也许没有活动的套接字存在，但仍然禁止绑定端口（bind 返回 EADDRINUSE），它由 TCP 套接字状态 TIME_WAIT 引起。该状态在套接字关闭后约保留 2 到 4 分钟。在 TIME_WAIT 状态退出之后，套接字被删除，该地址才能被重新绑定而不出问题。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;等待 TIME_WAIT 结束可能是令人恼火的一件事，特别是如果您正在开发一个套接字服务器，就需要停止服务器来做一些改动，然后重启。幸运的是，有方法可以避开 TIME_WAIT 状态。可以给套接字应用 SO_REUSEADDR 套接字选项，以便端口可以马上重用。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;考虑清单 3 的例子。在绑定地址之前，我以 SO_REUSEADDR 选项调用 setsockopt。为了允许地址重用，我设置整型参数（on）为 1 （不然，可以设为 0 来禁止地址重用）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;清单 3．使用 SO_REUSEADDR 套接字选项避免地址使用错误<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int sock, ret, on;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct sockaddr_in servaddr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Create a new stream (TCP) socket */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sock = socket( AF_INET, SOCK_STREAM, 0 ):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Enable address reuse */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;on = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &amp;on, sizeof(on) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Allow connections to port 8080 from any available interface */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset( &amp;servaddr, 0, sizeof(servaddr) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servaddr.sin_family = AF_INET;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servaddr.sin_addr.s_addr = htonl( INADDR_ANY );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servaddr.sin_port = htons( 45000 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Bind to the address (interface/port) */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret = bind( sock, (struct sockaddr *)&amp;servaddr, sizeof(servaddr) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在应用了 SO_REUSEADDR 选项之后，bind API 函数将允许地址的立即重用。</p>
<p style="FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff0000">4、发送结构化数据</span></p>
<p style="FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;套接字是发送无结构二进制字节流或 ASCII 数据流（比如 HTTP 上的 HTTP 页面，或 SMTP 上的电子邮件）的完美工具。但是如果试图在一个套接字上发送二进制数据，事情将会变得更加复杂。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;比如说，您想要发送一个整数：您可以肯定，接收者将使用同样的方式来解释该整数吗？运行在同一架构上的应用程序可以依赖它们共同的平台来对该类型的数据做出相同的解释。但是，如果一个运行在高位优先的 IBM PowerPC 上的客户端发送一个 32 位的整数到一个低位优先的 Intel x86，那将会发生什么呢？字节排列将引起不正确的解释。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通过套接字发送一个 C 结构会怎么样呢？这里，也会遇到麻烦，因为不是所有的编译器都以相同的方式排列一个结构的元素。结构也可能被压缩以便使浪费的空间最少，这进一步使结构中的元素错位。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;幸好，有解决这个问题的方案，能够保证两端数据的一致解释。过去，远程过程调用（Remote Procedure Call，RPC）套装工具提供所谓的外部数据表示（External Data Representation，XDR）。XDR 为数据定义一个标准的表示来支持异构网络应用程序通信的开发。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在，有两个新的协议提供相似的功能。可扩展标记语言/远程过程调用（XML/RPC）以 XML 格式安排 HTTP 上的过程调用。数据和元数据用 XML 进行编码并作为字符串传输，并通过主机架构把值和它们的物理表示分开。SOAP 跟随 XML-RPC，以更好的特性和功能扩展了它的思想。参见 参考资料 小节，获取更多关于每个协议的信息。</p>
<p style="FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff0000">5、TCP中的帧同步假定</span></p>
<p style="FONT-SIZE: 12pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCP 不提供帧同步，这使得它对于面向字节流的协议是完美的。这是 TCP 与 UDP（User Datagram Protocol，用户数据报协议）的一个重要区别。UDP 是面向消息的协议，它保留发送者和接收者之间的消息边界。TCP 是一个面向流的协议，它假定正在通信的数据是无结构的，如图 1 所示。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图 1．UDP 的帧同步能力和缺乏帧同步的TCP<br>
<div style="FONT-SIZE: 12pt" align=center src_cetemp="/images/cnblogs_com/wayne1017/UDPTCP.PNG"><img height=529 alt="" src="http://www.cnblogs.com/images/cnblogs_com/wayne1017/UDPTCP.PNG" width=705 border=0></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图 1 的上部说明一个 UDP 客户端和服务器。左边的对等层完成两个套接字的写操作，每个 100 字节。协议栈的 UDP 层追踪写的数量，并确保当右边的接收者通过套接字获取数据时，它以同样数量的字节到达。换句话说，为读者保留了写者提供的消息边界。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在，看图 1 的底部．它为 TCP 层演示了相同粒度的写操作。两个独立的写操作（每个 100 字节）写入流套接字。但在本例中，流套接字的读者得到的是 200 字节。协议栈的 TCP 层聚合了两次写操作。这种聚合可以发生在 TCP/IP 协议栈的发送者或接收者中任何一方。重要的是，要注意到聚合也许不会发生 —— TCP 只保证数据的有序发送。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对大多数开发人员来说，该陷阱会引起困惑。您想要获得 TCP 的可靠性和 UDP 的帧同步。除非改用其他的传输协议，比如流传输控制协议（STCP），否则就要求应用层开发人员来实现缓冲和分段功能。
<p>&nbsp;</p>
</div>
</div>
</div>
<img src="http://www.cnblogs.com/wayne1017/aggbug/665931.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/wayne1017/archive/2007/03/09/665931.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wayne1017/archive/2007/03/09/665931.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/58878/" target="_blank">Google手机上市74天仅售13.5万部 远少于iPhone</a><span style="color:gray">(2010-03-16 22:54)</span><br/>· <a href="http://news.cnblogs.com/n/58877/" target="_blank">星际争霸2破解进度：实现主机和客户端连接</a><span style="color:gray">(2010-03-16 22:43)</span><br/>· <a href="http://news.cnblogs.com/n/58876/" target="_blank">iPhone、WM、Symbian、Android移动开发前景分析</a><span style="color:gray">(2010-03-16 22:03)</span><br/>· <a href="http://news.cnblogs.com/n/58874/" target="_blank">搜狐旧将樊功臣全面接管搜狗 欲重振搜索业务</a><span style="color:gray">(2010-03-16 21:32)</span><br/>· <a href="http://news.cnblogs.com/n/58873/" target="_blank">腾讯昨推QQ会员官方店 全面向淘宝宣战</a><span style="color:gray">(2010-03-16 21:28)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/58848/" target="_blank">IT蚁族：蜗居和逃离</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>FC5下Attansic网卡驱动问题的解决</title><link>http://www.cnblogs.com/wayne1017/archive/2007/01/14/620070.html</link><dc:creator>肥猫</dc:creator><author>肥猫</author><pubDate>Sun, 14 Jan 2007 07:25:00 GMT</pubDate><guid>http://www.cnblogs.com/wayne1017/archive/2007/01/14/620070.html</guid><description><![CDATA[<p>阅读: 1671 评论: 6 作者: <a href="http://www.cnblogs.com/wayne1017/" target="_blank">肥猫</a> 发表于 2007-01-14 15:25 <a href="http://www.cnblogs.com/wayne1017/archive/2007/01/14/620070.html" target="_blank">原文链接</a></p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近因为项目需要，配置一个linux下的集群系统。选择了FC5作为服务器的操作系统，本来以为很简单的安装FC5系统的工作，因为Attansic网卡的驱动问题折腾了很久，现在就把整个的过程记录下来，做个参考吧。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 机器的配置：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPU：赛扬D352，3.2GHz，(支持Intel EM64T技术)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;硬盘：320G<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;网卡：Attansic千兆网卡<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作系统：Fedora Core 5 (kernel 2.6.15)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;安装完FC5以后，发现无法识别网卡。于是从主板附送的光盘中找到了该网卡linux下的驱动程序，是源代码包。根据其中的说明make install了一下，结果报错：<span style="font-size: 10.5pt; font-family: 'times new roman';" lang="EN-US">Linux kernel source not found。然后发现FC5下是没有安装源代码的。郁闷，只好去这里下面这里下载FC5的内核源码包：<br><span style="font-size: 10.5pt; font-family: 'times new roman';" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://download.fedora.redhat.com/pub/fedora/linux/core/5/source/SRPMS/kernel-2.6.15-1.2054_FC5.%20src.rpm">http://download.fedora.redhat.com/pub/fedora/linux/core/5/source/SRPMS/kernel-2.6.15-1.2054_FC5. src.rpm&nbsp;</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关于这个Attansic千兆网卡，有必要说明一下。这个是华硕主板集成的网卡。对于该网卡的驱动，在SourceForge里面还专门有一个项目，里面提供了该网卡官方的最新驱动程序的源码包以及相应的kernel-patch，网址如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://atl1.sourceforge.net/">http://atl1.sourceforge.net/</a><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;按照下面的步骤进行安装：<br><strong style="color: #0000ff;">1、安装FC5内核源码<br></strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span>然后进入到该</span><span>rpm</span><span>包所在的目录，将</span><span>rpm</span><span>包拷贝到</span><span>/usr/src</span><span>目录下</span><span>)<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#</span><span> </span><span>cp kernel-2.6.15-1.2054_FC5.src.rpm /usr/src<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#</span><span> </span><span>cd /usr/src<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#</span><span> </span><span>rpm -Uvh kernel-2.6.15-1.2054_FC5.src.rpm<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# cd /usr/src/redhat/SPECS<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# ls<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Kernel-2.6.spec<br><br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# rpmbuild -bp --target i686 kernel-2.6.spec<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# ls /usr/src/redhat/BUILD/kernel-2.6.15/<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Config.mk linux-2.6.15.i686 vanilla xen xen-vanilla<br><br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# cd /usr/src<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# mkdir kernels<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# cd kernels/<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ln -s ../redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686/ 2.6.15-1.2054_FC5-i686<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span>上面这句命令要注意，在</span><span>../redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686/</span><span>和</span><span>2.6.15-1.2054_FC5-i686</span><span>之间是<strong>有一个空格的</strong>，不是连在一起的！！</span><span>)<br></span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# ls<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.6.15-1.2054_FC5-i686<br></span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# cd 2.6.15-1.2054_FC5-i686/<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# cp configs/kernel-2.6.15-i686.config .config<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span>上面这句命令要注意，在</span><span>configs/kernel-2.6.15-i686.config</span><span>和</span><span>.config</span><span>之间是<strong>有一个空格的</strong>！</span><span>!)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>cp:</span><span>是否覆盖</span><span> <span>&#8220;.config&#8221; ? y&nbsp;<br></span></span><span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# uname &#8211;r <br><br><strong><span style="color: #0000ff;">2、编译内核源码</span><br></strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进入</span><span>linux</span><span>内核树<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# cd /usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# make<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后就耐心等待编译吧</span><span>:)<br><br><strong style="color: #0000ff;">3、编译驱动程序<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在那个SourceForge上提供了两个网卡驱动的版本：<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个是</span><span>AtL1Linux_v0.1.40.6.tar.gz </span><span>这个是老版本的驱动<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个是</span><span>AtL1Linux_v1.0.41.0.tar.gz </span><span>这个是</span><span>Attansic</span><span>公司</span><span>For kernel 2.6.18</span><span>的最新的驱动<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我</span><span>机子上用的是第二个最新的这个驱动，将这个驱动压缩包拷贝到本机上，</span><span>进入驱动压缩包所在的目录<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# tar xvfz AtL1Linux_v1.0.41.0.tar.gz<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # cd AtL1Linux_v1.0.41.0<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个目录下应该有一个放源代码的文件夹，</span><span>进入<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # cd src<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 找到一个叫</span><span>at_main.c</span><span>的源文件，打开并修改其中的内容，用于解决驱动程序中</span><span>TSO</span><span>部分的问题。如果不修改这个问题，就会导致下载速率正常但是上传的速率很低。<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# vi at_main.c<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 找到下面这一行，并注释掉<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;netdev-&gt;features |= NETIF_F_TSO;<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# make install<br></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;耐心的等待编译吧，嘿嘿</span><span>&#8230;</span><br></span></span></span></span>  <img src="http://www.cnblogs.com/wayne1017/aggbug/620070.html?type=1" width="1" height="1" alt=""/><p>评论: 6　<a href="http://www.cnblogs.com/wayne1017/archive/2007/01/14/620070.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wayne1017/archive/2007/01/14/620070.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/58878/" target="_blank">Google手机上市74天仅售13.5万部 远少于iPhone</a><span style="color:gray">(2010-03-16 22:54)</span><br/>· <a href="http://news.cnblogs.com/n/58877/" target="_blank">星际争霸2破解进度：实现主机和客户端连接</a><span style="color:gray">(2010-03-16 22:43)</span><br/>· <a href="http://news.cnblogs.com/n/58876/" target="_blank">iPhone、WM、Symbian、Android移动开发前景分析</a><span style="color:gray">(2010-03-16 22:03)</span><br/>· <a href="http://news.cnblogs.com/n/58874/" target="_blank">搜狐旧将樊功臣全面接管搜狗 欲重振搜索业务</a><span style="color:gray">(2010-03-16 21:32)</span><br/>· <a href="http://news.cnblogs.com/n/58873/" target="_blank">腾讯昨推QQ会员官方店 全面向淘宝宣战</a><span style="color:gray">(2010-03-16 21:28)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/58848/" target="_blank">IT蚁族：蜗居和逃离</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>ORACLE的工作机制（转载）</title><link>http://www.cnblogs.com/wayne1017/archive/2006/11/05/550700.html</link><dc:creator>肥猫</dc:creator><author>肥猫</author><pubDate>Sun, 05 Nov 2006 07:25:00 GMT</pubDate><guid>http://www.cnblogs.com/wayne1017/archive/2006/11/05/550700.html</guid><description><![CDATA[<p>阅读: 1037 评论: 0 作者: <a href="http://www.cnblogs.com/wayne1017/" target="_blank">肥猫</a> 发表于 2006-11-05 15:25 <a href="http://www.cnblogs.com/wayne1017/archive/2006/11/05/550700.html" target="_blank">原文链接</a></p>这是从别人的blog里看到的，觉得很不错，所以连原文和回复一起贴了出来，算是收藏吧。<br>
<h2><span style="FONT-SIZE: 12pt; COLOR: #000000">由 meteor 发表于 October 29, 2004 08:32 AM</span></h2>
<h3><span style="COLOR: #000000">ORACLE的工作机制</span></h3>
<p><span style="COLOR: #000000">一个高人写的oracle资料</span></p>
<p>我们从一个用户请求开始讲,ORACLE的完整的工作机制是怎样的,首先一个用户进程发出一个连接请求,如果使用的是主机命名或者是本地服务命中的主机名使用的是机器名(非IP地址)，那么这个请求都会通过DNS服务器或HOST文件的服务名解析然后传送到ORACLE监听进程,监听进程接收到用户请求后会采取两种方式来处理这个用户请求,下面我们分专用服务器和共享服务器分别采用这两种方式时的情况来讲：</p>
<div id=a000145more>
<div id=more>
<p>专用服务器模式下：一种方式是监听进程接收到用户进程请求后，产生一个新的专用服务器进程，并且将对用户进程的所有控制信息传给此服务器进程，也就是说新建的服务器进程继承了监听进程的信息，然后服务器进程给用户进程发一个RESEND包，通知用户进程可以开始给它发信息了，用户进程给这个新建的服务器进程发一个CONNECT包，服务器进程再以ACCEPT包回应用户进程，致此，用户进程正式与服务器进程确定连接。我们把这种连接叫做HAND-OFF连接，也叫转换连接。另一种方式是监听进程接收到用户进程的请求后产生一个新的专用服务器进程，这个服务器进程选用一个TCP/IP端口来控制与用户进程的交互，然后将此信息回传给监听进程，监听进程再将此信息传给用户进程，用户进程使用这个端口给服务器进程发送一个CONNECT包，服务器进程再给用户进程发送一个ACCEPT包，致此，用户进程可以正式向服务器进程发送信息了。这种方式我们叫做重定向连接。HAND-OFF连接需要系统平台具有进程继承的能力，为了使WINDOWS NT/2000支持HAND-OFF必须在HKEY_LOCAL_MACHINE&gt;SOFTWARE&gt;ORACLE&gt;HOMEX中设置USE_SHARED_SOCKET。</p>
<p>共享服务器模式下：只有重定向连接的方式，工作方式是监听进程接收到用户进程的请求后产生一个新的调度进程，这个调度进程选用一个TCP/IP端口来控制与用户进程的交互，然后将此信息回传给监听进程，监听进程再将此信息传给用户进程，用户进程使用这个端口给调度进程发送一个CONNECT包，调度进程再给用户进程发送一个ACCEPT包，致此，用户进程可以正式向调度进程发送信息了。可以通过设置MAX_DISPIATCHERS这个参数来确定调度进程的最大数目，如果调度进程的个数已经达到了最大，或者已有的调度进程不是满负荷，监听进程将不再创建新的调度进程，而是让其中一个调度进程选用一个TCP/IP端口来与此用户进程交互。调度进程每接收一个用户进程请求都会在监听进程处作一个登记，以便监听进程能够均衡每个调度进程的负荷，所有的用户进程请求将分别在有限的调度进程中排队，所有调度进程再顺序的把各自队列中的部分用户进程请求放入同一个请求队列，等候多个ORACLE的共享服务器进程进行处理（可以通过SHARED_SERVERS参数设置共享服务器进程的个数），也就是说所有的调度进程共享同一个请求队列，共享服务器模式下一个实例只有一个请求队列，共享服务器进程处理完用户进程的请求后将根据用户进程请求取自不同的调度进程将返回结果放入不同的响应队列，也就是说有多少调度进程就有多少响应队列，然后各个调度进程从各自的响应队列中将结果取出再返回给用户进程。</p>
<p>以上我们讲完了用户与ORACLE的连接方式，下面我们要讲ORACLE服务器进程如可处理用户进程的请求，当一个用户进程发出了一条SQL语名：UPDATE TABBLEA SET SALARY=SALARY*2；首先，服务器进程把这条语句的字符转换成ASCII等效数字码，接着这个ASCII码被传递给一个HASH函数，并返回一个HASH值，服务器进程将到SHARED POOL 的共享PL/SQL区去查找是否存在同样的HASH值，如果存在，服务器进程将使用这条语句已高速缓存在SHARED POOL中的已分析过的版本来执行，如果不存在，服务器进程将对该语句进行语法分析，首先检查该语句的语法的正确性，接着对语句中涉及的表、索引、视图等对象进行解析，并对照数据字典检查这些对象的名称以及相关结构，并根据ORACLE选用的优化模式以及数据字典中是否存在相应对象的统计数据和是否使用了存储大纲来生成一个执行计划或从存储大纲中选用一个执行计划，然后再用数据字典核对此用户对相应对象的执行权限，最后生成一个编译代码。ORACLE将这条语名的本身实际文本、HASH值、编译代码、与此语名相关联的任何统计数据和该语句的执行计划缓存在SHARED POOL的共享PL/SQL区。服务器进程通过SHARED POOL 锁存器来申请可以向哪些共享PL/SQL区中缓存这此内容，也就是说被SHARED POOL锁存器锁定的PL/SQL区中的块不可被覆盖，因为这些块可能被其它进程所使用。在SQL分析阶段将用到LIBRARY CACHE，从数据字典中核对表、视图等结构的时候，需要将数据字典从磁盘读入LIBRARY CACHE，因此，在读入之前也要使用LIBRARY CACHE锁存器来申请用于缓存数据字典。</p>
<p>生成编译代码之后，接着下一步服务器进程要准备开始更新数据，服务器进程将到DB BUFFER中查找是否有相关对象的缓存数据，下面分两个可能进行解释：</p>
<p>如果没有，服务器进程将在表头部请求一些行锁，如果成功加锁，服务器进程将从数据文件中读这些行所在的数据块放入DB BUFFER中空闲的区域或者覆盖已被挤出LRU列表的非脏数据块缓冲区，并且排列在LRU列表的头部，如果这些非脏数据缓冲区写完也不能满足新数据的请求时，会立即触发DBWN进程将脏数据列表中指向的缓冲块写入数据文件，并且清洗掉这些缓冲区，来腾出空间缓冲新读入的数据，也就是在放入DB BUFFER之前也是要先申请DB BUFFER中的锁存器，成功锁定后，再写入DB BUFFER，然后服务器程将该语句影响的被读入DB BUFFER块中的这些行的ROWID及将要更新的原值和新值及SCN等信息逐条的写入REDO LOG BUFFER，在写入REDO LOG BUFFER之前也是先请求REDO LOG BUFFER块的锁存器，成功锁定之后才开始写入，当写入达到REDO LOG BUFFER大小的三分之一或写入量达到1M或超过三秒后或发生检查点时或者DBWN之前发生，LGWR将把REDO LOG BUFFER中的数据写入磁盘上的重做日志文件，已被写入重做日志文件的REDO LOG BUFFER中的块上的锁存器被释放，并可被后来写入的信息所覆盖，REDO LOG BUFFER以循环的方式工作。当一个重做日志文件写满后，LGWR将切换到下一个重做日志文件，如果是归档模式，归档进程还将前一个写满的重做日志进程写入归档日志文件，重做日志文件也是循环工作方式。写完所有的REDO LOG BUFFER之后，服务器进程开始改写这个DB BUFFER块头部的事务列表并写入SCN，然后COPY包含这个块的头部事务列表及SCN信息的数据副本放入回滚段中，我们将回滚段中的副本称为数据块的&#8220;前映像&#8221;。（回滚段可以存储在专门的回滚表空间中，这个表空间由一个或多个物理文件组成，并专用于回滚表空间，回滚段也可在其它表空间中的数据文件中开辟。）然后改写这个DB BUFFER块的数据，并在其头部写入对应的回滚段地址，如果对一行数据多次UPDATE而不COMMIT则在回滚段中将会有多个&#8220;前映像&#8221;，除第一个&#8220;前映像&#8221;含有SCN信息外，其它的每个&#8220;前映像&#8221;的头部还含有SCN信息和&#8220;前前映像&#8221;的回滚段地址。一次UPDATE操作只对应一个SCN。然后服务器进程在脏数据列表中建立一条指向此缓冲块的指针。接着服务器进程会从数据文件读入第二个块重复以上读入，记日志，建立回滚段，修改，放入脏列表的动作，当脏数据列表达到一定长度时，DBWN进程将脏数据列表中指向的缓冲块全部写入数据文件，也就是释放加在这些DB BUFER 块上的锁存器。其实ORACLE可以一次从数据文件中读入几个块放入DB BUFFER，可以通过参数DB_FILE_MULTIBLOCK_READ_COUNT来设置一次读入的块的个数。</p>
<p>如果要查找的数据已缓存，则根据用户的SQL操作类型决定如何操作，如果是SELECT 则查看DB BUFFER块的头部是否有事务，如果有，将从回滚段读取，如果没有则比较SELECT 的SCN与DB BUFFER块头部的SCN如果比自己大，仍然从回滚段读取，如果比自己小则认这是一个非脏缓存，可以直接从这个DB BUFFER块中读取。如果是UPDATE则即使在DB BUFFER中找到一个没有事务，而且SCN比自己小的非脏缓存数据块，服务器进程仍然要到表的头部对这条记录申请加锁，加锁成功则进行后续动作，如果不成功，则要等待前面的进程解锁后才能进行动作。</p>
<p>只有当SQL语句影响的所有行所在的最后一个块被读入DB BUFFER并且重做信息被写入REDO LOG BUFFER（仅是指重做日志缓冲，而非重做日志文件）之后，用户才可以发出COMMIT，COMMIT触发LGRW，但并不强制立即DBWN来释放所有相应的DB BUFFER块上的锁，也就是说有可能出现已COMMIT，但在随后的一段时间内DBWN还在写这条语句涉及的数据块的情形，表头部的行锁，并不是在COMMIT一发出就马上释放，实际上要等到相应的DBWN进程结束才会释放。一个用户请求锁定另一个用户已COMMIT的资源不成功的机会是存在的，从COMMIT到DBWN进程结束之间的时间很短，如果恰巧在这个时间断电，由于COMMIT已触发LGWR进程，所以这些未来得及写入数据文件的改变会在实例重启后由SMON进程根据重做日志文件来前滚。如果未COMMIT就断电，由于DBWN之前触发LGWR，所有DBWN在数据文件上的修改都会被先一步记入重做日志文件，实例重启后，SMON进程再根据重做日志文件来回滚。</p>
<p>如果用户ROOLBACK，则服务器进程会根据数据文件块和DB BUFFER中块的头部的事务列表和SCN以及回滚段地址找到回滚段中相应的修改前的副本，并且用这些原值来还原当前数据文件中已修改但未提交的改变。如果有多个&#8220;前映像&#8221;，服务器进程会在一个&#8220;前映像&#8221;的头部找到&#8220;前前映像&#8221;的回滚段地址，一直找到同一事务下的最早的一个&#8220;前映像&#8221;为止。一旦发出了COMMIT，用户就不能ROOLBACK，这使得COMMIT后DBWN进程还没有全部完成的后续动作得到了保障。</p>
<p>下面我们要提到检查点的作用，当一个全部检查点发生的时候，首先让LGWR进程将REDO LOG BUFFER中的所有缓冲（包含未提交的重做信息）写入重做日志文件，然后让DBWN进程将DB BUFFER中所有已提交的缓冲写入数据文件（不强制写未提交的）。然后更新控制文件和数据文件头部的SCN，表明当前数据库是一致的，如果在发生检点之前断电，并且当时有一个未提交的改变正在进行，实例重启之后，SMON进程将从上一个检查点开始核对这个检查点之后记录在重做日志文件中已提交的和未提交改变，因为DBWN之前会触发LGWR，所以DBWN对数据文件的修改一定会被先记录在重做日志文件中。因此，断电前被DBWN写进数据文件的改变将通过重做日志文件中的记录进行还原，叫做回滚，如果断电时有一个已提交，但DBWN动作还没有完全完成的改变存在，因为已经提交，提交会触发LGWR进程，所以不管DBWN动作是否已完成，该语句将要影响的行及其产生的结果一定已经记录在重做日志文件中了，则实例重启后，SMON进程根据重做日志文件进行前滚。由此可见，实例失败后用于恢复的时间由两个检查点之间的间隔大小来决定，我们可以通个四个参数设置检查点执行的频率，LOG_CHECKPOINT_IMTERVAL决定了两个检查点之间写入重做日志文件的系统物理块的大小，LOG_CHECKPOINT_TIMEOUT决定了两个检查点之间的时间长度，FAST_START_IO_TARGET决定了用于恢复时需要处理的块的大小，FAST_START_MTTR_TARGET直接决定了用于恢复的时间的长短。SMON进程执行的前滚和回滚与用户的回滚是不同的，SMON是根据重做日志文件进行前滚或回滚，而用户的回滚一定是根据回滚段的内容进行回滚的。在这里我们要说一下回滚段存储的数据，假如是delete操作，则回滚段将会记录整个行的数据，假如是update,则回滚段只记录被修改了的字段的变化前的数据（前映像），也就是没有被修改的字段是不会被记录的，假如是insert，则回滚段只记录插入记录的rowid。这样假如事务提交，那回滚段中简单标记该事务已经提交；假如是回退，则如果操作是是delete,回退的时候把回滚段中数据重新写回数据块，操作如果是update，则把变化前数据修改回去，操作如果是insert，则根据记录的rowid 把该记录删除。</p>
<p>下面我们要讲DBWN如何来写数据文件，在写数据文件前首先要找到可写的空闲数据块，ORACLE中空闲数据块可以通过FREELIST或BITMAP来维护，它们位于一个段的头部用来标识当前段中哪些数据块可以进行INSERT。在本地管理表空间中ORACLE自动管理分配给段的区的大小，区的分配信息存储在组成表空间的数据文件的头部，而数据字典管理的表空间用户可以在创建时决定区的大小，并且区的分配信息是存储在数据字典中的，只在本地管理的表空间中才能选用段自动管理，采用自动段空间管理的本地管理表空间中的段中的空闲数据块的信息就存放在段的头部并且使用位图来管理，采用手动管理的本地管理表空间中的段和数据字典管理的表空间中的段中的空闲数据块的管理都使用位于段头部的空闲列表来管理，空闲列表的工作方式：首先一个空的数据块被加入空闲列表，当其中空闲空间小于PCTFREE设置的值之后，这个块从空闲列表删除，当这个块中的内容降至PCTUSED设置的值之下后，这个数据块被再次加入空闲列表，位于空闲列表中的数据块都是可以向其中INSERT的块，当一个块移出了空闲列表，但只要其中还有保留空间就可以进行UPDATE，当对其中一行UPDATE一个大数据时，如果当前块不能完全放下整个行，只会把整个行迁移到一个新的数据块，并在原块位置留下一个指向新块的指针，这叫行迁移。如果一个数据块可以INSERT，当插入一个当前块装不下的行时，这个行会溢出到两个或两个几上的块中，这叫行链接。如果用户的动作是INSERT 则服务器进程会先锁定FREELIST，然后找到空闲块的地址，再释放FREELIST，当多个服务器进程同时想要锁定FREELIST时即发生FREELIST的争用，可以在非采用自动段空间管理的表空间中创建表时指定FREELIST的个数，默认为1，如果是在采用自动段空间管理的表空间中创建表，即使指定了FREELIST也会被忽略，因为此时将使用BITMAP而不是FREELIST来管理段中的空闲空间。如果用户动作是UPDATE服务器进程将不会使用到FREELIST和BITMAP，因为不要去寻找一个空闲块，而使用锁的队列。</p>
<p>下面来讲一下ORACLE锁的机制，ORACLE分锁存器和锁两种。锁存器是用来保护对内存结构的访问，比如对DB BUFFER中块的锁存器申请，只有在DBWN完成后，这些DB BUFFER块被解锁。然后用于其它的申请。锁存器不可以在进程间共享，锁存器的申请要么成功要么失败，没有锁存器申请队列。主要的锁存器有SHARED POOL锁存器，LIBRARY CACHE锁存器，CACHE BUFFERS LRU CHAIN锁存器，CACHE BUFFERS CHAINS 锁存器，REDO ALLOCATION 锁存器，REDO COPY 锁存器。ORACLE的锁是用来保护数据访问的，锁的限制比锁存器要更宽松，比如，多个用户在修改同一表的不同行时，可以共享一个表上的一个锁，锁的申请可以按照被申请的顺序来排队等候，然后依次应用，这种排队机制叫做队列（ENPUEUE），如果两个服务器进程试图对同一表的同一行进行加锁，则都进入锁的申请队列，先进的加锁成功，后面的进程要等待，直到前一个进程解锁才可以加锁，这叫做锁的争用，而且一旦加锁成功，这个锁将一直保持到用户发出COMMIT或ROOLBACK命令为止。如果两个用户锁定各自的一行并请求对方锁定的行的时候将发生无限期等待即死锁，死锁的发生都是由于锁的争用而不是锁存器的争用引起的，ORACLE在遇到死锁时，自动释放其中一个用户的锁并回滚此用户的改变。正常情况下发生锁的争用时，数据的最终保存结果由SCN来决定哪个进程的更改被最终保存。两个用户的服务器进程在申请同一表的多个行的锁的时候是可以交错进入锁的申请队列的。只有其中发生争用才会进行等待。创建表时指定的MAXTRANS参数决了，表中的一个数据块最多可以被几个事务同时锁定。</p>
<p>下面是几个关于回滚段和死锁的事例：</p>
<p>有表：Test (id number(10)) 有记录1000000条</p>
<p>一，大SELECT，小UPDATE<br>A会话----Select * from test;----设scn=101----执行时间09:10:11<br>B会话-----Update test set id=9999999 where id=1000000----设scn=102-----执行时间09:10:12 </p>
<p>我们会发现B会话会在A会话前完成，A会话中显示的ID=100000是从回滚段中读取的，因为A会话在读到ID=1000000所在的BLOCK时发现BLOCK上有事务信息，因此要从回滚段中读，如果UPDATE在SELECT读到此BLOCK之前已经COMMIT，则SELECT 读到此BLOCK时发现其BLOCK上没有事务信息，但是会发现其BLICK的SCN比SELECT自己的SCN大，因此也会从回滚段中读取。因此是否从回滚段读一是看是否有事务信息二是比较SCN大小。如果B会话在A会话结束前连续多次对同一条记录UPDATE并COMMIT<br>，那么在回滚段中将记录多个&#8220;前映像&#8221;，而每个&#8220;前映像&#8221;中不但包括了原BLOCK的数据和SCN也记录了&#8220;前前映像&#8221;的回滚段地址，因此A会话在查询到被UPDATE过的BLOCK时，会根据BLOCK记录的回滚段的地址，找到回滚段中的&#8220;前映像&#8221;，发现这个&#8220;前映像&#8221;的SCN也比自己的大，因此将根据这个&#8220;前映像&#8221;中记录的&#8220;前前映像&#8221;的回滚段地址，在回滚段中找到&#8220;前前映像&#8221;，再与这个&#8220;前前映像&#8221;比较SCN，如果比自己小就读取，如果还比自己大，则重复以上步骤，直到找到比自己SCN小的&#8220;前&#8230;前映像&#8221;为止，如果找不到，就会报ORA-01555快照太旧这个错误。</p>
<p>二、大UPDATE，小SELECT</p>
<p>A会话----Update test set id=1;----设scn=101----执行时间09:10:11<br>B会话-----select * from test where id=1000000----设scn=102-----执行时间09:10:12 </p>
<p>我们会发现B会话会在A会话前完成，B会话中显示的ID=1000000是从BLOCK中直接读取的，因为B会话在读到ID=1000000所在的BLOCK时，A会话还没有来得及对其锁定，因此B会话既不会发现BLOCK上有事务信息，也不会发现BLOCK上的SCN比SELECT的大，因此会从BLOCK中直接读取，如果SELECT在UPDATE锁定此BLOCK后才发出，B会话读到此BLOCK时发现其BLOCK上有事务信息，因此会从回滚段中读取。</p>
<p>三、大UPDATE，小UPDATE</p>
<p>A会话----Update test set id=1;----设scn=101----执行时间09:10:11<br>B会话1-----Update test set id=999999 where id=1000000----设scn=102-----执行时间09:10:12 <br>B会话2----- select * from test where id=2----设scn=103-----执行时间09:10:14 <br>B会话3----- update test set id=3 where id=2----设scn=104-----执行时间09:10:15 </p>
<p>我们会发现B会话1会完成，A会话将一直等待，因为B会话1会先于A会话锁定ID=1000000所在的BLOCK，并改写头部的事务信息，A会话在试图锁定此BLOCK时，发现其上有事务信息，将会一直等待B会话1事务结束后再行锁定， B会话2查询到的ID=2是从回滚段中读取的而不是从BLOCK中直接读出来的。因为A会话已将ID=2的BLOCK锁定，并写入了回滚段，从B会话3可以证明这一点，B会话3发出后，B会话3会收到死锁的信息，死锁的原因是A会话在等待B会话对ID=1000000所在的BLOCK解锁，现在B会话又在等待A会话对ID=2所在的BLOCK解锁，因此形成死锁，因此证明ID=2所在的BLOCK已被A会话锁定，然后A会话也会收到死锁的信息<br><span style="COLOR: #000000">Trackback Pings</span></p>
</div>
</div>
<p><span style="COLOR: #000000">引用下面文章的网址:</span><br><span style="COLOR: #000000">http://www.thinkjam.org/mtcgi/mt-tb.cgi/105</span></p>
<h2 id=comments><span style="COLOR: #000000">评论</span></h2>
<p><span style="COLOR: #000000">由 biti_rainy 发表于 July 20, 2005 09:50 AM</span></p>
<div id=c1510>
<p>##不得不承认，作者对oracle的理解是深刻的，也是颇费了工夫去思考的。只是可能由于缺乏和人的共同探讨 或者 碰巧有点小错误引出一些推导错误。</p>
</div>
<div id=c1750>
<p>如果要查找的数据已缓存，则根据用户的SQL操作类型决定如何操作，如果是SELECT 则查看DB BUFFER块的头部是否有事务，如果有，将从回滚段读取，如果没有则比较SELECT 的SCN与DB BUFFER块头部的SCN如果比自己大，仍然从回滚段读取，如果比自己小则认这是一个非脏缓存，可以直接从这个DB BUFFER块中读取。如果是UPDATE则即使在DB BUFFER中找到一个没有事务，而且SCN比自己小的非脏缓存数据块，服务器进程仍然要到表的头部对这条记录申请加锁，加锁成功则进行后续动作，如果不成功，则要等待前面的进程解锁后才能进行动作。</p>
<p>只有当SQL语句影响的所有行所在的最后一个块被读入DB BUFFER并且重做信息被写入REDO LOG BUFFER（仅是指重做日志缓冲，而非重做日志文件）之后，用户才可以发出COMMIT，COMMIT触发LGRW，但并不强制立即DBWN来释放所有相应的DB BUFFER块上的锁，也就是说有可能出现已COMMIT，但在随后的一段时间内DBWN还在写这条语句涉及的数据块的情形，表头部的行锁，并不是在COMMIT一发出就马上释放，实际上要等到相应的DBWN进程结束才会释放。</p>
<p>##由上面两段话可以看出点 瑕疵，作者对 block cleanout 概念都没有提到，可能不大了解这个概念，所以在这两个地方描述有遗漏，第二段更是因为这个概念不清楚而引出一些猜测 :) </p>
<p>下面我们要提到检查点的作用，当一个全部检查点发生的时候，首先让LGWR进程将REDO LOG BUFFER中的所有缓冲（包含未提交的重做信息）写入重做日志文件，然后让DBWN进程将DB BUFFER中所有已提交的缓冲写入数据文件（不强制写未提交的）。</p>
<p>##由上面这段话可以看出多检查点理解有误，dbwr写的时候不会管是否提交的，这也可以和 block cleanout 套上关系，因为参考更前面两段话，作者一直以为是dbwr 来处理 block cleanout的。</p>
<p>下面我们要讲DBWN如何来写数据文件，在写数据文件前首先要找到可写的空闲数据块，ORACLE中空闲数据块可以通过FREELIST或BITMAP来维护，它们位于一个段的头部用来标识当前段中哪些数据块可以进行INSERT</p>
<p>##由这段话也有错误，dbwr是把buffer写到数据文件，但是读block进buffer和写buffer 是 用户进程做的时候，通过freelist去找空闲数据块 也是用户进程做的事情，作者在这里认为通过freelist去找空闲buffer是dbwr做的(参考文章很容易这么理解的)? 参考我所陈述的上面所有内容可以看出作者 扩大了 dbwr 的功能，将用户进程做的一些事情以为是dbwr做的，所以会有这一系列的相关错误。而作者应该是一个逻辑严密的人，有一点小东西没理解清楚的时候，用了好几个猜测去支持（只是碰巧猜测错了 :) ）。</p>
<p>##所以如果作者能有人点一下这个问题，所有相关的疑惑 迎刃而解。</p>
<p><br>##另： 作者喜欢用 锁存器这个概念，其实我觉得还是用 lock and latch 来分别说明一些概念比较好。毕竟，在很多时候latch仅仅是一个 内存中简单的标志位而已。</p>
</div>
<p>&nbsp;</p>
<img src="http://www.cnblogs.com/wayne1017/aggbug/550700.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/wayne1017/archive/2006/11/05/550700.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wayne1017/archive/2006/11/05/550700.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/58878/" target="_blank">Google手机上市74天仅售13.5万部 远少于iPhone</a><span style="color:gray">(2010-03-16 22:54)</span><br/>· <a href="http://news.cnblogs.com/n/58877/" target="_blank">星际争霸2破解进度：实现主机和客户端连接</a><span style="color:gray">(2010-03-16 22:43)</span><br/>· <a href="http://news.cnblogs.com/n/58876/" target="_blank">iPhone、WM、Symbian、Android移动开发前景分析</a><span style="color:gray">(2010-03-16 22:03)</span><br/>· <a href="http://news.cnblogs.com/n/58874/" target="_blank">搜狐旧将樊功臣全面接管搜狗 欲重振搜索业务</a><span style="color:gray">(2010-03-16 21:32)</span><br/>· <a href="http://news.cnblogs.com/n/58873/" target="_blank">腾讯昨推QQ会员官方店 全面向淘宝宣战</a><span style="color:gray">(2010-03-16 21:28)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/58848/" target="_blank">IT蚁族：蜗居和逃离</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>关于Access的左连接</title><link>http://www.cnblogs.com/wayne1017/archive/2006/09/15/505030.html</link><dc:creator>肥猫</dc:creator><author>肥猫</author><pubDate>Fri, 15 Sep 2006 15:23:00 GMT</pubDate><guid>http://www.cnblogs.com/wayne1017/archive/2006/09/15/505030.html</guid><description><![CDATA[<p>阅读: 2594 评论: 2 作者: <a href="http://www.cnblogs.com/wayne1017/" target="_blank">肥猫</a> 发表于 2006-09-15 23:23 <a href="http://www.cnblogs.com/wayne1017/archive/2006/09/15/505030.html" target="_blank">原文链接</a></p><p>&nbsp;&nbsp;&nbsp; 这篇随笔没有什么深奥的技术要讨论，只是自己一个知识上的盲点：不知道在Access中如何进行左连接的操作。通过在网上搜索，最后在CSDN上找到了自己要的答案，因此觉得有必要记录下来：）<br>&nbsp;&nbsp;&nbsp; 最近做项目，要将一个Access中的数据导入到Oracle中。刚开始我以为用SQL-Server的导入导出工具就可以轻松搞定的，随后才发现有的字段信息不是直接导入过来就ok的，于是又只好自己敲个程序来搞定了。<br>&nbsp;&nbsp;&nbsp; 先把问题列出来：如下图所示，一目了然，无需其他废话了。
<div align=left src_cetemp="/images/cnblogs_com/wayne1017/figure.png">
<div align=center src_cetemp="/images/cnblogs_com/wayne1017/figure.png"><img height=346 alt="" src="http://www.cnblogs.com/images/cnblogs_com/wayne1017/figure.png" width=591 border=0></div>
<br>&nbsp;&nbsp;&nbsp; 所以一并在这里将Oracle的左连接的操作也写一下，算是小小的总结吧，Oracle的左连接SQL语句如下：<br></div>
<div align=center>
<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">
<div align=left><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000">&nbsp;CorpName&nbsp;,&nbsp;Labor&nbsp;,&nbsp;Acreage&nbsp;,&nbsp;Detail&nbsp;</span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000">&nbsp;A&nbsp;,&nbsp;B&nbsp;</span><span style="COLOR: #0000ff">WHERE</span><span style="COLOR: #000000">&nbsp;B.ID&nbsp;</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">&nbsp;A.ID&nbsp;(&nbsp;</span><span style="COLOR: #808080">+</span><span style="COLOR: #000000">&nbsp;)&nbsp;</span><span style="COLOR: #0000ff">ORDER</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">BY</span><span style="COLOR: #000000">&nbsp;B.ID </span><span style="COLOR: #0000ff">ASC</span></div>
</div>
</div>
<div align=left>&nbsp;<br>&nbsp;&nbsp; Access的左连接SQL语句如下：</div>
<div align=center>
<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">
<div align=left><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000">&nbsp;CorpName&nbsp;,&nbsp;Labor&nbsp;,&nbsp;Acreage&nbsp;,&nbsp;Detail&nbsp;</span><span style="COLOR: #0000ff">FROM </span><span style="COLOR: #000000">B&nbsp;</span><span style="COLOR: #ff00ff">LEFT </span><span style="COLOR: #0000ff">JOIN </span><span style="COLOR: #000000">A&nbsp;</span><span style="COLOR: #0000ff">ON </span><span style="COLOR: #000000">B.ID&nbsp;</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">&nbsp;A.ID&nbsp;</span><span style="COLOR: #0000ff">ORDER</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">BY</span><span style="COLOR: #000000">&nbsp;B.ID&nbsp;</span><span style="COLOR: #0000ff">ASC</span></div>
</div>
<br></div>
<div align=left>&nbsp;&nbsp;&nbsp; 由此也就不难推出相应的右连接操作的方法了。<br>&nbsp;&nbsp;&nbsp; 问题是很容易就解决了，可是新的疑问又来了，这两种不同的用法分别都支持什么数据库呢？他们之间性能有什么优劣之分么？于是又开始上网狂找了一通，大致理出来了自己的一点想法，也可能不对，还请各位指点则个！<img height=20 src="http://www.cnblogs.com/Emoticons/QQ/49.gif" width=20 border=0><br>&nbsp;&nbsp;&nbsp; 有部分内容是从网上抓下来的，可是没有找到出处，致敬先！<br><br><strong>&nbsp;一、关于外连接（Outer Join）</strong>&nbsp;
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;&nbsp;&nbsp; <span style="COLOR: #0000ff">SQL-92标准</span><span style="COLOR: #c0c0c0">(SQL 标准的正式名称是ISO/IEC 9705 "Database Language SQL"。最近的一个版本被称作ISO/IEC 9075:2003或简称为SQL:2003。这个版本之前的是SQL:1999 和SQL-92。有兴趣的可以去这里<a title="SQL Standards" href="http://www.jcc.com/sql.htm">SQL Standards</a>看看不同的标准以及它们之间的差异)</span>所定义的FROM子句的连接语法格式为：<br><span lang=EN-US>&nbsp;&nbsp;&nbsp; <span style="COLOR: #0000ff">FROM</span> join_table <span style="COLOR: #000000">join_type</span> join_table </span><span lang=EN-US>[<span style="COLOR: #0000ff">ON</span> (join_condition)]<a title="点击下载SQL-92 Standard Join Syntax.pdf" href="http://www.cnblogs.com/Files/wayne1017/sqljoin.pdf">点击下载SQL92StandardJoinSyntax.pdf</a>&nbsp;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp; 其中</span><span lang=EN-US style="COLOR: #0000ff">join_table</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指出参与连接操作的表名，连接可以对同一个表操作，也可以对多个表操作，对同一</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个表操作的连接又称做自连接。</span><span lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: #0000ff; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">join_type </span><span style="FONT-SIZE: 12pt">指出连接类型，可分为三种：<span style="COLOR: #ff0000">内连接(Inner Join)、外连接(Outer Join)和交叉连接(Cross Join)。<br></span></span>&nbsp;&nbsp;&nbsp; 对于外连接，MS SQL-Server支持两种形式：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、从Sybase继承来的形式<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;字段1 *= 字段2 (左连接)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字段1 =* 字段2 (右连接)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种形式没有全外连接方式<br>&nbsp;&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;&nbsp;&nbsp;&nbsp; left [outer] join on&nbsp;EXPRESSION<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; right [outer] join on EXPRESSION<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; full [outer] join on EXPRESSION<br>&nbsp;&nbsp;&nbsp; 而对Oracle来说，在8i的时候，Oracle的外连接方式只有两种：即左/右连接，到了9i以后，Oracle也支持了标准的外连接语法，因而它也是两种方式<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、字段1＝字段2(+) (左连接)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字段1(+) = 字段2 (右连接)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这种形式也没有全外连接方式<br>&nbsp;&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;&nbsp;&nbsp;&nbsp; left [outer] join on&nbsp;EXPRESSION<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; right [outer] join on EXPRESSION<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; full [outer] join on EXPRESSION<br>&nbsp;&nbsp;&nbsp; 这里只对MS SQL Server和Oracle进行了比较，对于其他的一些数据库如MySQL , PostgreSQL等就没有一一列出了。<br><strong>二、关于Join操作的可能优化方法<br></strong>&nbsp;&nbsp;&nbsp;&nbsp; 我觉得所谓的优化，还是一个见仁见智的问题，需要根据实际的情况来进行定夺。由于自己的经验很少，只能浅浅的说一些很常见的可以优化的地方，如果理解有误，就请大家多多指点^_^<br>&nbsp;&nbsp;&nbsp; 1、对于要经常进行Join操作的多个表(尤其是数据量比较大的表)，在其join操作的字段上每个表都应当建立索引；<br>&nbsp;&nbsp;&nbsp; 2、在SELECT后面不要直接就一个SELECT *，而只要SELECT你需要用到的Columns就够了；<br>&nbsp;&nbsp;&nbsp; 3、对于要进行join操作的表的字段应该是那种unique值居多的字段为好；<br>&nbsp;&nbsp;&nbsp; 写到这儿的时候，自己真的是想不到其他的了，于是又去网上搜索了一下关于join&nbsp; performance的文章，结果真找到了一篇比较好的文章(不过是English Version)，我的很多想法文章里面都包括了，文章主要是讲的MS SQL Server中join&nbsp; performance的问题，但我觉得还是有普遍意义的。<br>&nbsp;&nbsp;&nbsp; 大家可以到这儿看看<a style="COLOR: #0000ff" href="http://www.sql-server-performance.com/tuning_joins.asp">http://www.sql-server-performance.com/tuning_joins.asp</a><br>&nbsp;&nbsp;&nbsp; 如果打开网页慢的话，也可以<a title=点击下载JoinPerformance.pdf style="COLOR: #0000ff" href="http://www.cnblogs.com/Files/wayne1017/JoinPerformance.pdf">点击下载JoinPerformance.pdf</a></p>
</div>
<img src="http://www.cnblogs.com/wayne1017/aggbug/505030.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/wayne1017/archive/2006/09/15/505030.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wayne1017/archive/2006/09/15/505030.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/58878/" target="_blank">Google手机上市74天仅售13.5万部 远少于iPhone</a><span style="color:gray">(2010-03-16 22:54)</span><br/>· <a href="http://news.cnblogs.com/n/58877/" target="_blank">星际争霸2破解进度：实现主机和客户端连接</a><span style="color:gray">(2010-03-16 22:43)</span><br/>· <a href="http://news.cnblogs.com/n/58876/" target="_blank">iPhone、WM、Symbian、Android移动开发前景分析</a><span style="color:gray">(2010-03-16 22:03)</span><br/>· <a href="http://news.cnblogs.com/n/58874/" target="_blank">搜狐旧将樊功臣全面接管搜狗 欲重振搜索业务</a><span style="color:gray">(2010-03-16 21:32)</span><br/>· <a href="http://news.cnblogs.com/n/58873/" target="_blank">腾讯昨推QQ会员官方店 全面向淘宝宣战</a><span style="color:gray">(2010-03-16 21:28)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/58848/" target="_blank">IT蚁族：蜗居和逃离</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>学习Java的困惑</title><link>http://www.cnblogs.com/wayne1017/archive/2006/09/04/494401.html</link><dc:creator>肥猫</dc:creator><author>肥猫</author><pubDate>Mon, 04 Sep 2006 07:31:00 GMT</pubDate><guid>http://www.cnblogs.com/wayne1017/archive/2006/09/04/494401.html</guid><description><![CDATA[<p>阅读: 789 评论: 9 作者: <a href="http://www.cnblogs.com/wayne1017/" target="_blank">肥猫</a> 发表于 2006-09-04 15:31 <a href="http://www.cnblogs.com/wayne1017/archive/2006/09/04/494401.html" target="_blank">原文链接</a></p>&nbsp;&nbsp;&nbsp; 一直以来都在学习Java，可是一直以来，也同样困惑着。因为不清楚学了以后能在哪些地方可用。在ChinaJavaWorld看过不少帖子，觉得似乎用的最多的地方也就是web开发和J2ME的开发了，其他的似乎用到Java的很少。于是自己就很动摇，不知道该不该坚持下去。尤其像现在在教研室做项目，几乎很少用到Java，多数都是用的MS的VB，VC等。让我觉得自己学的东西在现实中找不到着力点。也有不少人对我说可以自己做一些小的开发练手，可是毕竟这同在大项目中搞开发有太多的不同了，实在是没有什么实际的意义。<br>&nbsp;&nbsp;&nbsp; 于是就有人问我，为什么要学习Java。我无语了。最初接触Java是在懵懵懂懂的本科的时候，铺天盖地的宣传Java，让我觉得学习Java是一件很酷的事情，因为很少人懂嘛。然后又有说Java程序员的工资要比普通的程序员高出很多，也许正是这个因素促使了我开始接触Java。可是真正到现在毕业了，读研了，发现似乎又是另外一个样子了。其实我觉得很多事情都是这样的无奈：比如你很喜欢mac的笔记本，可是现实中你又要在ms的环境下开发，你怎么办？比如你是个linux的蹙拥，可是你的开发却从来不在linux下，你怎么办？。。。你也许会说：我买个macbook，再装个winxp，不就可以了？是的，如果你不是纯粹的mac迷，这样的确可以，可是你这样的话，为什么还要买mac呢？还不如用Thinkpad呢，要知道macbook的问题不少的哦。曾经有一段时间我也在犹豫是否买macbook，最后还是放弃了，实用主义占了上峰。<br>&nbsp;&nbsp;&nbsp; 平衡，或者说中庸，也许是解决万事万物的最佳方案，但也注定了你不可能在每个方向都很精通。于是我重重地投入了ms的怀抱，我开始学习c#，无论从开发环境上，还是语言本身，你都不得不承认，它是个不错的选择。有很多人盛赞Java的开源环境eclipse，说它基于插件，可是也正是这点既是它的优势也是它的缺点，倒还不如NetBeans来的好。而VS.NET，能让你有不错的舒适感，虽然有很多人鄙视ms，但我从来不这样看。市场的选择就是这样子的。很多高手曾经曰过：学什么语言并不重要。我想那说的是一种境界，就好必武林功夫中无招胜有招，达到这样层次的人，我们称之为：巨侠－大侠中的大侠，那需要对技术钻研的精神。而现实中的开发要求我们这些刚入行的程序员做的工作更像一个剑客，快速出招，一剑封喉：短平快的学会一门语言然后使用之并快速的搞定一个项目，不能不说没有收获，但对于个人的知识来说，并没有什么实质性的好处。说白了，就是现在软件业的一种浮躁情绪，许多新的技术并没有多少团队在实习的项目开发中使用。<br>&nbsp;&nbsp;&nbsp; 无奈，除了无奈，还是无奈。 
<img src="http://www.cnblogs.com/wayne1017/aggbug/494401.html?type=1" width="1" height="1" alt=""/><p>评论: 9　<a href="http://www.cnblogs.com/wayne1017/archive/2006/09/04/494401.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wayne1017/archive/2006/09/04/494401.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/58878/" target="_blank">Google手机上市74天仅售13.5万部 远少于iPhone</a><span style="color:gray">(2010-03-16 22:54)</span><br/>· <a href="http://news.cnblogs.com/n/58877/" target="_blank">星际争霸2破解进度：实现主机和客户端连接</a><span style="color:gray">(2010-03-16 22:43)</span><br/>· <a href="http://news.cnblogs.com/n/58876/" target="_blank">iPhone、WM、Symbian、Android移动开发前景分析</a><span style="color:gray">(2010-03-16 22:03)</span><br/>· <a href="http://news.cnblogs.com/n/58874/" target="_blank">搜狐旧将樊功臣全面接管搜狗 欲重振搜索业务</a><span style="color:gray">(2010-03-16 21:32)</span><br/>· <a href="http://news.cnblogs.com/n/58873/" target="_blank">腾讯昨推QQ会员官方店 全面向淘宝宣战</a><span style="color:gray">(2010-03-16 21:28)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/58848/" target="_blank">IT蚁族：蜗居和逃离</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>硬盘安装Ubuntu</title><link>http://www.cnblogs.com/wayne1017/archive/2006/08/28/488853.html</link><dc:creator>肥猫</dc:creator><author>肥猫</author><pubDate>Mon, 28 Aug 2006 13:54:00 GMT</pubDate><guid>http://www.cnblogs.com/wayne1017/archive/2006/08/28/488853.html</guid><description><![CDATA[<p>阅读: 2061 评论: 0 作者: <a href="http://www.cnblogs.com/wayne1017/" target="_blank">肥猫</a> 发表于 2006-08-28 21:54 <a href="http://www.cnblogs.com/wayne1017/archive/2006/08/28/488853.html" target="_blank">原文链接</a></p><font size=2><strong>同样，这个也是我以前写的一个小心得，也把它给贴了过来:)<br><br></strong><span style="FONT-SIZE: 14px">大家一般都是从网上download&nbsp;&nbsp;ISO然后刻盘进行linux的安装，这里介绍一下如何从硬盘安装linux。这里以Ubuntu&nbsp;&nbsp;Breezy版本为例，其实各个发行版的硬盘安装都是大同小异的：）<br>准备工作<br><a href="http://archive.ubuntu.com/ubuntu/dists/breezy/main/installer-i386/current/images/hd-media/vmlinuz" target=_blank><font color=#35497c>点击下载vmlinuz</font></a><br><a href="http://old.ubuntu.org.cn/download/installformharddisk/grldr" target=_blank><font color=#35497c>点击下载grub</font></a><br><a href="http://archive.ubuntu.com/ubuntu/dists/breezy/main/installer-i386/current/images/hd-media/initrd.gz" target=_blank><font color=#35497c>点击下载initrd.gz</font></a><br><a href="http://releases.ubuntu.com/breezy/ubuntu-5.10-install-i386.iso" target=_blank><font color=#35497c>点击下载Ubuntu ISO</font></a><br>1、解压grub，将grldr文件复制到C:\<br>编辑boot.ini，加上如下句<br><font color=blue>timeout=30<br>C:\GRLDR="GRUB"</font><br>2、将iso文件解压到某一分区<font color=red>根目录</font>下面<font color=blue>(其实可以不用解压缩的，Ubuntu可以直接读取iso文件)</font><br>3、将vmlinuz和initrd.gz拷贝至某一分区<font color=red>根目录</font>下面(<font color=red>不要使用iso文件里面自带的vmlinuz和initrd.gz这个不支持硬盘安装的</font>)<br>4、重启<br><font color=blue>grub&gt;find /vmlinuz得到(hdn,m)接着输入命令：<br>grub&gt;kernel (hdn,m)/vmlinuz root=/dev/ram ramdisk_size=20000 devfs=mount,all<br>grub&gt;initrd (hdn,m)/initrd.gz<br>grub&gt;boot</font><br>5、然后一直next就ok了。注意挂载分区的时候，不要挂载放有iso文件的那个分区，不然会出错的。<br></span></font>
<img src="http://www.cnblogs.com/wayne1017/aggbug/488853.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/wayne1017/archive/2006/08/28/488853.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wayne1017/archive/2006/08/28/488853.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/58878/" target="_blank">Google手机上市74天仅售13.5万部 远少于iPhone</a><span style="color:gray">(2010-03-16 22:54)</span><br/>· <a href="http://news.cnblogs.com/n/58877/" target="_blank">星际争霸2破解进度：实现主机和客户端连接</a><span style="color:gray">(2010-03-16 22:43)</span><br/>· <a href="http://news.cnblogs.com/n/58876/" target="_blank">iPhone、WM、Symbian、Android移动开发前景分析</a><span style="color:gray">(2010-03-16 22:03)</span><br/>· <a href="http://news.cnblogs.com/n/58874/" target="_blank">搜狐旧将樊功臣全面接管搜狗 欲重振搜索业务</a><span style="color:gray">(2010-03-16 21:32)</span><br/>· <a href="http://news.cnblogs.com/n/58873/" target="_blank">腾讯昨推QQ会员官方店 全面向淘宝宣战</a><span style="color:gray">(2010-03-16 21:28)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/58848/" target="_blank">IT蚁族：蜗居和逃离</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>Ubuntu下Eclipse的安装</title><link>http://www.cnblogs.com/wayne1017/archive/2006/08/28/488844.html</link><dc:creator>肥猫</dc:creator><author>肥猫</author><pubDate>Mon, 28 Aug 2006 13:45:00 GMT</pubDate><guid>http://www.cnblogs.com/wayne1017/archive/2006/08/28/488844.html</guid><description><![CDATA[<p>阅读: 7000 评论: 0 作者: <a href="http://www.cnblogs.com/wayne1017/" target="_blank">肥猫</a> 发表于 2006-08-28 21:45 <a href="http://www.cnblogs.com/wayne1017/archive/2006/08/28/488844.html" target="_blank">原文链接</a></p><span style="FONT-SIZE: 14px">很久以前写的一篇linux上配置eclipse的小心得，曾经贴在学校的论坛上。现在也把它放在这儿，算是聚合资源，呵呵<img src="http://bbs.nudt.net/images/smilies/smile.gif" align=absMiddle border=0><br><br>1、首先当然是下载Eclipse的压缩包，这里我下载的是3.1.2版本的<br><font color=#dc143c>eclipseSDK3.1.2：</font><a href="http://eclipse.openwebeng.com/downloads/drops/R-3.1.2-200601181600/eclipse-SDK-3.1.2-linux-gtk.tar.gz" target=_blank><font color=#35497c>点击下载eclipse-SDK-3.1.2</font></a><br>&nbsp; &nbsp; 由于我主要用Eclipse来进行Java的学习，所以我只是下载了下面几个插件。需要注意的是ve的使用必须配合特定版本的emf和gef才能使用。<br><font color=#dc143c>EMF2.1.0：</font><a href="http://mirror.vmmatrix.net/eclipse/tools/emf/downloads/drops/2.1.0/R200507070200/emf-sdo-runtime-2.1.0.zip" target=_blank><font color=#35497c>点击下载emf-2.1.0</font></a><br><font color=#dc143c>GEF3.1：&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; </font><a href="http://mirror.vmmatrix.net/eclipse/tools/gef/downloads/drops/R-3.1-200507071758/GEF-runtime-3.1.zip" target=_blank><font color=#35497c>点击下载gef-3.1</font></a><br><font color=#dc143c>VE1.1.0： </font><a href="http://mirror.vmmatrix.net/eclipse/tools/ve/downloads/drops/R-1.1.0.1-200509071822/VE-SDK-1.1.0.1.zip" target=_blank><font color=#35497c>点击下载ve-1.1.0</font></a><br>当然如果你想用来写C/C++程序则可以下载下面这个插件<br><font color=#dc143c>CDT3.0.2：</font><a href="http://mirror.vmmatrix.net/eclipse/tools/cdt/releases/eclipse3.1/dist/3.0.2/org.eclipse.cdt-3.0.2-linux.x86.tar.gz" target=_blank><font color=#35497c>点击下载cdt-3.0.2</font></a><br><font color=#ff7f50>2、先说一种比较省事的做法：</font><br>&nbsp; &nbsp; 你只需要将下载好的EclipseSDK压缩包和各插件的压缩包解压在任一个文件夹就可以使用Eclipse了。首先进入放有压缩包的目录中，<br><font color=#6495ed>$cd /下载的eclipse-SDK-3.1.2-linux-gtk.tar.gz压缩文件所在目录</font> <br>再执行如下的命令：<br><font color=#6495ed><br>$sudo tar xvfz eclipse-SDK-3.1.2-linux-gtk.tar.gz -C /opt<br>$sudo unzip -d /opt emf-sdo-runtime-2.1.0.zip<br>$sudo unzip -d /opt GEF-runtime-3.1.zip<br>$sudo unzip -d /opt VE-SDK-1.1.0.1.zip<br>$sudo tar xvfz org.eclipse.cdt-3.0.2-linux.x86.tar.gz -C /opt<br></font><br>这个时候，你就可以在 /opt 文件夹中看到出现了一个eclipse的文件夹，双击其中的eclipse文件就可以运行eclipse了。<br>如果你想在菜单栏里出现Eclipse的选项，可以写下面这个文件<br><font color=#6495ed>$gedit ~/.local/share/applications/eclipse-user.desktop</font><br>[Desktop Entry]<br>Comment=Java IDE<br>Name=Eclipse<br>Exec=/opt/eclipse/eclipse<br>Encoding=UTF-8<br>Terminal=false<br>Type=Application<br>Categories=Application;Development;<br>Icon=/opt/eclipse/icon.xpm <br>这种安装Eclipse的方法快速，方便，缺点就是插件不方便管理。因为他们全部都解压缩到plugins和features文件夹里去了，混在一起。<br><font color=#ff00ff>3、一种方便插件管理，且可以加快eclipse启动加载速度的安装方法（虽然繁琐了点，但是推荐^_^） </font><br><font color=#6495ed><br>$sudo mkdir /opt/eclipse/Links<br>$sudo mkdir /opt/eclipse/AddOns<br></font><br>其中Links目录中存放指向各个插件的.link文件，AddOns目录中存放各插件<br><font color=#6495ed><br>$sudo mkdir /opt/eclipse/AddOns/emf<br>$sudo mkdir /opt/eclipse/AddOns/gef<br>$sudo mkdir /opt/eclipse/AddOns/ve<br>$sudo mkdir /opt/eclipse/AddOns/cdt<br></font><br>上述命令创建存放各个插件的具体目录<br><font color=#6495ed><br>$sudo unzip -d /opt/eclipse/AddOns/emf emf-sdo-runtime-2.1.0.zip<br>$sudo unzip -d /opt/eclipse/AddOns/gef GEF-runtime-3.1.zip<br>$sudo unzip -d /opt/eclipse/AddOns/ve VE-SDK-1.1.0.1.zip<br>$sudo tar xvfz org.eclipse.cdt-3.0.2-linux.x86.tar.gz -C /opt/eclipse/AddOns/cdt<br></font><br>上述命令将各插件压缩包解压至对应目录，接下来还需要在各个插件的eclipse目录中生成一个空的.eclipseextension文件<br><font color=#6495ed><br>$sudo vi /opt/eclipse/AddOns/emf/eclipse/.eclipseextension<br>$sudo vi /opt/eclipse/AddOns/gef/eclipse/.eclipseextension<br>$sudo vi /opt/eclipse/AddOns/ve/eclipse/.eclipseextension<br>$sudo vi /opt/eclipse/AddOns/cdt/eclipse/.eclipseextension<br></font><br>接下来去Links目录下为每个插件创建.link文件<br><font color=#6495ed><br>$sudo gedit /opt/eclipse/Links/emf.link<br>　　path=/opt/eclipse/AddOns/emf<br>$sudo gedit /opt/eclipse/Links/gef.link<br>　　path=/opt/eclipse/AddOns/gef<br>$sudo gedit /opt/eclipse/Links/ve.link<br>　　path=/opt/eclipse/AddOns/ve<br>$sudo gedit /opt/eclipse/Links/cdt.link<br>&nbsp; &nbsp; path=/opt/eclipse/AddOns/cdt<br></font><br>如果你想在菜单栏里出现Eclipse的选项，可以写下面这个文件<br><font color=#6495ed>$gedit ~/.local/share/applications/eclipse-user.desktop</font><br>[Desktop Entry]<br>Comment=Java IDE<br>Name=Eclipse<br>Exec=/opt/eclipse/eclipse<br>Encoding=UTF-8<br>Terminal=false<br>Type=Application<br>Categories=Application;Development;<br>Icon=/opt/eclipse/icon.xpm <br>通过这种方式启动eclipse以后，如果eclipse没有识别出来这些插件，可以在选择Help-&gt;Software Updates-&gt;Manage Configuration中设置各个插件的路径即可。<br><font color=#ff0000>大功告成! ^_^哈哈</font><br></span>
<img src="http://www.cnblogs.com/wayne1017/aggbug/488844.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/wayne1017/archive/2006/08/28/488844.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/wayne1017/archive/2006/08/28/488844.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/58878/" target="_blank">Google手机上市74天仅售13.5万部 远少于iPhone</a><span style="color:gray">(2010-03-16 22:54)</span><br/>· <a href="http://news.cnblogs.com/n/58877/" target="_blank">星际争霸2破解进度：实现主机和客户端连接</a><span style="color:gray">(2010-03-16 22:43)</span><br/>· <a href="http://news.cnblogs.com/n/58876/" target="_blank">iPhone、WM、Symbian、Android移动开发前景分析</a><span style="color:gray">(2010-03-16 22:03)</span><br/>· <a href="http://news.cnblogs.com/n/58874/" target="_blank">搜狐旧将樊功臣全面接管搜狗 欲重振搜索业务</a><span style="color:gray">(2010-03-16 21:32)</span><br/>· <a href="http://news.cnblogs.com/n/58873/" target="_blank">腾讯昨推QQ会员官方店 全面向淘宝宣战</a><span style="color:gray">(2010-03-16 21:28)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/58848/" target="_blank">IT蚁族：蜗居和逃离</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>