﻿<?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>IT博客-点滴</title><link>http://www.cnitblog.com/charester/</link><description>

</description><language>zh-cn</language><lastBuildDate>Wed, 06 May 2026 08:46:56 GMT</lastBuildDate><pubDate>Wed, 06 May 2026 08:46:56 GMT</pubDate><ttl>60</ttl><item><title>好久没来了，谢谢大家</title><link>http://www.cnitblog.com/charester/archive/2008/06/05/45025.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 05 Jun 2008 06:23:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2008/06/05/45025.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/45025.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2008/06/05/45025.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/45025.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/45025.html</trackback:ping><description><![CDATA[这个blog是我刚工作的时候开的。好久更新了<br>人懒了。<br>这里大概都以转载为主，我争取多一些原创性的东西<br>
<img src ="http://www.cnitblog.com/charester/aggbug/45025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2008-06-05 14:23 <a href="http://www.cnitblog.com/charester/archive/2008/06/05/45025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络Ghost克隆教程(ZT)</title><link>http://www.cnitblog.com/charester/archive/2007/01/04/21506.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 04 Jan 2007 07:19:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2007/01/04/21506.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21506.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2007/01/04/21506.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21506.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21506.html</trackback:ping><description><![CDATA[ <tr></tr>/TR /&gt;/TR /&gt;TD&gt;/TD /&gt;/TD /&gt;FONT color=#0000ff size=2&gt;1.我们做好一张母盘.并将操作系统目录里的TEMP目录里的东西,以及临时文件夹全部清空.之后将母盘系统备份到另外一块硬盘上.<br /><br />首先确认备份的系统有一个比较大的分区.并确认能装下你的硬盘备份.<br /><br />将准备好的另外一块硬盘挂在你做好的机器上.之后重新启动到DOS模式,启动GHOST.<br /><br />选择LOCAL→DISK→TO IMAGE.<p align="center"><img height="480" src="http://moonfir.51.net/images/001.gif" width="640" border="0" />/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD&gt;/TD /&gt;/TD /&gt;<p align="center"><img height="480" src="http://moonfir.51.net/images/002.gif" width="640" border="0" />/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD&gt;/TD /&gt;/TD /&gt;<p align="center"><img height="480" src="http://moonfir.51.net/images/003.gif" width="640" border="0" />/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD&gt;/TD /&gt;/TD /&gt;<p align="center"><img height="480" src="http://moonfir.51.net/images/004.gif" width="640" border="0" />/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD&gt;/TD /&gt;/TD /&gt;/P&gt;
<p align="center">　</p><p align="center"><img height="480" src="http://moonfir.51.net/images/005.gif" width="640" border="0" />/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD&gt;/TD /&gt;/TD /&gt;/P&gt;
<p align="left">　</p><p align="left"><font color="#0000ff" size="2">2、给文件起个名字...回车.它会问你压缩方式.选NO是不压缩.FAST是快速压缩.HIGH是高压缩率,由于我选的是FAST,而且从来没出过什么问题,在这里也推荐你使用.</font></p><p align="center"><img height="480" src="http://moonfir.51.net/images/006.gif" width="640" border="0" />/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD&gt;/TD /&gt;/TD /&gt;<p><font color="#0000ff" size="2">3、因为FAT32格式分区最大只能识别2G的文件.所以每到达2G时候,会提示你会重新建立文件.</font></p><p align="center"><img height="480" src="http://moonfir.51.net/images/005.gif" width="640" border="0" />/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD&gt;/TD /&gt;/TD /&gt;<p><font color="#0000ff" size="2">4、文件建立完了,我们该建立GHOST服务器了</font></p><p><font color="#0000ff" size="2">启动WINDOWS打开GHOSTSRV.EXE文件.我们讲在后面提供下载,也可以在GHOST企业版里找到.之后给服务器起</font></p><p><font color="#0000ff" size="2">一个名字.我起的名字是shenzi<br /><br />选择克隆客户端<br /><br />之后选择你备份到另外一个硬盘的备份文件.<br /><br />点击 接受客户的按扭</font></p><p align="center"><img height="321" src="http://moonfir.51.net/images/010.gif" width="575" border="0" /></p><p align="center">　/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD&gt;/TD /&gt;/TD /&gt;FONT color=#0000ff size=2&gt;5、好了,现在服务器已经进入接收状态了.<p align="center"><img height="318" src="http://moonfir.51.net/images/011.gif" width="576" border="0" /></p><p align="center">　/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD&gt;/TD /&gt;/TD /&gt;FONT color=#0000ff size=2&gt;6、之后到客户端,就是你准备要克地机器.在GHOST.EXE文件所在的目录里,创建一个WATTCP.CFG的文件.此文件是指定IP以及网关的.如果没有此文件GHOST会自动扫描DHCP服务器.不推荐使用DHCP服务器.所以我们用DOS的命令,EDIT建立一个WATTCP.CFG的文件吧.<p align="center"><img height="400" src="http://moonfir.51.net/images/009.gif" width="640" border="0" /></p><p align="center">　/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD valign="top"&gt;/TD /&gt;/TD /&gt;FONT color=#0000ff size=2&gt;7、好了之后我们建立以下内容<p><font color="#0000ff" size="2">IP=你这台机器所指定的IP.为了避免重复,尽量使用机器号.</font></p><p><font color="#0000ff" size="2">NETMASK=子网掩玛,根据IP规则设置。</font></p><p><font color="#0000ff" size="2">GATEWAY=网关.就是建立了GHOST服务器的IP地址.</font></p><p align="center"><img height="400" src="http://moonfir.51.net/images/007.gif" width="640" border="0" /></p><p>　/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD valign="top"&gt;/TD /&gt;/TD /&gt;FONT color=#0000ff size=2&gt;8、好了,之后驱动网卡.执行RTSPKT空格0X60,0X60是给网卡的一个中断.这里必须给网卡一个中断.否则你也驱动不起你的网卡.我用的中断是0X60.<p align="center"><img height="400" src="http://moonfir.51.net/images/008.gif" width="640" border="0" /></p><p align="left">　/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD valign="top"&gt;/TD /&gt;/TD /&gt;FONT color=#0000ff size=2&gt;9、之后进入GHOST.选择MULTICASTING<p align="center"><img height="480" src="http://moonfir.51.net/images/012.gif" width="640" border="0" /></p><p>　/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD valign="top"&gt;/TD /&gt;/TD /&gt;FONT color=#0000ff size=2&gt;10、它会问你服务器名字.在这里输入你起的服务器名字.按回车<p align="center"><img height="480" src="http://moonfir.51.net/images/018.gif" width="640" border="0" /></p><p>　/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD valign="top"&gt;/TD /&gt;/TD /&gt;FONT color=#0000ff size=2&gt;11、选择硬盘.按回车<p align="center"><img height="480" src="http://moonfir.51.net/images/013.gif" width="640" border="0" /></p><p align="left">　/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD valign="top"&gt;/TD /&gt;/TD /&gt;FONT color=#0000ff size=2&gt;12、在这里可以重新修改分区大小,如果没有特别要求,选择OK继续.<p align="center"><img height="480" src="http://moonfir.51.net/images/015.gif" width="640" border="0" /></p><p>　/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD valign="top"&gt;/TD /&gt;/TD /&gt;FONT color=#0000ff size=2&gt;13、确认开始.选YES,好了,现在你的客户端已经进入接收状态了<p align="center"><img height="480" src="http://moonfir.51.net/images/016.gif" width="640" border="0" /></p><p align="left">　/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD valign="top"&gt;/TD /&gt;/TD /&gt;FONT color=#0000ff size=2&gt;14、等把客户端全部连接上之后,就可以选择开始传送进行网络克隆了.<p align="center"><img height="321" src="http://moonfir.51.net/images/017.gif" width="575" border="0" /></p><p align="left">　/TR /&gt; </p><tr></tr>/TR /&gt;/TR /&gt;TD valign="top"&gt;/TD /&gt;/TD /&gt;FONT color=#0000ff size=2&gt;好了,我们的教程到这里就结束了,不过提醒大家,网络GHOST的机器尽量不要超过50台.如果出现问题,那麻烦的可是你了哦.如果有机器断线,请关闭那台机器等待,大约5分钟后会记为超时.GHOST还会继续运行.另外有一些网卡驱动执行完后会锁住键盘.请大家自己建立批处理文件就可以的。/TR /&gt;<img src ="http://www.cnitblog.com/charester/aggbug/21506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2007-01-04 15:19 <a href="http://www.cnitblog.com/charester/archive/2007/01/04/21506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux/Unix环境下的make和makefile详解(ZT)</title><link>http://www.cnitblog.com/charester/archive/2007/01/04/21504.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 04 Jan 2007 06:55:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2007/01/04/21504.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21504.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2007/01/04/21504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21504.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21504.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Linux/Unix环境下的make和makefile详解　　 																		　　无论是在Linux还是在Unix环境中，make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件，我们都经常要用到make或make install。利用make工具，我们可以将大型的开发项目分解成为多个更易于管理的模块，对于一个包括几百个源文件的应用程序，使用make...&nbsp;&nbsp;<a href='http://www.cnitblog.com/charester/archive/2007/01/04/21504.html'>阅读全文</a><img src ="http://www.cnitblog.com/charester/aggbug/21504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2007-01-04 14:55 <a href="http://www.cnitblog.com/charester/archive/2007/01/04/21504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux操作系统下c语言编程入门(ZT)</title><link>http://www.cnitblog.com/charester/archive/2007/01/04/21503.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 04 Jan 2007 06:50:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2007/01/04/21503.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21503.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2007/01/04/21503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21503.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21503.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: linux操作系统下c语言编程入门								linux操作系统下c语言编程入门 整理编写：007xiong 原文：Hoyt等 								(一)目录介绍 								1)Linux程序设计入门--基础知识 2)Linux程序设计入门--进程介绍 3)Linux程序设计入门--文件操作 4)Linux程序设计入门--时间概念 5)Linux程序设计入门--信号处理 6)Li...&nbsp;&nbsp;<a href='http://www.cnitblog.com/charester/archive/2007/01/04/21503.html'>阅读全文</a><img src ="http://www.cnitblog.com/charester/aggbug/21503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2007-01-04 14:50 <a href="http://www.cnitblog.com/charester/archive/2007/01/04/21503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何阅读源代码(三)(ZT) </title><link>http://www.cnitblog.com/charester/archive/2007/01/02/21427.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Tue, 02 Jan 2007 12:42:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2007/01/02/21427.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21427.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2007/01/02/21427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21427.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21427.html</trackback:ping><description><![CDATA[在parse_record分析完数据之后，做日期的分析，把日志中的月份等数据转换成机器可读（可理解)的数据，并存入到log_rec中去。<br /><br /><br />if ((i&gt;=12)||(rec_min&gt;59)||(rec_sec&gt;59)||(rec_year&lt;1990))<br />{<br />total_bad++; /* if a bad date, bump counter */<br />if (verbose)<br />{<br />fprintf(stderr,"%s: %s [%lu]",<br />msg_bad_date,log_rec.datetime,total_rec);<br />......<br /><br /><br /><br />　　 如果日期，时间错误，则把total_bad计数器增加1，并且打印错误信息到标准错误输出。<br /><br /><br />good_rec = 1;<br />/* get current records timestamp<br />(seconds since epoch) */<br />req_tstamp=cur_tstamp;<br />rec_tstamp=((jdate(rec_day,rec_month,rec_year)-epoch)<br />*86400)+<br />(rec_hour*3600)+(rec_min*60)+rec_sec;<br />/* Do we need to check for duplicate records?<br />(incremental mode) */<br />if (check_dup)<br />{<br />/* check if less than/equal to last record processed */<br />if ( rec_tstamp &lt;= cur_tstamp )<br />{<br />/* if it is, assume we have already<br />processed and ignore it */<br />total_ignore++;<br />continue;<br />}<br />else<br />{<br />/* if it isn't.. disable any more checks this run */<br />check_dup=0;<br />/* now check if it's a new month */<br />if (cur_month != rec_month)<br />{<br />clear_month();<br />cur_sec = rec_sec; /* set current counters */<br />cur_min = rec_min;<br />cur_hour = rec_hour;<br />cur_day = rec_day;<br />cur_month = rec_month;<br />cur_year = rec_year;<br />cur_tstamp= rec_tstamp;<br />f_day=l_day=rec_day; /* reset first and last day */<br />}<br />}<br />}<br />/* check for out of sequence records */<br />if (rec_tstamp/3600 &lt; cur_tstamp/3600)<br />{<br />if (!fold_seq_err &amp;&amp; ((rec_tstamp+SLOP_VAL)<br />/3600<br /><br /><br />　　如果该日期、时间没有错误，则该数据是一个好的数据，将good_record计数器加1，并且检查时间戳，和数据是否重复数据。这里有一个函数，jdate()在主程序一开头我们就遇到了，当时跳了过去没有深究，这里留给读者做一个练习。（提示：该函数根据一个日期产生一个字符串，这个字符串是惟一的，可以检查时间的重复性，是一个通用函数，可以在别的程序中拿来使用）<br /><br /><br />/*********************************************/<br />/* DO SOME PRE-PROCESS FORMATTING */<br />/*********************************************/<br />/* fix URL field */<br />cp1 = cp2 = log_rec.url;<br />/* handle null '-' case here... */<br />if (*++cp1 == '-') { *cp2++ = '-'; *cp2 = ''; }<br />else<br />{<br />/* strip actual URL out of request */<br />while ( (*cp1 != ' ') &amp;&amp; (*cp1 != '') ) cp1++;<br />if (*cp1 != '')<br />{<br />/* scan to begin of actual URL field */<br />while ((*cp1 == ' ') &amp;&amp; (*cp1 != '')) cp1++;<br />/* remove duplicate / if needed */<br />if (( *cp1=='/') &amp;&amp; (*(cp1+1)=='/')) cp1++;<br />while ((*cp1 != ' ')&amp;&amp;(*cp1 != '"')&amp;&amp;(*cp1 != ''))<br />*cp2++ = *cp1++;<br />*cp2 = '';<br />}<br />}<br />/* un-escape URL */<br />unescape(log_rec.url);<br />/* check for service (ie: <a onfocus="this.blur()" href="http://)/" target="_blank"><font color="#000033" size="2">http://)</font></a> and lowercase if found */<br />if ( (cp2=strstr(log_rec.url,"://")) != NULL)<br />{<br />cp1=log_rec.url;<br />while (cp1!=cp2)<br />{<br />if ( (*cp1&gt;='A') &amp;&amp; (*cp1&lt;='Z')) *cp1 += 'a'-'A';<br />cp1++;<br />}<br />}<br />/* strip query portion of cgi scripts */<br />cp1 = log_rec.url;<br />while (*cp1 != '')<br />if (!isurlchar(*cp1)) { *cp1 = ''; break; }<br />else cp1++;<br />if (log_rec.url[0]=='')<br />{ log_rec.url[0]='/'; log_rec.url[1]=''; }<br />/* strip off index.html (or any aliases) */<br />lptr=index_alias;<br />while (lptr!=NULL)<br />{<br />if ((cp1=strstr(log_rec.url,lptr-&gt;string))!=NULL)<br />{<br />if ((cp1==log_rec.url)||(*(cp1-1)=='/'))<br />{<br />*cp1='';<br />if (log_rec.url[0]=='')<br />{ log_rec.url[0]='/'; log_rec.url[1]=''; }<br />break;<br />}<br />}<br />lptr=lptr-&gt;next;<br />}<br />/* unescape referrer */<br />unescape(log_rec.refer);<br />......<br /><br /><br /><br />　　这一段，做了一些URL字符串中的字符转换工作，很长，我个人认为为了程序的模块化，结构化和可复用性，应该将这一段代码改为函数，避免主程序体太长，造成可读性不强和没有移植性，和不够结构化。跳过这一段乏味的代码，进入到下面一个部分---后处理。<br /><br /><br />if (gz_log) gzclose(gzlog_fp);<br />else if (log_fname) fclose(log_fp);<br />if (good_rec) /* were any good records? */<br />{<br />tm_site[cur_day-1]=dt_site; /* If yes, clean up a bit */<br />tm_visit[cur_day-1]=tot_visit(sd_htab);<br />t_visit=tot_visit(sm_htab);<br />if (ht_hit &gt; mh_hit) mh_hit = ht_hit;<br />if (total_rec &gt; (total_ignore+total_bad))<br />/* did we process any? */<br />{<br />if (incremental)<br />{<br />if (save_state()) /* incremental stuff */<br />{<br />/* Error: Unable to save current run data */<br />if (verbose) fprintf(stderr,"%s ",msg_data_err);<br />unlink(state_fname);<br />}<br />}<br />month_update_exit(rec_tstamp); /* calculate exit pages */<br />write_month_html(); /* write monthly HTML file */<br />write_main_index(); /* write main HTML file */<br />put_history(); /* write history */<br />}<br />end_time = times(&amp;mytms);<br />/* display timing totals? */<br />if (time_me' '(verbose&gt;1))<br />{<br />printf("%lu %s ",total_rec, msg_records);<br />if (total_ignore)<br />{<br />printf("(%lu %s",total_ignore,msg_ignored);<br />if (total_bad) printf(", %lu %s) ",total_bad,msg_bad);<br />else printf(") ");<br />}<br />else if (total_bad) printf("(%lu %s) ",total_bad,msg_bad);<br />/* get processing time (end-start) */<br />temp_time = (float)(end_time-start_time)/CLK_TCK;<br />printf("%s %.2f %s", msg_in, temp_time, msg_seconds);<br />/* calculate records per second */<br />if (temp_time)<br />i=( (int)( (float)total_rec/temp_time ) );<br />else i=0;<br />if ( (i&gt;0) &amp;&amp; (i&lt;=total_rec) ) printf(", %d/sec ", i);<br />else printf(" ");<br />}<br /><br /><br /><br />　　这一段，做了一些后期的处理。接下来的部分，我想在本文中略过，留给感兴趣的读者自己去做分析。原因有两点：<br /><br />1、这个程序在前面结构化比较强，而到了结构上后面有些乱，虽然代码效率还是比较高，但是可重用性不够强, 限于篇幅，我就不再一一解释了。 2、前面分析程序过程中，也对后面的代码做了一些预测和估计，也略微涉及到了后面的代码，而且读者可以根据上面提到的原则来自己分析代码，也作为一个实践吧。<br />　　最后，对于在这篇文章中提到的分析源代码程序的一些方法做一下小结，以作为本文的结束。<br /><br />　　分析一个源代码，一个有效的方法是：<br /><br />　　1、阅读源代码的说明文档，比如本例中的README, 作者写的非常的详细，仔细读过之后，在阅读程序的时候往往能够从README文件中找到相应的说明，从而简化了源程序的阅读工作。<br /><br />　　2、如果源代码有文档目录，一般为doc或者docs， 最好也在阅读源程序之前仔细阅读，因为这些文档同样起了很好的说明注释作用。<br /><br />　　3、从makefile文件入手，分析源代码的层次结构，找出哪个是主程序，哪些是函数包。这对于快速把握程序结构有很大帮助。<br /><br />　　4、从main函数入手，一步一步往下阅读，遇到可以猜测出意思来的简单的函数，可以跳过。但是一定要注意程序中使用的全局变量（如果是C程序），可以把关键的数据结构说明拷贝到一个文本编辑器中以便随时查找。<br /><br />　　5、分析函数包（针对C程序），要注意哪些是全局函数，哪些是内部使用的函数，注意extern关键字。对于变量，也需要同样注意。先分析清楚内部函数，再来分析外部函数，因为内部函数肯定是在外部函数中被调用的。<br /><br />　　6、需要说明的是数据结构的重要性：对于一个C程序来说，所有的函数都是在操作同一些数据，而由于没有较好的封装性，这些数据可能出现在程序的任何地方，被任何函数修改，所以一定要注意这些数据的定义和意义，也要注意是哪些函数在对它们进行操作，做了哪些改变。<br /><br />　　7、在阅读程序的同时，最好能够把程序存入到cvs之类的版本控制器中去，在需要的时候可以对源代码做一些修改试验，因为动手修改是比仅仅是阅读要好得多的读程序的方法。在你修改运行程序的时候，可以从cvs中把原来的代码调出来与你改动的部分进行比较(diff命令), 可以看出一些源代码的优缺点并且能够实际的练习自己的编程技术。<br /><br />　　8、阅读程序的同时，要注意一些小工具的使用，能够提高速度，比如vi中的查找功能，模式匹配查找，做标记，还有grep，find这两个最强大最常用的文本搜索工具的使用。<br /><br />　　对于一个Unix/Linux下面以命令行方式运行的程序，有这么一些套路，大家可以在阅读程序的时候作为参考。<br /><br />　　1、在程序开头，往往都是分析命令行，根据命令行参数对一些变量或者数组，或者结构赋值，后面的程序就是根据这些变量来进行不同的操作。<br /><br />　　2、分析命令行之后，进行数据准备，往往是计数器清空，结构清零等等。<br /><br />　　3、在程序中间有一些预编译选项，可以在makefile中找到相应部分。<br /><br />　　4、注意程序中对于日志的处理，和调试选项打开的时候做的动作，这些对于调试程序有很大的帮助。<br /><br />　　5、注意多线程对数据的操作。（这在本例中没有涉及）<br /><img src ="http://www.cnitblog.com/charester/aggbug/21427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2007-01-02 20:42 <a href="http://www.cnitblog.com/charester/archive/2007/01/02/21427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何阅读源代码(二)(ZT) </title><link>http://www.cnitblog.com/charester/archive/2007/01/02/21426.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Tue, 02 Jan 2007 12:41:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2007/01/02/21426.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21426.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2007/01/02/21426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21426.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21426.html</trackback:ping><description><![CDATA[我们所阅读的这个软件是用来分析日志并且做出统计的，那么这个函数的名字已经告诉了我们，这是一个初始化计数器的函数。简略的看看吧！<br /><br /><br />$ grep init_counters *.h<br />webalizer.h:extern void init_counters();<br />在webalizer.c中找到：<br />void init_counters()<br />{<br />int i;<br />for (i=0;i<br /><br /><br />　　根据在最开始读过的README文件，这个page_type是用来定义处理的页面的类型的。在README文件中，<br /><br /><br />-P name Page type. This is the extension of files you consider to<br />be pages for Pages calculations (sometimes called 'pageviews').<br />The default is 'htm*' and 'cgi' (plus whatever HTMLExtension<br />you specified if it is different). Don't use a period!<br /><br /><br /><br />　　我们在程序中也可以看到，如果没有在命令行中或者config文件中指定，则根据处理的日志文件的类型来添加缺省的文件类型。比如对于CLF文件(WWW日志)，处理html, htm, cgi文件<br /><br /><br />if (log_type == LOG_FTP)<br />{<br />/* disable stuff for ftp logs */<br />ntop_entry=ntop_exit=0;<br />ntop_search=0;<br />}<br />else<br />.....<br />这一段是对于FTP的日志格式，设置搜索列表。<br />for (i=0;i<br /><br /><br />　　清空哈西表，为下面即将进行的排序工作做好准备。关于哈西表，这是数据结构中常用的一种用来快速排序的结构，如果不清楚，可以参考相关书籍，比如清华的&lt;&lt;数据结构&gt;&gt;教材或者&lt;&lt;数据结构的C++实现&gt;&gt;等书。<br /><br /><br />if (verbose&gt;1)<br />{<br />uname(&amp;system_info);<br />printf("Webalizer V%s-%s (%s %s) %s ",<br />version,editlvl,system_info.sysname,<br />system_info.release,language);<br />}<br /><br /><br /><br />　　这一段，是打印有关系统的信息和webalizer程序的信息（可以参考uname的函数说明）。<br /><br /><br />#ifndef USE_DNS<br />if (strstr(argv[0],"webazolver")!=0)<br />{<br />printf("DNS support not present, aborting... ");<br />exit(1);<br />}<br />#endif /* USE_DNS */<br /><br /><br /><br />　　这一段，回忆我们在看README文件的时候，曾经提到过可以在编译的时候设置选项开关来设定DNS支持，在源代码中可以看到多次这样的代码段出现，如果不指定DNS支持，这些代码段则会出现（ifdef)或者不出现(ifndef).下面略过这些代码段，不再重复。<br /><br /><br />/* open log file */<br />if (gz_log)<br />{<br />gzlog_fp = gzopen(log_fname,"rb");<br />if (gzlog_fp==Z_NULL)<br />{<br />/* Error: Can't open log file ... */<br />fprintf(stderr, "%s %s ",msg_log_err,log_fname);<br />exit(1);<br />}<br />}<br />else<br />{<br />if (log_fname)<br />{<br />log_fp = fopen(log_fname,"r");<br />if (log_fp==NULL)<br />{<br />/* Error: Can't open log file ... */<br />fprintf(stderr, "%s %s ",msg_log_err,log_fname);<br />exit(1);<br />}<br />}<br />}<br /><br /><br /><br />　　这一段，回忆在README文件中曾经读到过，如果log文件是gzip压缩格式，则用gzopen函数打开（可以猜想gz***是一套针对gzip压缩格式的实时解压缩函数），如果不是，则用fopen打开。<br /><br /><br />/* switch directories if needed */<br />if (out_dir)<br />{<br />if (chdir(out_dir) != 0)<br />{<br />/* Error: Can't change directory to ... */<br />fprintf(stderr, "%s %s ",msg_dir_err,out_dir);<br />exit(1);<br />}<br />}<br /><br /><br /><br />　　同样，回忆在README文件中读到过，如果参数行有-o out_dir, 则将输出结果到该目录，否则，则输出到当前目录。在这一段中，如果输出目录不存在(chdir(out_dir) != 0)则出错。<br /><br /><br />#ifdef USE_DNS<br />if (strstr(argv[0],"webazolver")!=0)<br />{<br />if (!dns_children) dns_children=5; /* default dns children if needed */<br />if (!dns_cache)<br />{<br />/* No cache file specified, aborting... */<br />fprintf(stderr,"%s ",msg_dns_nocf); /* Must have a cache file */<br />exit(1);<br />}<br />}<br />......<br /><br /><br /><br />　　在上面曾经提到过，这是DNS解析的代码部分，可以略过不看，不会影响对整个程序的理解。<br /><br /><br />/* prep hostname */<br />if (!hname)<br />{<br />if (uname(&amp;system_info)) hname="localhost";<br />else hname=system_info.nodename;<br />}<br /><br /><br /><br />　　这一段继续处理参数做准备工作。如果在命令行中指定了hostname(机器名）则采用指定的名称，否则调用uname查找机器名，如果没有，则用localhost来作为机器名。(同样在README中说得很详细）<br /><br /><br />/* get past history */<br />if (ignore_hist) {if (verbose&gt;1) printf("%s ",msg_ign_hist); }<br />else get_history();<br /><br /><br /><br />　　如果在命令行中指定了忽略历史文件，则不读取历史文件，否则调用get_history()来读取历史数据。在这里，我们可以回想在README文件中同样说过这一细节，在命令行或者配置文件中都能指定这一开关。需要说明的是，我们在这里并不一定需要去看get_history这一函数，因为从函数的名称，README文件和程序注释都能很清楚的得知这一函数的功能，不一定要去看代码。而如果要猜想的话，也可以想到，history是webalizer在上次运行的时候记录下来的一个文件，而这个文件则是去读取它，并将它的数据包括到这次的分析中去。不信，我们可以来看看。<br /><br /><br />void get_history()<br />{<br />int i,numfields;<br />FILE *hist_fp;<br />char buffer[BUFSIZE];<br /><br />/* first initalize internal array */<br />for (i=0;i&lt;12;i++)<br />{<br />hist_month[i]=hist_year[i]=hist_fday[i]=hist_lday[i]=0;<br />hist_hit[i]=hist_files[i]=hist_site[i]=hist_page[i]=hist_visit[i]=0;<br />hist_xfer[i]=0.0;<br />}<br />hist_fp=fopen(hist_fname,"r");<br />if (hist_fp)<br />{<br />if (verbose&gt;1) printf("%s %s ",msg_get_hist,hist_fname);<br />while ((fgets(buffer,BUFSIZE,hist_fp)) != NULL)<br />{<br />i = atoi(buffer) -1;<br />if (i&gt;11)<br />{<br />if (verbose)<br />fprintf(stderr,"%s (mth=%d) ",msg_bad_hist,i+1);<br />continue;<br />}<br />/* month# year# requests files sites xfer firstday lastday */<br />numfields = sscanf(buffer,"%d %d %lu %lu %lu %lf %d %d %lu %lu",<br />&amp;hist_month[i],<br />&amp;hist_year[i],<br />&amp;hist_hit[i],<br />&amp;hist_files[i],<br />&amp;hist_site[i],<br />&amp;hist_xfer[i],<br />&amp;hist_fday[i],<br />&amp;hist_lday[i],<br />&amp;hist_page[i],<br />&amp;hist_visit[i]);<br /><br />if (numfields==8) /* kludge for reading 1.20.xx history files */<br />{<br />hist_page[i] = 0;<br />hist_visit[i] = 0;<br />}<br />}<br />fclose(hist_fp);<br />}<br />else if (verbose&gt;1) printf("%s ",msg_no_hist);<br />}<br />/*********************************************/<br />/* PUT_HISTORY - write out history file */<br />/*********************************************/<br />void put_history()<br />{<br />int i;<br />FILE *hist_fp;<br /><br />hist_fp = fopen(hist_fname,"w");<br /><br />if (hist_fp)<br />{<br />if (verbose&gt;1) printf("%s ",msg_put_hist);<br />for (i=0;i&lt;12;i++)<br />{<br />if ((hist_month[i] != 0) &amp;&amp; (hist_hit[i] != 0))<br />{<br />fprintf(hist_fp,"%d %d %lu %lu %lu %.0f %d %d %lu %lu ",<br />hist_month[i],<br />hist_year[i],<br />hist_hit[i],<br />hist_files[i],<br />hist_site[i],<br />hist_xfer[i],<br />hist_fday[i],<br />hist_lday[i],<br />hist_page[i],<br />hist_visit[i]);<br />}<br />}<br />fclose(hist_fp);<br />}<br />else<br />if (verbose)<br />fprintf(stderr,"%s %s ",msg_hist_err,hist_fname);<br />}<br /><br /><br /><br />　　在preserve.c中，这两个函数是成对出现的。get_history()读取文件中的数据，并将其记录到hist_开头的一些数组中去。而put_history()则是将一些数据记录到同样的数组中去。我们可以推测得知，hist_数组是全局变量（在函数中没有定义），也可以查找源代码验证。同样，我们可以找一找put_history()出现的地方，来验证刚才的推测是否正确。在webalizer.c的1311行，出现：<br /><br /><br />month_update_exit(rec_tstamp); /* calculate exit pages */<br />write_month_html(); /* write monthly HTML file */<br />write_main_index(); /* write main HTML file */<br />put_history(); /* write history */<br />可以知道，推测是正确的。再往下读代码，<br />if (incremental) /* incremental processing? */<br />{<br />if ((i=restore_state())) /* restore internal data structs */<br />{<br />/* Error: Unable to restore run data (error num) */<br />/* if (verbose) fprintf(stderr,"%s (%d) ",msg_bad_data,i); */<br />fprintf(stderr,"%s (%d) ",msg_bad_data,i);<br />exit(1);<br />}<br />......<br />}<br /><br /><br /><br />　　同样，这也是处理命令行和做数据准备，而且和get_history(), put_history()有些类似，读者可以自己练习一下。下面，终于进入了程序的主体部分, 在做完了命令行分析，数据准备之后，开始从日志文件中读取数据并做分析了。<br /><br /><br />/*********************************************/<br />/* MAIN PROCESS LOOP - read through log file */<br />/*********************************************/<br /><br />while ( (gz_log)?(our_gzgets(gzlog_fp,buffer,BUFSIZE) != Z_NULL):<br />(fgets(buffer,BUFSIZE,log_fname?log_fp:stdin) != NULL))<br /><br /><br /><br />　　我看到这里的时候，颇有一些不同意作者的这种写法。这一段while中的部分写的比较复杂而且效率不高。因为从程序推断和从他的代码看来，作者是想根据日志文件的类型不同来采用不同的方法读取文件，如果是gzip格式，则用our_gzgets来读取其中一行，如果是普通的文本文件格式，则用fgets()来读取。但是，这段代码是写在while循环中的，每次读取一行就要重复判断一次，明显是多余的而且降低了程序的性能。可以在while循环之前做一次这样的判断，然后就不用重复了。<br /><br /><br />total_rec++;<br />if (strlen(buffer) == (BUFSIZE-1))<br />{<br />if (verbose)<br />{<br />fprintf(stderr,"%s",msg_big_rec);<br />if (debug_mode) fprintf(stderr,": %s",buffer);<br />else fprintf(stderr," ");<br />}<br />total_bad++; /* bump bad record counter */<br />/* get the rest of the record */<br />while ( (gz_log)?(our_gzgets(gzlog_fp,buffer,BUFSIZE)!=Z_NULL):<br />(fgets(buffer,BUFSIZE,log_fname?log_fp:stdin)!=NULL))<br />{<br />if (strlen(buffer) &lt; BUFSIZE-1)<br />{<br />if (debug_mode &amp;&amp; verbose) fprintf(stderr,"%s ",buffer);<br />break;<br />}<br />if (debug_mode &amp;&amp; verbose) fprintf(stderr,"%s",buffer);<br />}<br />continue; /* go get next record if any */<br />}<br /><br /><br /><br />　　这一段代码，读入一行，如果这一行超过了程序允许的最大字符数（则是错误的日志数据纪录），则跳过本行剩下的数据，忽略掉（continue进行下一次循环）。同时把total_bad增加一个。如果没有超过程序允许的最大字符数（则是正确的日志数据纪录），则<br /><br /><br />/* got a record... */<br />strcpy(tmp_buf, buffer); /* save buffer in case of error */<br />if (parse_record(buffer)) /* parse the record */<br /><br /><br /><br />　　将该数据拷贝到一个缓冲区中，然后调用parse_record()进行处理。我们可以同样的推测一下，get_record()是这个程序的一个主要处理部分，分析了日志数据。在parse_record.c中，有此函数，<br /><br /><br />/*********************************************/<br />/* PARSE_RECORD - uhhh, you know... */<br />/*********************************************/<br />int parse_record(char *buffer)<br />{<br />/* clear out structure */<br />memset(&amp;log_rec,0,sizeof(struct log_struct));<br />/*<br />log_rec.hostname[0]=0;<br />log_rec.datetime[0]=0;<br />log_rec.url[0]=0;<br />log_rec.resp_code=0;<br />log_rec.xfer_size=0;<br />log_rec.refer[0]=0;<br />log_rec.agent[0]=0;<br />log_rec.srchstr[0]=0;<br />log_rec.ident[0]=0;<br />*/<br />#ifdef USE_DNS<br />memset(&amp;log_rec.addr,0,sizeof(struct in_addr));<br />#endif<br /><br />/* call appropriate handler */<br />switch (log_type)<br />{<br />default:<br />case LOG_CLF: return parse_record_web(buffer); break;<br />/* clf */<br />case LOG_FTP: return parse_record_ftp(buffer); break;<br />/* ftp */<br />case LOG_SQUID: return parse_record_squid(buffer); break;<br />/* squid */<br />}<br />}<br /><br /><br /><br />　　可以看到，log_rec是一个全局变量，该函数根据日志文件的类型，分别调用三种不同的分析函数。在webalizer.h中，找到该变量的定义，从结构定义中可以看到，结构定义了一个日志文件所可能包含的所有信息（参考CLF，FTP, SQUID日志文件的格式说明）。<br /><br /><br />/* log record structure */<br />struct log_struct { char hostname[MAXHOST]; /* hostname */<br />char datetime[29]; /* raw timestamp */<br />char url[MAXURL]; /* raw request field */<br />int resp_code; /* response code */<br />u_long xfer_size; /* xfer size in bytes */<br />#ifdef USE_DNS<br />struct in_addr addr; /* IP address structure */<br />#endif /* USE_DNS */<br />char refer[MAXREF]; /* referrer */<br />char agent[MAXAGENT]; /* user agent (browser) */<br />char srchstr[MAXSRCH]; /* search string */<br />char ident[MAXIDENT]; }; /* ident string (user) */<br /><br />extern struct log_struct log_rec;<br /><br /><br /><br />　　先看一下一个parser.c用的内部函数，然后再来以parse_record_web()为例子看看这个函数是怎么工作的，parse_record_ftp, parse_record_squid留给读者自己分析作为练习。<br /><br /><br />/*********************************************/<br />/* FMT_LOGREC - terminate log fields w/zeros */<br />/*********************************************/<br />void fmt_logrec(char *buffer)<br />{<br />char *cp=buffer;<br />int q=0,b=0,p=0;<br /><br />while (*cp != '')<br />{<br />/* break record up, terminate fields with '' */<br />switch (*cp)<br />{<br />case ' ': if (b || q || p) break; *cp=''; break;<br />case '"': q^=1; break;<br />case '[': if (q) break; b++; break;<br />case ']': if (q) break; if (b&gt;0) b--; break;<br />case '(': if (q) break; p++; break;<br />case ')': if (q) break; if (p&gt;0) p--; break;<br />}<br />cp++;<br />}<br />}<br /><br /><br /><br />　　从parser.h头文件中就可以看到，这个函数是一个内部函数，这个函数把一行字符串中间的空格字符用''字符（结束字符）来代替，同时考虑了不替换在双引号，方括号，圆括号中间的空格字符以免得将一行数据错误的分隔开了。（请参考WEB日志的文件格式，可以更清楚的理解这一函数）<br /><br /><br />int parse_record_web(char *buffer)<br />{<br />int size;<br />char *cp1, *cp2, *cpx, *eob, *eos;<br />size = strlen(buffer); /* get length of buffer */<br />eob = buffer+size; /* calculate end of buffer */<br />fmt_logrec(buffer); /* seperate fields with 's */<br />/* HOSTNAME */<br />cp1 = cpx = buffer; cp2=log_rec.hostname;<br />eos = (cp1+MAXHOST)-1;<br />if (eos &gt;= eob) eos=eob-1;<br />while ( (*cp1 != '') &amp;&amp; (cp1 != eos) ) *cp2++ = *cp1++;<br />*cp2 = '';<br />if (*cp1 != '')<br />{<br />if (verbose)<br />{<br />fprintf(stderr,"%s",msg_big_host);<br />if (debug_mode) fprintf(stderr,": %s ",cpx);<br />else fprintf(stderr," ");<br />}<br />while (*cp1 != '') cp1++;<br />}<br />if (cp1 &lt; eob) cp1++;<br />/* skip next field (ident) */<br />while ( (*cp1 != '') &amp;&amp; (cp1 &lt; eob) ) cp1++;<br />if (cp1 &lt; eob) cp1++;<br />/* IDENT (authuser) field */<br />cpx = cp1;<br />cp2 = log_rec.ident;<br />eos = (cp1+MAXIDENT-1);<br />if (eos &gt;= eob) eos=eob-1;<br />while ( (*cp1 != '[') &amp;&amp; (cp1 &lt; eos) ) /* remove embeded spaces */<br />{<br />if (*cp1=='') *cp1=' ';<br />*cp2++=*cp1++;<br />}<br />*cp2--='';<br />if (cp1 &gt;= eob) return 0;<br />/* check if oversized username */<br />if (*cp1 != '[')<br />{<br />if (verbose)<br />{<br />fprintf(stderr,"%s",msg_big_user);<br />if (debug_mode) fprintf(stderr,": %s ",cpx);<br />else fprintf(stderr," ");<br />}<br />while ( (*cp1 != '[') &amp;&amp; (cp1 &lt; eob) ) cp1++;<br />}<br />/* strip trailing space(s) */<br />while (*cp2==' ') *cp2--='';<br />/* date/time string */<br />cpx = cp1;<br />cp2 = log_rec.datetime;<br />eos = (cp1+28);<br />if (eos &gt;= eob) eos=eob-1;<br />while ( (*cp1 != '') &amp;&amp; (cp1 != eos) ) *cp2++ = *cp1++;<br />*cp2 = '';<br />if (*cp1 != '')<br />{<br />if (verbose)<br />{<br />fprintf(stderr,"%s",msg_big_date);<br />if (debug_mode) fprintf(stderr,": %s ",cpx);<br />else fprintf(stderr," ");<br />}<br />while (*cp1 != '') cp1++;<br />}<br />if (cp1 &lt; eob) cp1++;<br />/* minimal sanity check on timestamp */<br />if ( (log_rec.datetime[0] != '[') ||<br />(log_rec.datetime[3] != '/') ||<br />(cp1 &gt;= eob)) return 0;<br />/* HTTP request */<br />cpx = cp1;<br />cp2 = log_rec.url;<br />eos = (cp1+MAXURL-1);<br />if (eos &gt;= eob) eos = eob-1;<br />while ( (*cp1 != '') &amp;&amp; (cp1 != eos) ) *cp2++ = *cp1++;<br />*cp2 = '';<br />if (*cp1 != '')<br />{<br />if (verbose)<br />{<br />fprintf(stderr,"%s",msg_big_req);<br />if (debug_mode) fprintf(stderr,": %s ",cpx);<br />else fprintf(stderr," ");<br />}<br />while (*cp1 != '') cp1++;<br />}<br />if (cp1 &lt; eob) cp1++;<br />if ( (log_rec.url[0] != '"') ||<br />(cp1 &gt;= eob) ) return 0;<br />/* response code */<br />log_rec.resp_code = atoi(cp1);<br />/* xfer size */<br />while ( (*cp1 != '') &amp;&amp; (cp1 &lt; eob) ) cp1++;<br />if (cp1 &lt; eob) cp1++;<br />if (*cp1&lt;'0'||*cp1&gt;'9') log_rec.xfer_size=0;<br />else log_rec.xfer_size = strtoul(cp1,NULL,10);<br />/* done with CLF record */<br />if (cp1&gt;=eob) return 1;<br />while ( (*cp1 != '') &amp;&amp; (*cp1 != ' ') &amp;&amp; (cp1 &lt; eob) )<br />cp1++;<br />if (cp1 &lt; eob) cp1++;<br />/* get referrer if present */<br />cpx = cp1;<br />cp2 = log_rec.refer;<br />eos = (cp1+MAXREF-1);<br />if (eos &gt;= eob) eos = eob-1;<br />while ( (*cp1 != '') &amp;&amp; (*cp1 != ' ') &amp;&amp; (cp1 != eos) )<br />*cp2++ = *cp1++;<br />*cp2 = '';<br />if (*cp1 != '')<br />{<br />if (verbose)<br />{<br />fprintf(stderr,"%s",msg_big_ref);<br />if (debug_mode) fprintf(stderr,": %s ",cpx);<br />else fprintf(stderr," ");<br />}<br />while (*cp1 != '') cp1++;<br />}<br />if (cp1 &lt; eob) cp1++;<br />cpx = cp1;<br />cp2 = log_rec.agent;<br />eos = cp1+(MAXAGENT-1);<br />if (eos &gt;= eob) eos = eob-1;<br />while ( (*cp1 != '') &amp;&amp; (cp1 != eos) )<br />*cp2++ = *cp1++;<br />*cp2 = '';<br />return 1; /* maybe a valid record, return with TRUE */<br />}<br /><br /><br /><br />　　该函数，一次读入一行（其实是一段日志数据中间的一个域，因为该行数据已经被fmt_logrec分开成多行数据了。根据CLF中的定义，检查该数据并将其拷贝到log_rec结构中去，如果检查该数据有效，则返回1。回到主程序,<br /><br /><br />/* convert month name to lowercase */<br />for (i=4;i&lt;7;i++)<br />log_rec.datetime[i]=tolower(log_rec.datetime[i]);<br />/* get year/month/day/hour/min/sec values */<br />for (i=0;i&lt;12;i++)<br />{<br />if (strncmp(log_month[i],&amp;log_rec.datetime[4],3)==0)<br />{ rec_month = i+1; break; }<br />}<br />rec_year=atoi(&amp;log_rec.datetime[8]);<br />/* get year number (int) */<br />rec_day =atoi(&amp;log_rec.datetime[1]);<br />/* get day number */<br />rec_hour=atoi(&amp;log_rec.datetime[13]);<br />/* get hour number */<br />rec_min =atoi(&amp;log_rec.datetime[16]);<br />/* get minute number */<br />rec_sec =atoi(&amp;log_rec.datetime[19]);<br />/* get second number */<br />....<br /><img src ="http://www.cnitblog.com/charester/aggbug/21426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2007-01-02 20:41 <a href="http://www.cnitblog.com/charester/archive/2007/01/02/21426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何阅读源代码(一)(ZT)</title><link>http://www.cnitblog.com/charester/archive/2007/01/02/21425.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Tue, 02 Jan 2007 12:39:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2007/01/02/21425.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21425.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2007/01/02/21425.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21425.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21425.html</trackback:ping><description><![CDATA[由于工作的关系，我常常需要读一些源代码，并在上面做一些修改并且拿来使用，或者是借鉴其中的某些部分。可以说，open source对于程序员来说，是很有意义的事情。根据我的经验，读源代码，至少有3个好处。第一个好处是可以学习到很多编程的方法，看好的源代码，对于提高自己的编程水平，比自己写源代码的帮助更大。当然不是说不用自己写，而是说，自己写代码的同时，可以从别人写的好的源代码中间学习到更多的编程方法和技巧。第二个好处是，可以提高自己把握大规模源代码的能力。一个比较大型的程序，往往都是经过了很多个版本很长的时间，有很多人参与开发，修正错误，添加功能而发展起来的。所以往往源代码的规模都比较大，少则10-100多k, 多的有好几十个MB. 在阅读大量源代码的时候，能够提高自己对大的软件的把握能力，快速了解脉络，熟悉细节，不仅仅是编程技巧，还能在程序的架构，设计方面提高自己的能力。（这里说一句题外话，&lt;&lt;设计模式&gt;&gt;这本书相信很多人都看过，而且很多人对它推崇备至，奉为经典。现在也出了不少书，都是冠以"设计模式"这一名称。在书中就提到，设计模式并不是一本教材，不是教你如何去编程序，而是把平时编程中一些固定的模式记录下来，加以不断的测试和改进，分发给广大程序员的一些经验之谈。我在看这本书的时候，有一些地方一些设计方法往往让我有似曾相识的感觉，另外一些则是我以前就常常用到的。而这些经验的获得，一部分得益于自己的编码过程，另外一个很重要的来源就是阅读别人写的源代码。)阅读源代码第三个好处，就是获得一些好的思想。比如，有很多人在开始一个软件项目之前都喜欢到sourceforge.net上去找一下，是否有人以前做过相同或者相似的软件，如果有，则拿下来读一读，可以使自己对这个软件项目有更多更深的认识。我以前曾经想找一本关于如何阅读源代码的书来看看，却没有找到。相反，倒是找到了不少分析源代码的书，比如Linux kernel, Apache source, 等等。所以我想，为什么不自己来写下一些经验和大家交流呢？（当然不是写书，没有那个能力也没有那个时间。）所以在这里我准备用一个例子来写一下如何阅读源代码，分享一些经验，算是抛砖引玉吧！<br /><br />　　我找的例子是一个统计日志的工具，webalizer. (这个工具我以前用过，似乎记得以前的版本是用perl写的，不知道现在为什么作者把它完全修改成了C，可能是为了效率，也可能根本就是我记错了。）之所以选择这个软件来作为例子，一方面是因为它是用C写的，流程比较简单，没有C++的程序那么多的枝节，而且软件功能不算复杂，代码规模不大，能够在一篇文章的篇幅里面讲完; 另外一个方面是因为恰巧前段时间我因为工作的关系把它拿来修改了一下，刚看过，还没有忘记。 :-)我采用的例子是webalizer2.01-09, 也可以到它的网站<a onfocus="this.blur()" href="http://www.mrunix.net/webalizer/" target="_blank"><font color="#000033" size="2">http://www.mrunix.net/webalizer/</font></a> 下载最新的版本。这是一个用C写的，处理文本文件（简单的说是这样，实际上它支持三种日志文本格式：CLF, FTP, SQUID), 并且用html的方式输出结果。读者可以自己去下载它的源代码包，并一边读文章，一边看程序。解压缩它的tar包(我download的是它的源代码tar包），在文件目录中看到这样的结果：<br /><br /><br />$ ls<br />aclocal.m4 dns_resolv.c lang output.h webalizer.1<br />CHANGES dns_resolv.h lang.h parser.c webalizer.c<br />configure graphs.c linklist.c parser.h webalizer.h<br />configure.in graphs.h linklist.h preserve.c webalizer_lang.h<br />COPYING hashtab.c Makefile.in preserve.h webalizer.LSM<br />Copyright hashtab.h Makefile.std README webalizer.png<br />country-codes.txt INSTALL msfree.png README.FIRST<br />DNS.README install-sh output.c sample.conf<br /><br /><br /><br />　　首先，我阅读了它的README(这是很重要的一个环节）, 大体了解了软件的功能，历史状况，修改日志，安装方法等等。然后是安装并且按照说明中的缺省方式来运行它，看看它的输出结果。(安装比较简单，因为它带了一个configure, 在没有特殊情况出现的时候，简单的./configure, make, make install就可以安装好。)然后就是阅读源代码了。我从makefile开始入手（我觉得这是了解一个软件的最好的方法）在makefile开头，有这些内容：<br /><br /><br />prefix = /usr/local<br />exec_prefix = ${prefix}<br />BINDIR = ${exec_prefix}/bin<br />MANDIR = ${prefix}/man/man1<br />ETCDIR = /etc<br />CC = gcc<br />CFLAGS = -Wall -O2<br />LIBS = -lgd -lpng -lz -lm<br />DEFS = -DETCDIR="/etc" -DHAVE_GETOPT_H=1 -DHAVE_MATH_H=1<br />LDFLAGS=<br />INSTALL= /usr/bin/install -c<br />INSTALL_PROGRAM=${INSTALL}<br />INSTALL_DATA=${INSTALL} -m 644<br /># where are the GD header files?<br />GDLIB=/usr/include<br /><br /><br /><br />　　这些定义了安装的路径，执行程序的安装路径，编译器，配置文件的安装路径，编译的选项，安装程序，安装程序的选项等等。要注意的是，这些并不是软件的作者写的，而是./configure的输出结果。呵呵. :-)下面才是主题内容，也是我们关心的。<br /><br /><br /># Shouldn't have to touch below here!<br />all: webalizer<br />webalizer: webalizer.o webalizer.h hashtab.o hashtab.h<br />linklist.o linklist.h preserve.o preserve.h<br />dns_resolv.o dns_resolv.h parser.o parser.h<br />output.o output.h graphs.o graphs.h lang.h<br />webalizer_lang.h<br />$(CC) ${LDFLAGS} -o webalizer webalizer.o hashtab.o linklist.o preserv<br />e.o parser.o output.o dns_resolv.o graphs.o ${LIBS}<br />rm -f webazolver<br />ln -s webalizer webazolver<br />webalizer.o: webalizer.c webalizer.h parser.h output.h preserve.h<br />graphs.h dns_resolv.h webalizer_lang.h<br />$(CC) ${CFLAGS} ${DEFS} -c webalizer.c<br />parser.o: parser.c parser.h webalizer.h lang.h<br />$(CC) ${CFLAGS} ${DEFS} -c parser.c<br />hashtab.o: hashtab.c hashtab.h dns_resolv.h webalizer.h lang.h<br />$(CC) ${CFLAGS} ${DEFS} -c hashtab.c<br />linklist.o: linklist.c linklist.h webalizer.h lang.h<br />$(CC) ${CFLAGS} ${DEFS} -c linklist.c<br />output.o: output.c output.h webalizer.h preserve.h<br />hashtab.h graphs.h lang.h<br />$(CC) ${CFLAGS} ${DEFS} -c output.c<br />preserve.o: preserve.c preserve.h webalizer.h parser.h<br />hashtab.h graphs.h lang.h<br />$(CC) ${CFLAGS} ${DEFS} -c preserve.c<br />dns_resolv.o: dns_resolv.c dns_resolv.h lang.h webalizer.h<br />$(CC) ${CFLAGS} ${DEFS} -c dns_resolv.c<br />graphs.o: graphs.c graphs.h webalizer.h lang.h<br />$(CC) ${CFLAGS} ${DEFS} -I${GDLIB} -c graphs.c<br /><br /><br /><br />　　好了，不用再往下看了，这些就已经足够了。从这里我们可以看到这个软件的几个源代码文件和他们的结构。webalizer.c是主程序所在的文件，其他的是一些辅助程序模块。对比一下目录里面的文件，<br /><br /><br />$ ls *.c *.h<br />dns_resolv.c graphs.h lang.h output.c parser.h webalizer.c<br />dns_resolv.h hashtab.c linklist.c output.h preserve.c webalizer.h<br />graphs.c hashtab.h linklist.h parser.c preserve.h webalizer_lang.h<br /><br /><br /><br />　　于是，让我们从webalizer.c开始吧。<br /><br />　　作为一个C程序，在头文件里面，和C文件里面定义的extern变量，结构等等肯定不会少，但是，单独看这些东西我们不可能对这个程序有什么认识。所以，从main函数入手，逐步分析，在需要的时候再回头来看这些数据结构定义才是好的方法。（顺便说一句，Visual C++, 等windows下的IDE工具提供了很方便的方法来获取函数列表，C++的类列表以及资源文件，对于阅读源代码很有帮助。Unix/Linux也有这些工具，但是，我们在这里暂时不说，而只是通过最简单的文本编辑器vi来讲)。跳过webalizer.c开头的版权说明部分（GPL的），和数据结构定义，全局变量声明部分，直接进入main()函数。在函数开头，我们看到：<br /><br /><br />/* initalize epoch */<br />epoch=jdate(1,1,1970); /* used for timestamp adj. */<br />/* add default index. alias */<br />add_nlist("index.",&amp;index_alias);<br /><br /><br /><br />　　这两个函数暂时不用仔细看，后面会提到，略过。<br /><br /><br />sprintf(tmp_buf,"%s/webalizer.conf",ETCDIR);<br />/* check for default config file */<br />if (!access("webalizer.conf",F_OK))<br />get_config("webalizer.conf");<br />else if (!access(tmp_buf,F_OK))<br />get_config(tmp_buf);<br /><br /><br /><br />　　从注释和程序本身可以看出，这是查找是否存在一个叫做webalizer.conf的配置文件，如果当前目录下有，则用get_config来读入其中内容，如果没有，则查找ETCDIR/webalizer.conf是否存在。如果都没有，则进入下一部分。(注意：ETCDIR = @ETCDIR@在makefile中有定义）<br /><br /><br />/* get command line options */<br />opterr = 0; /* disable parser errors */<br />while ((i=getopt(argc,argv,"a:A:c:C:dD:e:E:fF:<br />g:GhHiI:l:Lm:M:n:N:o:pP:qQr:R:s:S:t:Tu:U:vVx:XY"))!=EOF)<br />{<br />switch (i)<br />{<br />case 'a': add_nlist(optarg,&amp;hidden_agents); break;<br />/* Hide agents */<br />case 'A': ntop_agents=atoi(optarg); break;<br />/* Top agents */<br />case 'c': get_config(optarg); break;<br />/* Config file */<br />case 'C': ntop_ctrys=atoi(optarg); break;<br />/* Top countries */<br />case 'd': debug_mode=1; break;<br />/* Debug */<br />case 'D': dns_cache=optarg; break;<br />/* DNS Cache filename */<br />case 'e': ntop_entry=atoi(optarg); break;<br />/* Top entry pages */<br />case 'E': ntop_exit=atoi(optarg); break;<br />/* Top exit pages */<br />case 'f': fold_seq_err=1; break;<br />/* Fold sequence errs */<br />case 'F': log_type=(optarg[0]=='f')?<br />LOG_FTP:(optarg[0]=='s')?<br />LOG_SQUID:LOG_CLF; break;<br />/* define log type */<br />case 'g': group_domains=atoi(optarg); break;<br />/* GroupDomains (0=no) */<br />case 'G': hourly_graph=0; break;<br />/* no hourly graph */<br />case 'h': print_opts(argv[0]); break;<br />/* help */<br />case 'H': hourly_stats=0; break;<br />/* no hourly stats */<br />case 'i': ignore_hist=1; break;<br />/* Ignore history */<br />case 'I': add_nlist(optarg,&amp;index_alias); break;<br />/* Index alias */<br />case 'l': graph_lines=atoi(optarg); break;<br />/* Graph Lines */<br />case 'L': graph_legend=0; break;<br />/* Graph Legends */<br />case 'm': visit_timeout=atoi(optarg); break;<br />/* Visit Timeout */<br />case 'M': mangle_agent=atoi(optarg); break;<br />/* mangle user agents */<br />case 'n': hname=optarg; break;<br />/* Hostname */<br />case 'N': dns_children=atoi(optarg); break;<br />/* # of DNS children */<br />case 'o': out_dir=optarg; break;<br />/* Output directory */<br />case 'p': incremental=1; break;<br />/* Incremental run */<br />case 'P': add_nlist(optarg,&amp;page_type); break;<br />/* page view types */<br />case 'q': verbose=1; break;<br />/* Quiet (verbose=1) */<br />case 'Q': verbose=0; break;<br />/* Really Quiet */<br />case 'r': add_nlist(optarg,&amp;hidden_refs); break;<br />/* Hide referrer */<br />case 'R': ntop_refs=atoi(optarg); break;<br />/* Top referrers */<br />case 's': add_nlist(optarg,&amp;hidden_sites); break;<br />/* Hide site */<br />case 'S': ntop_sites=atoi(optarg); break;<br />/* Top sites */<br />case 't': msg_title=optarg; break;<br />/* Report title */<br />case 'T': time_me=1; break; /* TimeMe */<br />case 'u': add_nlist(optarg,&amp;hidden_urls); break;<br />/* hide URL */<br />case 'U': ntop_urls=atoi(optarg); break;<br />/* Top urls */<br />case 'v':<br />case 'V': print_version(); break;<br />/* Version */<br />case 'x': html_ext=optarg; break;<br />/* HTML file extension */<br />case 'X': hide_sites=1; break;<br />/* Hide ind. sites */<br />case 'Y': ctry_graph=0; break;<br />/* Supress ctry graph */<br />}<br />}<br />if (argc - optind != 0) log_fname = argv[optind];<br />if ( log_fname &amp;&amp; (log_fname[0]=='-')) log_fname=NULL;<br />/* force STDIN? */<br />/* check for gzipped file - .gz */<br />if (log_fname) if (!strcmp((log_fname+strlen(log_fname)-3),".gz"))<br />gz_log=1;<br /><br /><br /><br />　　这一段是分析命令行参数及开关。（getopt()的用法我在另外一篇文章中讲过，这里就不再重复了。）可以看到，这个软件虽然功能不太复杂，但是开关选项还是不少。大多数的unix/linux程序的开头部分都是这个套路，初始化配置文件，并且读入分析命令行。在这段程序中，我们需要注意一个函数：add_nlist(). print_opts(), get_config()等等一看就明白，就不用多讲了。这里我们已经是第二次遇到add_nlist这个函数了，就仔细看看吧。<br /><br /><br />$ grep add_nlist *.h<br />linklist.h:extern int add_nlist(char *, NLISTPTR *);<br />/* add list item */<br /><br /><br /><br />　　可以发现它定义在linklist.h中。<br /><br />　　在这个h文件中，当然会有一些数据结构的定义，比如：<br /><br /><br />struct nlist { char string[80];<br />/* list struct for HIDE items */<br />struct nlist *next; };<br />typedef struct nlist *NLISTPTR;<br />struct glist { char string[80];<br />/* list struct for GROUP items */<br />char name[80];<br />struct glist *next; };<br />typedef struct glist *GLISTPTR;<br /><br /><br /><br />　　这是两个链表结构。还有<br /><br /><br />extern GLISTPTR group_sites ; /* "group" lists */<br />extern GLISTPTR group_urls ;<br />extern GLISTPTR group_refs ;<br /><br /><br /><br />　　这些都是链表， 太多了，不用一一看得很仔细，因为目前也看不出来什么东西。当然要注意它们是extern的， 也就是说，可以在其他地方(文件）看到它们的数值（类似于C++中的public变量）。这里还定义了4个函数：<br /><br /><br />extern char *isinlist(NLISTPTR, char *);<br />/* scan list for str */<br />extern char *isinglist(GLISTPTR, char *);<br />/* scan glist for str */<br />extern int add_nlist(char *, NLISTPTR *);<br />/* add list item */<br />extern int add_glist(char *, GLISTPTR *);<br />/* add group list item */<br /><br /><br /><br />　　注意，这些都是extern的，也就是说，可以在其他地方见到它们的调用(有点相当于C++中的public函数）。再来看看linklist.c，<br /><br /><br />NLISTPTR new_nlist(char *); /* new list node */<br />void del_nlist(NLISTPTR *); /* del list */<br /><br />GLISTPTR new_glist(char *, char *); /* new group list node */<br />void del_glist(GLISTPTR *); /* del group list */<br />int isinstr(char *, char *);<br /><br /><br /><br />　　这5个函数是内部使用的（相当于C++中的private), 也就是说，这些函数只被isinlist(NLISTPTR, char *), isinglist(GLISTPTR, char *), add_nlist(char *, NLISTPTR *), add_glist(char *, GLISTPTR *)调用，而不会出现在其他地方。所以，我们先来看这几个内部函数。举例来说，<br /><br /><br />add_nlist(char *)<br />NLISTPTR new_nlist(char *str)<br />{<br />NLISTPTR newptr;<br />if (sizeof(newptr-&gt;string) &lt; strlen(str))<br />{<br />if (verbose)<br />fprintf(stderr,"[new_nlist] %s ",msg_big_one);<br />}<br />if (( newptr = malloc(sizeof(struct nlist))) != NULL)<br />{strncpy(newptr-&gt;string, str, sizeof(newptr-&gt;string));<br />newptr-&gt;next=NULL;}<br />return newptr;<br />}<br /><br /><br /><br />　　这个函数分配了一个struct nlist, 并且把其中的string赋值为str, next赋值为NULL.这实际上是创建了链表中的一个节点。verbose是一个全局变量，定义了输出信息的类型，如果verbose为1，则输出很详细的信息，否则输出简略信息。这是为了调试或者使用者详细了解程序情况来用的。不是重要内容，虽然我们常常可以在这个源程序的其他地方看到它。另外一个函数：<br /><br /><br />void del_nlist(NLISTPTR *list)<br />{<br />NLISTPTR cptr,nptr;<br />cptr=*list;<br />while (cptr!=NULL)<br />{<br />nptr=cptr-&gt;next;<br />free(cptr);<br />cptr=nptr;<br />}<br />}<br /><br /><br /><br />　　这个函数删除了一个nlist（也可能是list所指向的那一个部分开始知道链表结尾），比较简单。看完了这两个内部函数，可以来看<br /><br /><br />/*********************************************/<br />/* ADD_NLIST - add item to FIFO linked list */<br />/*********************************************/<br />int add_nlist(char *str, NLISTPTR *list)<br />{<br />NLISTPTR newptr,cptr,pptr;<br />if ( (newptr = new_nlist(str)) != NULL)<br />{<br />if (*list==NULL) *list=newptr;<br />else<br />{<br />cptr=pptr=*list;<br />while(cptr!=NULL) { pptr=cptr; cptr=cptr-&gt;next; };<br />pptr-&gt;next = newptr;<br />}<br />}<br />return newptr==NULL;<br />}<br /><br /><br /><br />　　这个函数是建立了一个新的节点，把参数str赋值给新节点的string, 并把它连接到list所指向链表的结尾。另外的三个函数：new_glist(), del_glist(), add_glist()完成的功能和上述三个差不多，所不同的只是它们所处理的数据结构不同。看完了这几个函数，我们回到main程序。接下来是，<br /><br /><br />/* setup our internal variables */<br />init_counters(); /* initalize main counters */<br /><br /><br /><img src ="http://www.cnitblog.com/charester/aggbug/21425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2007-01-02 20:39 <a href="http://www.cnitblog.com/charester/archive/2007/01/02/21425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入理解C语言指针(ZT)</title><link>http://www.cnitblog.com/charester/archive/2007/01/02/21424.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Tue, 02 Jan 2007 12:37:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2007/01/02/21424.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21424.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2007/01/02/21424.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21424.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21424.html</trackback:ping><description><![CDATA[指针的概念 <br /><br />　　指针是一个特殊的变量，它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容：指针的类型，指针所指向的 类型，指针的值或者叫指针所指向的内存区，还有指针本身所占据的内存区。让我们分别说明。 <br /><br />　　先声明几个指针放着做例子： <br /><br />　　例一： <br /><br />　　(1)int*ptr; <br /><br />　　(2)char*ptr; <br /><br />　　(3)int**ptr; <br /><br />　　(4)int(*ptr)[3]; <br /><br />　　(5)int*(*ptr)[4]; <br /><br /><br />　　指针的类型<br /><br />　　从语法的角度看，你只要把指针声明语句里的指针名字去掉，剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型： <br /><br />　　(1)int*ptr;//指针的类型是int* <br /><br />　　(2)char*ptr;//指针的类型是char* <br /><br />　　(3)int**ptr;//指针的类型是int** <br /><br />　　(4)int(*ptr)[3];//指针的类型是int(*)[3] <br /><br />　　(5)int*(*ptr)[4];//指针的类型是int*(*)[4] <br /><br />　　<br />　　指针所指向的类型<br /><br />　　当你通过指针来访问指针所指向的内存区时，指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。 <br /><br />　　从语法上看，你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉，剩下的就是指针所指向的类型。例如： <br /><br />　　(1)int*ptr;//指针所指向的类型是int <br /><br />　　(2)char*ptr;//指针所指向的的类型是char <br /><br />　　(3)int**ptr;//指针所指向的的类型是int* <br /><br />　　(4)int(*ptr)[3];//指针所指向的的类型是int()[3] <br /><br />　　(5)int*(*ptr)[4];//指针所指向的的类型是int*()[4] <br /><br />　　在指针的算术运算中，指针所指向的类型有很大的作用。 <br /><br />　　指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时，你会发现，把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念，是精通指针的关键点之一。我看了不少书，发现有些写得差的书中，就把指针的这两个概念搅在一起了，所以看起书来前后矛盾，越看越糊涂。 <br /><br />　　<br /><br /><br /><br />指针的值，或者叫指针所指向的内存区或地址<br /><br />　　指针的值是指针本身存储的数值，这个值将被编译器当作一个地址，而不是一个一般的数值。在32位程序里，所有类型的指针的值都是一个32位整数，因为32位程序里内存地址全都是32位长。 指针所指向的内存区就是从指针的值所代表的那个内存地址开始，长度为si zeof(指针所指向的类型)的一片内存区。以后，我们说一个指针的值是XX，就相当于说该指针指向了以XX为首地址的一片内存区域；我们说一个指针指向了某块内存区域，就相当于说该指针的值是这块内存区域的首地址。 <br /><br />　　指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中，指针所指向的类型已经有了，但由于指针还未初始化，所以它所指向的内存区是不存在的，或者说是无意义的。 <br /><br />　　以后，每遇到一个指针，都应该问问：这个指针的类型是什么？指针指的类型是什么？该指针指向了哪里？ <br /><br />　　指针本身所占据的内存区<br /><br />　　指针本身占了多大的内存？你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里，指针本身占据了4个字节的长度。 <br /><br />　　指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。<br /><br /><br /><br />指针的算术运算 <br /><br />　　指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如： <br /><br />　　例二： <br /><br />　　1、chara[20]; <br /><br />　　2、int*ptr=a; <br /><br />　　... <br /><br />　　... <br /><br />　　3、ptr++; <br /><br />　　在上例中，指针ptr的类型是int*,它指向的类型是int，它被初始化为指向整形变量a。接下来的第3句中，指针ptr被加了1，编译器是这样处理的：它把指针ptr的值加上了sizeof(int)，在32位程序中，是被加上了4。由于地址是用字节做单位的，故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。 <br />由于char类型的长度是一个字节，所以，原来ptr是指向数组a的第0号单元开始的四个字节，此时指向了数组a中从第4号单元开始的四个字节。 <br /><br />　　我们可以用一个指针和一个循环来遍历一个数组，看例子：<br /><br />　　例三： <br /><br /><br />intarray[20]; <br />int*ptr=array; <br />... <br />//此处略去为整型数组赋值的代码。 <br />... <br />for(i=0;i&lt;20;i++) <br />{ <br />　(*ptr)++; <br />　ptr++； <br />} <br /><br /><br />　　这个例子将整型数组中各个单元的值加1。由于每次循环都将指针ptr加1，所以每次循环都能访问数组的下一个单元。 <br /><br />　　再看例子： <br /><br />　　例四： <br /><br />　　1、chara[20]; <br /><br />　　2、int*ptr=a; <br /><br />　　... <br />　　... <br /><br />　　3、ptr+=5;<br /><br />　　在这个例子中，ptr被加上了5，编译器是这样处理的：将指针ptr的值加上5乘sizeof(int)，在32位程序中就是加上了5乘4=20。由于地址的单位是字节，故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说，向高地址方向移动了20个字节。在这个例子中，没加5前的ptr指向数组a的第0号单元开始的四个字节，加5后，ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问题，但在语法上却是可以的。这也体现出了指针的灵活性。 <br /><br />　　如果上例中，ptr是被减去5，那么处理过程大同小异，只不过ptr的值是被减去5乘sizeof(int)，新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。 <br /><br />　　总结一下，一个指针ptrold加上一个整数n后，结果是一个新的指针ptrnew，ptrnew的类型和ptrold的类型相同，ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节。就是说，ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。 <br /><br />　　一个指针ptrold减去一个整数n后，结果是一个新的指针ptrnew，ptrnew的类型和ptrold的类型相同，ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值减少了n乘sizeof(ptrold所指向的类型)个字节，就是说，ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。<br /><br /><br /><br />运算符&amp;和* <br /><br /><br />　　这里&amp;是取地址运算符，*是...书上叫做"间接运算符"。 <br /><br />　　&amp;a的运算结果是一个指针，指针的类型是a的类型加个*，指针所指向的类型是a的类型，指针所指向的地址嘛，那就是a的地址。 <br /><br />　　*p的运算结果就五花八门了。总之*p的结果是p所指向的东西，这个东西有这些特点：它的类型是p指向的类型，它所占用的地址是p所指向的地址。 <br /><br />　　例五： <br /><br /><br />inta=12; <br />intb; <br />int*p; <br />int**ptr; <br />p=&amp;a;<br />//&amp;a的结果是一个指针，类型是int*，指向的类型是int，指向的地址是a的地址。 <br />*p=24;<br />//*p的结果，在这里它的类型是int，它所占用的地址是p所指向的地址，显然，*p就是变量a。 <br />ptr=&amp;p;<br />//&amp;p的结果是个指针，该指针的类型是p的类型加个*，在这里是int **。该指针所指向的类型是p的类型，这里是int*。该指针所指向的地址就是指针p自己的地址。 <br />*ptr=&amp;b;<br />//*ptr是个指针，&amp;b的结果也是个指针，且这两个指针的类型和所指向的类型是一样的，所以用&amp;b来给*ptr赋值就是毫无问题的了。 <br />**ptr=34;<br />//*ptr的结果是ptr所指向的东西，在这里是一个指针，对这个指针再做一次*运算，结果就是一个int类型的变量。 <br /><br /><br />指针表达式 <br /><br />　　一个表达式的最后结果如果是一个指针，那么这个表达式就叫指针表式。 <br /><br />　　下面是一些指针表达式的例子： <br /><br />　　例六： <br /><br /><br />inta,b; <br />intarray[10]; <br />int*pa; <br />pa=&amp;a;//&amp;a是一个指针表达式。 <br />int**ptr=&amp;pa;//&amp;pa也是一个指针表达式。 <br />*ptr=&amp;b;//*ptr和&amp;b都是指针表达式。 <br />pa=array; <br />pa++;//这也是指针表达式。 <br /><br /><br />　　例七： <br /><br /><br />char*arr[20]; <br />char**parr=arr;//如果把arr看作指针的话，arr也是指针表达式 <br />char*str; <br />str=*parr;//*parr是指针表达式 <br />str=*(parr+1);//*(parr+1)是指针表达式 <br />str=*(parr+2);//*(parr+2)是指针表达式 <br /><br /><br />　　由于指针表达式的结果是一个指针，所以指针表达式也具有指针所具有的四个要素：指针的类型，指针所指向的类型，指针指向的内存区，指针自身占据的内存。<br /><br />　　好了，当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话，这个指针表达式就是一个左值，否则就不是一个左值。 <br /><br />　　在例七中，&amp;a不是一个左值，因为它还没有占据明确的内存。*ptr是一个左值，因为*ptr这个指针已经占据了内存，其实*ptr就是指针pa，既然pa已经在内存中有了自己的位置，那么*ptr当然也有了自己的位置。 <br /><br />　　数组和指针的关系 <br /><br />　　如果对声明数组的语句不太明白的话，请参阅我前段时间贴出的文章&lt;&lt;如何理解c和c++的复杂类型声明&gt;&gt;。 <br /><br />　　数组的数组名其实可以看作一个指针。看下例： <br /><br />　　例八： <br /><br /><br />intarray[10]={0,1,2,3,4,5,6,7,8,9},value; <br />... <br />... <br />value=array[0];//也可写成：value=*array; <br />value=array[3];//也可写成：value=*(array+3); <br />value=array[4];//也可写成：value=*(array+4); <br /><br /><br />　　上例中，一般而言数组名array代表数组本身，类型是int[10]，但如果把array看做指针的话，它指向数组的第0个单元，类型是int*，所指向的类型是数组单元的类型即int。因此*array等于0就一点也不奇怪了。同理，array+3是一个指向数组第3个单元的指针，所以*(array+3)等于3。其它依此类推。 <br /><br /><br />例九： <br /><br /><br />char*str[3]={ <br />　"Hello,thisisasample!", <br />　"Hi,goodmorning.", <br />　"Helloworld" <br />}; <br />chars[80]； <br />strcpy(s,str[0]);//也可写成strcpy(s,*str); <br />strcpy(s,str[1]);//也可写成strcpy(s,*(str+1)); <br />strcpy(s,str[2]);//也可写成strcpy(s,*(str+2)); <br /><br /><br />　　上例中，str是一个三单元的数组，该数组的每个单元都是一个指针，这些指针各指向一个字符串。把指针数组名str当作一个指针的话，它指向数组的第0号单元，它的类型是char**，它指向的类型是char*。 <br />*str也是一个指针，它的类型是char*，它所指向的类型是char，它指向的地址是字符串"Hello,thisisasample!"的第一个字符的地址，即'H'的地址。 str+1也是一个指针，它指向数组的第1号单元，它的类型是char**，它指向的类型是char*。 <br /><br />　　*(str+1)也是一个指针，它的类型是char*，它所指向的类型是char，它指向 "Hi,goodmorning."的第一个字符'H'，等等。 <br /><br />　　下面总结一下数组的数组名的问题。声明了一个数组TYPEarray[n]，则数组名称array就有了两重含义：第一，它代表整个数组，它的类型是TYPE[n]；第二 ，它是一个指针，该指针的类型是TYPE*，该指针指向的类型是TYPE，也就是数组单元的类型，该指针指向的内存区就是数组第0号单元，该指针自己占有单独的内存区，注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的，即类似array++的表达式是错误的。 <br /><br />　　在不同的表达式中数组名array可以扮演不同的角色。 <br /><br />　　在表达式sizeof(array)中，数组名array代表数组本身，故这时sizeof函数测出的是整个数组的大小。 <br />在表达式*array中，array扮演的是指针，因此这个表达式的结果就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。 <br /><br />　　表达式array+n（其中n=0，1，2，....。）中，array扮演的是指针，故array+n的结果是一个指针，它的类型是TYPE*，它指向的类型是TYPE，它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。 <br /><br />　　例十： <br /><br /><br />intarray[10]; <br />int(*ptr)[10]; <br />ptr=&amp;array; <br /><br /><br />　　上例中ptr是一个指针，它的类型是int(*)[10]，他指向的类型是int[10] ，我们用整个数组的首地址来初始化它。在语句ptr=&amp;array中，array代表数组本身。 <br /><br />　　本节中提到了函数sizeof()，那么我来问一问，sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小？答案是前者。例如： <br /><br />int(*ptr)[10]; <br /><br />　　则在32位程序中，有： <br /><br /><br />sizeof(int(*)[10])==4 <br />sizeof(int[10])==40 <br />sizeof(ptr)==4 <br /><br /><br />　　实际上，sizeof(对象)测出的都是对象自身的类型的大小，而不是别的什么类型的大小。<br /><br />　　指针和结构类型的关系 <br /><br /><br />　　可以声明一个指向结构类型对象的指针。 <br /><br />　　例十一： <br /><br /><br />structMyStruct <br />{ <br />　inta; <br />　intb; <br />　intc; <br />} <br />MyStructss={20,30,40};<br />//声明了结构对象ss，并把ss的三个成员初始化为20，30和40。 <br />MyStruct*ptr=&amp;ss;<br />//声明了一个指向结构对象ss的指针。它的类型是MyStruct*,它指向的类型是MyStruct。 <br />int*pstr=(int*)&amp;ss;<br />//声明了一个指向结构对象ss的指针。但是它的类型和它指向的类型和ptr是不同的。 <br /><br /><br />　　请问怎样通过指针ptr来访问ss的三个成员变量？ <br /><br />答案： <br /><br />ptr-&gt;a; <br />ptr-&gt;b; <br />ptr-&gt;c; <br /><br />　　又请问怎样通过指针pstr来访问ss的三个成员变量？ <br /><br />　　答案： <br /><br />*pstr；//访问了ss的成员a。 <br />*(pstr+1);//访问了ss的成员b。 <br />*(pstr+2)//访问了ss的成员c。 <br /><br />　　虽然我在我的MSVC++6.0上调式过上述代码，但是要知道，这样使用pstr来访问结构成员是不正规的，为了说明为什么不正规，让我们看看怎样通过指针来访问数组的各个单元： <br /><br />　　例十二： <br /><br />intarray[3]={35,56,37}; <br />int*pa=array; <br /><br />　　通过指针pa访问数组array的三个单元的方法是： <br /><br />*pa;//访问了第0号单元 <br />*(pa+1);//访问了第1号单元 <br />*(pa+2);//访问了第2号单元 <br /><br />　　从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样。 <br /><br />　　所有的C/C++编译器在排列数组的单元时，总是把各个数组单元存放在连续的存储区里，单元和单元之间没有空隙。但在存放结构对象的各个成员时，在某种编译环境下，可能会需要字对齐或双字对齐或者是别的什么对齐，需要在相邻两个成员之间加若干个"填充字节"，这就导致各个成员之间可能会有若干个字节的空隙。 <br /><br />　　所以，在例十二中，即使*pstr访问到了结构对象ss的第一个成员变量a，也不能保证*(pstr+1)就一定能访问到结构成员b。因为成员a和成员b之间可能会有若干填充字节，说不定*(pstr+1)就正好访问到了这些填充字节呢。这也证明了指针的灵活性。要是你的目的就是想看看各个结构成员之间到底有没有填充字节，嘿，这倒是个不错的方法。 <br /><br />　　通过指针访问结构成员的正确方法应该是象例十二中使用指针ptr的方法。<br /><br /><br /><br />指针和函数的关系 <br /><br />　　可以把一个指针声明成为一个指向函数的指针。 <br /><br /><br />intfun1(char*,int); <br />int(*pfun1)(char*,int); <br />pfun1=fun1; <br />.... <br />.... <br />inta=(*pfun1)("abcdefg",7);//通过函数指针调用函数。 <br /><br /><br />　　可以把指针作为函数的形参。在函数调用语句中，可以用指针表达式来作为实参。 <br /><br />　　例十三： <br /><br /><br />intfun(char*); <br />inta; <br />charstr[]="abcdefghijklmn"; <br />a=fun(str); <br />... <br />... <br />intfun(char*s) <br />{ <br />intnum=0; <br />for(inti=0;i{ <br />num+=*s;s++; <br />} <br />returnnum; <br />} <br /><br /><br />　　这个例子中的函数fun统计一个字符串中各个字符的ASCII码值之和。前面说了，数组的名字也是一个指针。在函数调用中，当把str作为实参传递给形参s后，实际是把str的值传递给了s，s所指向的地址就和str所指向的地址一致，但是str和s各自占用各自的存储空间。在函数体内对s进行自加1运算，并不意味着同时对str进行了自加1运算。<br /><br />指针类型转换 <br /><br /><br />　　当我们初始化一个指针或给一个指针赋值时，赋值号的左边是一个指针，赋值号的右边是一个指针表达式。在我们前面所举的例子中，绝大多数情况下，指针的类型和指针表达式的类型是一样的，指针所指向的类型和指针表达式所指向的类型是一样的。 <br /><br />　　例十四： <br /><br />　　1、floatf=12.3; <br /><br />　　2、float*fptr=&amp;f; <br /><br />　　3、int*p; <br />　<br />　　在上面的例子中，假如我们想让指针p指向实数f，应该怎么搞？是用下面的语句吗？ <br /><br />　　p=&amp;f; <br /><br />　　不对。因为指针p的类型是int*，它指向的类型是int。表达式&amp;f的结果是一个指针，指针的类型是float*,它指向的类型是float。两者不一致，直接赋值的方法是不行的。至少在我的MSVC++6.0上，对指针的赋值语句要求赋值号两边的类型一致，所指向的类型也一致，其它的编译器上我没试过，大家可以试试。为了实现我们的目的，需要进行"强制类型转换"： <br /><br /><br />p=(int*)&amp;f; <br /><br /><br />　　如果有一个指针p，我们需要把它的类型和所指向的类型改为TYEP*TYPE， 那么语法格式是： <br /><br />　　(TYPE*)p； <br /><br />　　这样强制类型转换的结果是一个新指针，该新指针的类型是TYPE*，它指向的类型是TYPE，它指向的地址就是原指针指向的地址。而原来的指针p的一切属性都没有被修改。 <br /><br />　　一个函数如果使用了指针作为形参，那么在函数调用语句的实参和形参的结合过程中，也会发生指针类型的转换。 <br /><br />　　例十五： <br /><br /><br />voidfun(char*); <br />inta=125,b; <br />fun((char*)&amp;a); <br />... <br />... <br />voidfun(char*s) <br />{ <br />charc; <br />c=*(s+3);*(s+3)=*(s+0);*(s+0)=c; <br />c=*(s+2);*(s+2)=*(s+1);*(s+1)=c; <br />} <br />} <br /><br /><br />　　注意这是一个32位程序，故int类型占了四个字节，char类型占一个字节。函数fun的作用是把一个整数的四个字节的顺序来个颠倒。注意到了吗？在函数调用语句中，实参&amp;a的结果是一个指针，它的类型是int*，它指向的类型是int。形参这个指针的类型是char*，它指向的类型是char。这样，在实参和形参的结合过程中，我们必须进行一次从int*类型到char*类型的转换。结合这个例子，我们可以这样来想象编译器进行转换的过程：编译器先构造一个临时指针char*temp， 然后执行temp=(char*)&amp;a，最后再把temp的值传递给s。所以最后的结果是：s的类型是char*,它指向的类型是char，它指向的地址就是a的首地址。 <br /><br />我们已经知道，指针的值就是指针指向的地址，在32位程序中，指针的值其实是一个32位整数。那可不可以把一个整数当作指针的值直接赋给指针呢？就象下面的语句： <br /><br /><br />unsignedinta; <br />TYPE*ptr;//TYPE是int，char或结构类型等等类型。 <br />... <br />... <br />a=20345686; <br />ptr=20345686;//我们的目的是要使指针ptr指向地址20345686（十进制 <br />） <br />ptr=a;//我们的目的是要使指针ptr指向地址20345686（十进制） <br /><br /><br />　　编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能达到了吗？不，还有办法： <br /><br /><br />unsignedinta; <br />TYPE*ptr;//TYPE是int，char或结构类型等等类型。 <br />... <br />... <br />a=某个数，这个数必须代表一个合法的地址； <br />ptr=(TYPE*)a；//呵呵，这就可以了。 <br /><br /><br />　　严格说来这里的(TYPE*)和指针类型转换中的(TYPE*)还不一样。这里的(TYPE*)的意思是把无符号整数a的值当作一个地址来看待。上面强调了a的值必须代表一个合法的地址，否则的话，在你使用ptr的时候，就会出现非法操作错误。 <br /><br />　　想想能不能反过来，把指针指向的地址即指针的值当作一个整数取出来。完 全可以。下面的例子演示了把一个指针的值当作一个整数取出来，然后再把这个整数当作一个地址赋给一个指针： <br /><br />　　例十六： <br /><br /><br />inta=123,b; <br />int*ptr=&amp;a; <br />char*str; <br />b=(int)ptr;//把指针ptr的值当作一个整数取出来。 <br />str=(char*)b;//把这个整数的值当作一个地址赋给指针str。 <br /><br /><br />　　现在我们已经知道了，可以把指针的值当作一个整数取出来，也可以把一个整数值当作地址赋给一个指针。 <br /><br />　　指针的安全问题 <br /><br />　　看下面的例子： <br /><br />　　例十七： <br /><br /><br />chars='a'; <br />int*ptr; <br />ptr=(int*)&amp;s; <br />*ptr=1298； <br /><br />　　指针ptr是一个int*类型的指针，它指向的类型是int。它指向的地址就是s的首地址。在32位程序中，s占一个字节，int类型占四个字节。最后一条语句不但改变了s所占的一个字节，还把和s相临的高地址方向的三个字节也改变了。这三个字节是干什么的？只有编译程序知道，而写程序的人是不太可能知道的。也许这三个字节里存储了非常重要的数据，也许这三个字节里正好是程序的一条代码，而由于你对指针的马虎应用，这三个字节的值被改变了！这会造成崩溃性的错误。 <br /><br />　　让我们再来看一例： <br /><br />　　例十八： <br /><br />　　1、chara; <br /><br />　　2、int*ptr=&amp;a; <br /><br />　　... <br />　　... <br /><br />　　3、ptr++; <br /><br />　　4、*ptr=115; <br /><br />　　该例子完全可以通过编译，并能执行。但是看到没有？第3句对指针ptr进行自加1运算后，ptr指向了和整形变量a相邻的高地址方向的一块存储区。这块存储区里是什么？我们不知道。有可能它是一个非常重要的数据，甚至可能是一条代码。而第4句竟然往这片存储区里写入一个数据！这是严重的错误。所以在使用指针时，程序员心里必须非常清楚：我的指针究竟指向了哪里。在用指针访问数组的时候，也要注意不要超出数组的低端和高端界限，否则也会造成类似的错误。 <br /><br />　　在指针的强制类型转换：ptr1=(TYPE*)ptr2中，如果sizeof(ptr2的类型)大于sizeof(ptr1的类型)，那么在使用指针ptr1来访问ptr2所指向的存储区时是安全的。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型)，那么在使用指针ptr1来访问ptr2所指向的存储区时是不安全的。至于为什么，读者结合例十七来想一想，应该会明白的。<br /><img src ="http://www.cnitblog.com/charester/aggbug/21424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2007-01-02 20:37 <a href="http://www.cnitblog.com/charester/archive/2007/01/02/21424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Bugzilla安装指南(ZT)</title><link>http://www.cnitblog.com/charester/archive/2006/12/28/21242.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 28 Dec 2006 13:10:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/28/21242.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21242.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/28/21242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21242.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21242.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a href="http://my.donews.com/stevenyu/2005/11/30/bugzilla%e5%ae%89%e8%a3%85%e6%8c%87%e5%8d%97/" rel="bookmark">
						<font color="#0066ff">Bugzilla安装指南</font>
				</a>
		</div>
		<div class="postText">
				<!-- Content Start -->
				<p>
						<font color="#0066ff">
						</font> </p>
				<ol>
						<li>
								<div align="left">
										<font face="宋体, SimSun">准备</font>
								</div>
						</li>
				</ol>
				<p>Bugzilla<font face="宋体, SimSun">在</font>Windows<font face="宋体, SimSun">下的安装颇为复杂，所以有很多人写了安装指南。但是使用安装的时候发现每个指南写的都有缺陷。这里我仅仅是把我安装的过程记录下来，给大家一个参考。同时还列出了一些我觉得有帮助的参考文章和站点。</font></p>
				<p>
						<font face="宋体, SimSun">工欲善其事必先利其器，建议你在开始安装之前把所有需要的软件下载齐全，这样可以提高效率和成功率。</font>Bugzilla<font face="宋体, SimSun">所需的软件都是开源的，都可以从它们的官方网站上下载到（我个人不喜欢去华军软件园之类的下载网站上找，因为即不安全，找到的也不一定是最新的版本）。下面把所需东西和下载网站罗列一下：</font></p>
				<ul>
						<ul>
								<li>MySQL<font face="宋体, SimSun">（</font>4.1<font face="宋体, SimSun">）</font></li>
						</ul>
				</ul>
				<p>
						<a href="http://dev.mysql.com/downloads/mysql">
								<font color="#0066ff">http://dev.mysql.com/downloads/mysql</font>
						</a>
				</p>
				<ul>
						<ul>
								<li>Perl <font face="宋体, SimSun">（</font>5.8.7.815<font face="宋体, SimSun">）</font></li>
						</ul>
				</ul>
				<p>
						<a href="http://www.activestate.com/Products/Download/Download.plex?id=ActivePerl">
								<font color="#0066ff">http://www.activestate.com/Products/Download/Download.plex?id=ActivePerl</font>
						</a>
				</p>
				<ul>
						<ul>
								<li>Perl<font face="宋体, SimSun">模块</font></li>
						</ul>
				</ul>
				<p>
						<font face="宋体, SimSun">有两个简单的途径可以获得</font>Bugzilla<font face="宋体, SimSun">所需的</font>Perl<font face="宋体, SimSun">模块。一个是</font><font color="#0000ff"><a href="http://sourceforge.net/project/showfiles.php?group_id=75477&amp;package_id=111950&amp;release_id=374258"><font color="#5b9eff">Bugzilla<font face="宋体, SimSun">汉化项目</font></font></a>整理的，收集的很全而且比较新，还有一个安装批处理程序，所以推荐大家用这个；另外一个是</font><font color="#0000ff"><a href="http://landfill.bugzilla.org/ppm/"><font color="#0066ff">Bugzilla<font face="宋体, SimSun">的测试服务器</font></font></a>，它也提供了完整的</font>Perl<font face="宋体, SimSun">模块集合，但是版本似乎比较老。第三条道路也是有的，但是需要自己去找然后再编译。对于像我一样不懂</font>Perl<font face="宋体, SimSun">德人来说是在复杂，因此不推荐大家这样做。</font></p>
				<p>
						<a href="http://sourceforge.net/project/showfiles.php?group_id=75477">
								<font color="#0066ff">http://sourceforge.net/project/showfiles.php?group_id=75477</font>
						</a>
				</p>
				<p>
						<a href="http://landfill.bugzilla.org/ppm/">
								<font color="#0066ff">http://landfill.bugzilla.org/ppm/</font>
						</a>
				</p>
				<ul>
						<ul>
								<li>Bugzilla<font face="宋体, SimSun">（</font>2.20<font face="宋体, SimSun">）</font></li>
						</ul>
				</ul>
				<p>
						<a href="http://www.bugzilla.org/download/">
								<font color="#0066ff">http://www.bugzilla.org/download/</font>
						</a>
				</p>
				<ul>
						<ul>
								<li>Bugzilla<font face="宋体, SimSun">汉化包（</font>2.20<font face="宋体, SimSun">）</font></li>
						</ul>
				</ul>
				<p>
						<a href="http://sourceforge.net/project/showfiles.php?group_id=75477">
								<font color="#0066ff">http://sourceforge.net/project/showfiles.php?group_id=75477</font>
						</a>
				</p>
				<ol>
						<li>
								<font face="宋体, SimSun">安装和配置</font>MySQL </li>
				</ol>
				<p>
						<font face="宋体, SimSun">安装</font>MySQL<font face="宋体, SimSun">很简单，只要按照安装程序的提示一步一步的做就可以了，如果有问题可以到</font>MySQL<font face="宋体, SimSun">官方网站（</font>http://dev.mysql.com/doc/<font face="宋体, SimSun">）上查看在线手册。</font></p>
				<p>
						<font face="宋体, SimSun">接下来要配置</font>MySQL<font face="宋体, SimSun">。有些文章里写道需要手工修改</font>root<font face="宋体, SimSun">用户的密码，其实这一步在</font>MySQL<font face="宋体, SimSun">安装程序里就已经完成了（可能那些文档写的较早，</font>MySQL<font face="宋体, SimSun">的安装程序可能不太好用吧），因此不用再去设置。我们要新建一个</font>Bug<font face="宋体, SimSun">数据库和一个</font>Bugzilla<font face="宋体, SimSun">访问这个数据库的用户。操作如下：</font></p>
				<dl>
						<dd>
								<table cellspacing="0" cellpadding="7" width="529" border="1">
										<tbody>
												<tr>
														<td valign="top" bgcolor="#000000">C:\mysql\bin&gt;<font color="#ffff00">mysql –user=root -p mysql</font>  
<p></p><p>Enter password: <font color="#ffff00">********</font></p><p>Welcome to the MySQL monitor. Commands end with ; or \g.</p><p>Your MySQL connection id is 15 to server version: 4.0.20a-debug</p><p>Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.</p><p>mysql&gt; <font color="#ffff00">create database </font><font color="#ff0000">&lt;database_name&gt;</font><font color="#ffff00">;</font></p><p>Query OK, 1 row affected (0.11 sec)</p><p>mysql&gt; <font color="#ffff00">grant all privileges on </font><font color="#ff0000">&lt;database_name&gt;</font><font color="#ffff00">.* to ‘</font><font color="#ff0000">&lt;user_name&gt;</font><font color="#ffff00">‘@’</font><font color="#ff0000">&lt;server_name&gt;</font><font color="#ffff00">‘ identified by ‘</font><font color="#ff0000">&lt;password&gt;</font><font color="#ffff00">‘;</font></p><p>Query OK, 0 rows affected (0.03 sec)</p><p>mysql&gt; <font color="#ffff00">flush privileges;</font></p><p>Query OK, 0 rows affected (0.00 sec)</p><p>mysql&gt; <font color="#ffff00">quit</font></p><p>Bye</p><p>C:\mysql\bin&gt;</p></td>
												</tr>
										</tbody>
								</table>
						</dd>
				</dl>
				<ol>
						<li>
								<font face="宋体, SimSun">安装</font>Perl<font face="宋体, SimSun">及其模块</font></li>
				</ol>
				<p>
						<font face="宋体, SimSun">安装</font>Perl<font face="宋体, SimSun">也很容易，按照安装程序提示一步一步装就可以了。稍微复杂一点的是安装它的模块。不过有了</font><font color="#0000ff"><a href="http://sourceforge.net/project/showfiles.php?group_id=75477&amp;package_id=111950&amp;release_id=374258"><font color="#5b9eff">Bugzilla<font face="宋体, SimSun">汉化项目</font></font></a>提供的批处理程序，这个步骤也非常简单了。大家只要记住一个简单的命令就可以了：</font></p>
				<dl>
						<dd>
								<table cellspacing="0" cellpadding="7" width="529" border="1">
										<tbody>
												<tr>
														<td valign="top" bgcolor="#d9d9d9">ppn install <font color="#ff0000">&lt;module_name&gt;</font>  
<p></p><p>ppn uninstall <font color="#ff0000">&lt;module_name&gt;</font></p></td>
												</tr>
										</tbody>
								</table>
						</dd>
				</dl>
				<ol>
						<li>
								<font face="宋体, SimSun">安装</font>Bugzilla </li>
				</ol>
				<p>
						<font face="宋体, SimSun">把下载到压缩包解压到一个文件夹，然后运行</font>Bugzilla<font face="宋体, SimSun">的安装检查程序（</font>CheckSetup.pl<font face="宋体, SimSun">）。它会自动验证是不是安装了必须的软件。如果没有什么问题它会在</font>Bugzilla<font face="宋体, SimSun">目录里生成一个</font>localconfig<font face="宋体, SimSun">文件（没有扩展名）。</font></p>
				<p>
						<font face="宋体, SimSun">用文本编辑器打开</font>localconfig<font face="宋体, SimSun">文件，找到下面两段文字。</font>$db_host<font face="宋体, SimSun">表示服务器名称，</font>$db_name<font face="宋体, SimSun">表示数据库名称，</font>$db_user<font face="宋体, SimSun">表示登录用户名，</font>$db_pass<font face="宋体, SimSun">表示密码。修改这几个值并保存。</font></p>
				<dl>
						<dd>
								<table cellspacing="0" cellpadding="7" width="529" border="1">
										<tbody>
												<tr>
														<td valign="top" bgcolor="#d9d9d9">#  
<p></p><p># How to access the SQL database:</p><p>#</p><p>$db_host = <font color="#ff0000">‘localhost’</font>; # where is the database?</p><p>$db_name = <font color="#ff0000">‘bugs’</font>; # name of the SQL database</p><p>$db_user = <font color="#ff0000">‘bugs’</font>; # user to attach to the SQL database</p><p>#</p><p># Enter your database password here. It’s normally advisable to specify</p><p># a password for your bugzilla database user.</p><p># If you use apostrophe (’) or a backslash (\) in your password, you’ll</p><p># need to escape it by preceding it with a ‘\’ character. (\’) or (\)</p><p># (Far simpler just not to use those characters.)</p><p>#</p><p>$db_pass = <font color="#ff0000">‘bugs@agfa’</font>;</p></td>
												</tr>
										</tbody>
								</table>
						</dd>
				</dl>
				<p>
						<font face="宋体, SimSun">再次运行</font>Bugzilla<font face="宋体, SimSun">的安装检查程序（</font>CheckSetup.pl<font face="宋体, SimSun">）。这时如果正常它将初始化数据库结构和</font>Demo<font face="宋体, SimSun">数据。不过不要高兴得太早，可能会出现“</font><strong><font face="Verdana, sans-serif"><font color="#000000">Client does not support authentication protocol requested by server ……</font></font></strong>”<font face="宋体, SimSun">错误信息。这个问题整整困扰了我一个上午，幸亏后来找到</font>Byron Jones<font face="宋体, SimSun">写的《</font><a href="http://www.bugzilla.org/docs/win32install.html"><font color="#0066ff">Installing Bugzilla on Microsoft Windows</font></a><font face="宋体, SimSun">》。产生这个错误是因为</font>MySQL 4.1<font face="宋体, SimSun">及以后的版本使用了新的密码加密算法，而使用的</font>Perl<font face="宋体, SimSun">的</font>DBD::MySql<font face="宋体, SimSun">模块不够新，不支持新的加密算法。你可以采取两种方式来解决这个问题：一是使用<a href="http://www.bugzilla.org/docs/2.20/html/trbl-passwd-encryption.html"><font color="#0066ff">新的</font></a></font><font color="#0000ff"><a href="http://www.bugzilla.org/docs/2.20/html/trbl-passwd-encryption.html"><font color="#0066ff">DBD::MySql<font face="宋体, SimSun">模块</font></font></a>，不过需要自己编译；另一种是在</font>MySQL<font face="宋体, SimSun">中强制使用兼容老版本的密码加密算法：</font></p>
				<dl>
						<dd>
								<table cellspacing="0" cellpadding="7" width="529" border="1">
										<tbody>
												<tr>
														<td valign="top" bgcolor="#000000">
																<font color="#ffffff">C:\mysql\bin&gt;</font>
																<font color="#ffff00">mysql –user=root -p mysql</font>  
<p></p><p><font color="#ffffff">Enter password: </font><font color="#ffff00">********</font></p><p><font color="#ffffff">Welcome to the MySQL monitor. Commands end with ; or \g.</font></p><p><font color="#ffffff">Your MySQL connection id is 15 to server version: 4.1.11-nt</font></p><p><font color="#ffffff">Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.</font></p><p><font color="#ffffff">mysql&gt; </font><font color="#ffff00">set password for ‘</font><font color="#ff0000">&lt;user_name&gt;</font><font color="#ffff00">‘@’</font><font color="#ff0000">&lt;server_name&gt;</font><font color="#ffff00">‘ </font><font color="#ffff00">= </font><font color="#ff0000">OLD_PASSWORD </font><font color="#ffff00">(’</font><font color="#ff0000">&lt;password&gt;</font><font color="#ffff00">‘);</font></p><p><font color="#ffffff">Query OK, 0 rows affected (0.00 sec)</font></p><p><font color="#ffffff">mysql&gt; </font><font color="#ffff00">quit</font></p><p><font color="#ffffff">Bye</font></p><p><font color="#ffffff">C:\mysql\bin&gt;</font></p></td>
												</tr>
										</tbody>
								</table>
						</dd>
				</dl>
				<p> </p>
				<ol>
						<li>
								<font face="宋体, SimSun">配置</font>IIS </li>
				</ol>
				<p>
						<font face="宋体, SimSun">打开</font>IIS<font face="宋体, SimSun">管理界面。新建一个虚拟路径，指向</font>Bugzilla<font face="宋体, SimSun">所在文件夹。</font></p>
				<p align="center">
						<img height="465" src="http://www.writely.com/File.aspx?id=bcdcgf4ckn9tg" width="472" align="bottom" border="0" />
				</p>
				<p align="center"> </p>
				<p align="left">
						<font size="3">然后按应用程序设置按钮。增加一个映射，将</font>
						<font face="宋体, SimSun">
								<font size="3">.cgi</font>
						</font>
						<font size="3">文件映射到</font>
						<font face="宋体, SimSun">
								<font size="3">perl.exe</font>
						</font>
						<font size="3">。这里特别注意，有些文档里写成：</font>
						<font face="宋体, SimSun">
								<font size="3">perl.exe “%s” %s</font>
						</font>
						<font size="3">，这样不正确，在运行时出错（又花去一个小时）。正确的配置应该如下：</font>
				</p>
				<p align="left"> </p>
				<dl>
						<dd>
								<table cellspacing="0" cellpadding="7" width="529" border="1">
										<tbody>
												<tr>
														<td valign="top" bgcolor="#d9d9d9">
																<p align="left"> </p>
																<p align="left">
																		<font face="宋体, SimSun">
																				<font size="3">&lt;perl</font>
																		</font>
																		<font size="3">完整路径</font>
																		<font face="宋体, SimSun">
																				<font size="3">&gt;\perl.exe -x&lt;Bugzilla</font>
																		</font>
																		<font size="3">完整路径</font>
																		<font face="宋体, SimSun">
																				<font size="3">&gt; -wT “%s” %s</font>
																		</font>
																</p>
																<p align="justify">
																		<font size="3">例如：</font>
																</p>
																<p align="justify">
																		<font face="宋体, SimSun">
																				<font size="3">c:\perl\bin\perl.exe -xc:\bugzilla -wT “%s” %s</font>
																		</font>
																</p>
																<p align="left"> </p>
														</td>
												</tr>
										</tbody>
								</table>
						</dd>
				</dl>
				<p align="center">
						<img height="455" src="http://www.writely.com/File.aspx?id=bcdcgf5nm9358" width="406" align="bottom" border="0" />
				</p>
				<p align="center">
						<img height="250" src="http://www.writely.com/File.aspx?id=bcdcgf6p85h49" width="429" align="bottom" border="0" />
				</p>
				<p>
						<font face="宋体, SimSun">最后，将</font>index.cgi<font face="宋体, SimSun">加入到默认文档列表中。最好移到最前面，这样可以加快查询速度。如果不希望</font>/<font face="宋体, SimSun">不能把</font>index.cgi<font face="宋体, SimSun">加入到默认文档列表中，也可以在安装</font>Bugzilla<font face="宋体, SimSun">的时候，将</font>localconfig<font face="宋体, SimSun">文件中</font>$index_html<font face="宋体, SimSun">的值改为</font>1<font face="宋体, SimSun">。这样运行</font>checksetup.pl<font face="宋体, SimSun">时，就会生成一个</font>index.html<font face="宋体, SimSun">，自动重定向到</font>index.cgi<font face="宋体, SimSun">。</font></p>
				<dl>
						<dd>
								<table cellspacing="0" cellpadding="7" width="529" border="1">
										<tbody>
												<tr>
														<td valign="top" bgcolor="#d9d9d9">#  
<p></p><p># With the introduction of a configurable index page using the</p><p># template toolkit, Bugzilla’s main index page is now index.cgi.</p><p># Most web servers will allow you to use index.cgi as a directory</p><p># index, and many come preconfigured that way, but if yours doesn’t</p><p># then you’ll need an index.html file that provides redirection</p><p># to index.cgi. Setting $index_html to 1 below will allow</p><p># checksetup.pl to create one for you if it doesn’t exist.</p><p># NOTE: checksetup.pl will not replace an existing file, so if you</p><p># wish to have checksetup.pl create one for you, you must</p><p># make sure that index.html doesn’t already exist</p><p>$index_html = <font color="#ff0000">1</font>;</p></td>
												</tr>
										</tbody>
								</table>
						</dd>
				</dl>
				<p align="center">
						<img height="465" src="http://www.writely.com/File.aspx?id=bcdcgf7f2xqx6" width="472" align="bottom" border="0" />
				</p>
				<ol>
						<li>
								<font face="宋体, SimSun">配置</font>Bugzilla </li>
				</ol>
				<p>
						<font face="宋体, SimSun">不想多写了，在浏览器中打开</font>
						<a href="http://localhost/bugzilla">
								<font color="#0066ff">http://localhost/bugzilla</font>
						</a>
						<font face="宋体, SimSun">（根据你的具体情况而定）。如果你的</font>Bugzilla<font face="宋体, SimSun">是第一次使用，它会自动转向到</font>Setup<font face="宋体, SimSun">页面，按部就班的做就可以了。</font></p>
				<ol>
						<li>
								<font face="宋体, SimSun">汉化</font>Bugzilla </li>
				</ol>
				<p>
						<font face="宋体, SimSun">最后要做的就是汉化了，不过你不想汉化也没有问题。将汉化包解压解压到</font>cn<font face="宋体, SimSun">文件夹，将整个文件目录 </font>cn <font face="宋体, SimSun">拷贝至 </font>Bugzilla <font face="宋体, SimSun">的子目录 </font>template<font face="宋体, SimSun">下；然后以管理员身份登录</font>Bugzilla<font face="宋体, SimSun">，点击页脚的 </font>Parameters<font face="宋体, SimSun">（系统参数设置）链接，将 </font>languages <font face="宋体, SimSun">一项的值改为 </font>cn<font face="宋体, SimSun">，保存，则以后见到的</font>Bugzilla<font face="宋体, SimSun">页面就是汉语页面了。如果想返回英文界面，将 </font>cn <font face="宋体, SimSun">改回 </font>en <font face="宋体, SimSun">即可。</font></p>
				<p>
						<font face="宋体, SimSun">为保证向后兼容，汉化的文件全部存为 </font>UTF-8 <font face="宋体, SimSun">格式。但不管你是否汉化</font>Bugzilla<font face="宋体, SimSun">，为强迫</font>Bugzilla<font face="宋体, SimSun">采用</font>UTF-8<font face="宋体, SimSun">来处理字符串，避免</font>Bugzilla<font face="宋体, SimSun">偶然出现的乱码，强烈建议大家将文件 </font>&lt;Bugzilla<font face="宋体, SimSun">安装目录</font>&gt;\Bugzilla\CGI.pm <font face="宋体, SimSun">的第</font>55<font face="宋体, SimSun">行改为 </font>$self-&gt;charset(’<font color="#ff0000">UTF-8</font>‘)<font face="宋体, SimSun">。</font></p>
				<ol>
						<li>
								<font face="宋体, SimSun">总结</font>
						</li>
				</ol>
				<p>
						<font face="宋体, SimSun">到这里，</font>Bugzilla<font face="宋体, SimSun">的安装就基本上搞定了。也许你已经发现了，这篇文档没有说明关于邮件的问题。这时因为我没有配置，不过按照</font>Bugzilla<font face="宋体, SimSun">文档的说明，它已经提供了内置的</font>SMTP<font face="宋体, SimSun">支持。可是它不支持需要认证的</font>SMTP<font face="宋体, SimSun">，<a href="http://www.glob.com.au/sendmail/"><font color="#000000">可以使用</font></a></font><a href="http://www.glob.com.au/sendmail/"><font color="#0000ff"><font face="Verdana, sans-serif">Glob’s sendmail wrapper</font></font></a><font face="宋体, SimSun"><font color="#000000">来解决。</font></font></p>
				<ol>
						<li>
								<font face="宋体, SimSun">参考</font>
						</li>
				</ol>
				<p>Bugzilla<font face="宋体, SimSun">官方网站</font><a href="http://www.bugzilla.org/"><font color="#0066ff">http://www.bugzilla.org</font></a></p>
				<p>Bugzilla<font face="宋体, SimSun">汉化项目</font><a href="http://sourceforge.net/projects/bugzilla-cn"><font color="#5b9eff">http://sourceforge.net/projects/bugzilla-cn</font></a></p>
				<p>
						<a href="http://cosoft.org.cn/projects/bugzillchinese/">
								<font color="#5b9eff">http://cosoft.org.cn/projects/bugzillchinese/</font>
						</a>
				</p>
				<p>Perl<font face="宋体, SimSun">官方网站</font><a href="http://www.perl.com/"><font color="#0066ff">http://www.perl.com</font></a></p>
				<p>ActivePerl<font face="宋体, SimSun">官方网站</font><a href="http://www.activestate.com/Products/ActivePerl"><font color="#0066ff">http://www.activestate.com/Products/ActivePerl</font></a></p>
				<p>MySQL<font face="宋体, SimSun">官方网站</font><a href="http://www.mysql.com/"><font color="#0066ff">http://www.mysql.com</font></a></p>
				<p>Fake Sendmait for Windows <a href="http://www.glob.com.au/sendmail/"><font color="#0066ff">http://www.glob.com.au/sendmail/</font></a></p>
				<p>Installing Bugzilla on Microsoft Windows</p>
				<p>
						<a href="http://www.bugzilla.org/docs/win32install.html">
								<font color="#0066ff">http://www.bugzilla.org/docs/win32install.html</font>
						</a>
				</p>
				<p>
						<a name="AEN2">
						</a>The Bugzilla Guide <a href="http://www.bugzilla.org/docs/2.20/html"><font color="#0066ff">http://www.bugzilla.org/docs/2.20/html</font></a></p>
				<p>Bugzilla windows<font face="宋体, SimSun">安装红宝书</font><a href="http://blog.fz0132.com/trackback.asp?tbID=654"><font color="#5b9eff">http://blog.fz0132.com/trackback.asp?tbID=654</font></a></p>
				<ol>
						<li>
								<font face="宋体, SimSun">附录</font>
						</li>
				</ol>
				<p>
						<font face="宋体, SimSun">
								<strong>安装配置</strong>
						</font>
						<strong>Bugzilla</strong>
						<font face="宋体, SimSun">
								<strong>的工作清单</strong>
						</font>
				</p>
				<p>□ <font face="宋体, SimSun">下载</font>Perl</p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">下载</font>Perl<font face="宋体, SimSun">模块</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">下载</font><font face="宋体, SimSun">MySQL</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">下载</font><font face="宋体, SimSun">Bugzilla</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">下载</font><font face="宋体, SimSun">Bugzilla</font><font face="宋体, SimSun">汉化包</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">安装</font>MySQL</p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">生成</font><font face="宋体, SimSun">Bug</font><font face="宋体, SimSun">数据库</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">生成</font><font face="宋体, SimSun">Bugzilla</font><font face="宋体, SimSun">数据库用户并分配权限</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">安装</font><font face="宋体, SimSun">Perl</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">安装</font><font face="宋体, SimSun">Perl</font><font face="宋体, SimSun">模块</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">解压</font>Bugzilla<font face="宋体, SimSun">压缩包</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">运行</font>CheckSetup.pl<font face="宋体, SimSun">检查安装</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">修改</font>localconfig<font face="宋体, SimSun">文件，设置数据库访问方式</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">再次运行</font>CheckSetup.pl<font face="宋体, SimSun">完成数据库初始化</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">修改</font><font face="宋体, SimSun">Bugzilla</font><font face="宋体, SimSun">数据库用户密码加密方式（视情况而定）</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">在</font>IIS<font face="宋体, SimSun">管理器中为</font>Bugzilla<font face="宋体, SimSun">建立虚拟路径</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">将</font>.cgi<font face="宋体, SimSun">文件映射到</font>perl.exe</p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">将</font>index.cgi<font face="宋体, SimSun">加入到默认文档列表中（可选）</font></p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">配置</font>Bugzilla</p>
				<p>□<font face="宋体, SimSun"></font><font face="宋体, SimSun">汉化</font>Bugzilla</p>
				<p>
				</p>
				<!-- Content End -->
		</div>
<img src ="http://www.cnitblog.com/charester/aggbug/21242.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-28 21:10 <a href="http://www.cnitblog.com/charester/archive/2006/12/28/21242.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 5.0的安装（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/28/21241.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 28 Dec 2006 12:20:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/28/21241.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21241.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/28/21241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21241.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21241.html</trackback:ping><description><![CDATA[1. 在<a onfocus="this.blur()" href="http://dev.mysql.com/downloads/mysql/5.0.html" target="_blank">http://dev.mysql.com/downloads/mysql/5.0.html</a>下载mysql-noinstall-5.0.15- win32.zip. <br /><br />2. 解压到C:\mysql, 拷贝my-medium.ini到C:\WINDOWS, 并重命名为my.ini. 3. 编辑 my.ini,在[mysqld]部分中增加如下两句: basedir = 你装mysql的地址 datadir = F:/Data/mysqldata 因安装CodeLib .Net, [mysqld]修改以下几句为:(原因见:<a onfocus="this.blur()" href="http://codelib.threeus.com/Manual/ConnectionMySQL.htm" target="_blank">http://codelib.threeus.com/Manual/ConnectionMySQL.htm</a> 《安装设定Code Library(MySQL)三步骤》) max_allowed_packet = 32M (默认为1M) sort_buffer_size = 4M (MySQL 5.0.15 my-medium.ini默认为512K) 新增default-character-set = utf8 在[client]中同样增加default-charac<br /><br />一、连接MYSQL。 <br />格式： mysql -h主机地址 -u用户名 －p用户密码 <br />1、例1：连接到本机上的MYSQL。 <br />首先在打开DOS窗口，然后进入目录 mysqlbin，再键入命令mysql -uroot -p，回车后提示你输密码，如果刚安装好MYSQL，超级用户root是没有密码的，故直接回车即可进入到MYSQL中了，MYSQL的提示符是：mysql&gt; <br />2、例2：连接到远程主机上的MYSQL。假设远程主机的IP为：110.110.110.110，用户名为root,密码为abcd123。则键入以下命令： <br />mysql -h110.110.110.110 -uroot -pabcd123 <br />（注:u与root可以不用加空格，其它也一样） <br />3、退出MYSQL命令： exit （回车） <br />二、修改密码。 <br />格式：mysqladmin -u用户名 -p旧密码 password 新密码 <br />1、例1：给root加个密码ab12。首先在DOS下进入目录mysqlbin，然后键入以下命令 <br />mysqladmin -uroot -password ab12 <br />注：因为开始时root没有密码，所以-p旧密码一项就可以省略了。 <br />2、例2：再将root的密码改为djg345。 <br />mysqladmin -uroot -pab12 password djg345 <br />三、增加新用户。（注意：和上面不同，下面的因为是MYSQL环境中的命令，所以后面都带一个分号作为命令结束符） <br />格式：grant select on 数据库.* to 用户名@登录主机 identified by "密码" <br />例1、增加一个用户test1密码为abc，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL，然后键入以下命令： <br />grant select,insert,update,delete on *.* to test1@"%" Identified by "abc"; <br />但例1增加的用户是十分危险的，你想如某个人知道test1的密码，那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了，解决办法见例2。 <br />例2、增加一个用户test2密码为abc,让他只可以在localhost上登录，并可以对数据库mydb进行查询、插入、修改、删除的好作（localhost指本地主机，即MYSQL数据库所在的那台主机），这样用户即使用知道test2的密码，他也无法从internet上直接访问数据库，只能通过MYSQL主机上的web页来访问了。 <br />grant select,insert,update,delete on mydb.* to test2@localhost identified by "abc"; <br />如果你不想test2有密码，可以再打一个命令将密码消掉。 <br />grant select,insert,update,delete on mydb.* to test2@localhost identified by ""; <br /><br /><br />我们来看看MYSQL中有关数据库方面的好作。注意：你必须首先登录到MYSQL中，以下好作都是在MYSQL的提示符下进行的，而且每个命令以分号结束。 <br /><br />一、好作技巧 <br />1、如果你打命令时，回车后发现忘记加分号，你无须重打一遍命令，只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打，完后用分号作结束标志就OK。 <br />2、你可以使用光标上下键调出以前的命令。但以前我用过的一个MYSQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win。 <br /><br />二、显示命令 <br />1、显示数据库列表。 <br />show databases; <br />刚开始时才两个数据库：mysql和test。mysql库很重要它里面有MYSQL的系统信息，我们改密码和新增用户，实际上就是用这个库进行好作。 <br />2、显示库中的数据表： <br />use mysql； ／／打开库，学过FOXBASE的一定不会陌生吧 <br />show tables; <br />3、显示数据表的结构： <br />describe 表名; <br />4、建库： <br />create database 库名; <br />5、建表： <br />use 库名； <br />create table 表名 (字段设定列表)； <br />6、删库和删表: <br />drop database 库名; <br />drop table 表名； <br />7、将表中记录清空： <br />delete from 表名; <br />8、显示表中的记录： <br />select * from 表名; <br /><br />三、一个建库和建表以及插入数据的实例 <br />drop database if exists school; //如果存在SCHOOL则删除 <br />create database school; //建立库SCHOOL <br />use school; //打开库SCHOOL <br />create table teacher //建立表TEACHER <br />( <br />id int(3) auto_increment not null primary key, <br />name char(10) not null, <br />address varchar(50) default '深圳', <br />year date <br />); //建表结束 <br />//以下为插入字段 <br />insert into teacher values('','glchengang','深圳一中','1976-10-10'); <br />insert into teacher values('','jack','深圳一中','1975-12-23'); <br /><br />注：在建表中（1）将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key（2）将NAME设为长度为10的字符字段（3）将ADDRESS设为长度50的字符字段，而且缺省值为深圳。varchar和char有什么区别呢，只有等以后的文章再说了。 （4）将YEAR设为好期字段。 <br />如果你在mysql提示符键入上面的命令也可以，但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql，然后复制到c:\下，并在DOS状态进入目录\mysql\bin，然后键入以下命令： <br />mysql -uroot -p密码 &lt; c:\school.sql <br />如果成功，空出一行无任何显示；如有错误，会有提示。（以上命令已经调试，你只要将//的注释去掉即可使用）。 <br /><br />四、将文本数据转到数据库中 <br />1、文本数据应符合的格式：字段数据之间用tab键隔开，null值用\n来代替. <br />例： <br />3 rose 深圳二中 1976-10-10 <br />4 mike 深圳一中 1975-12-23 <br />2、数据传入命令 load data local infile "文件名" into table 表名; <br />注意：你最好将文件复制到\mysql\bin目录下，并且要先用use命令打表所在的库 。 <br /><br />五、备份数据库：（命令在DOS的\mysql\bin目录下执行） <br />mysqldump --opt school&gt;school.bbb <br />注释:将数据库school备份到school.bbb文件，school.bbb是一个文本文件，文件名任取，打开看看你会有新发现。 <br /><img src ="http://www.cnitblog.com/charester/aggbug/21241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-28 20:20 <a href="http://www.cnitblog.com/charester/archive/2006/12/28/21241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>win2000 下安装配置 BUGZILLA 心得（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/28/21240.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 28 Dec 2006 12:14:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/28/21240.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21240.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/28/21240.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21240.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21240.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 决定将上星期安装BUGZILLA的经验告诉大家，希望能对那些正在为装BUGZILLA的朋友们有所帮助										网上有很多关于						bugzilla 						在						windows						环境下安装的资料，但是也有部分不适合自已，走到某一步总会出现一些错误提示，我整整花了一周的时间才配置好，现将我的安装步骤写下来，希望对大家有些启发。				...&nbsp;&nbsp;<a href='http://www.cnitblog.com/charester/archive/2006/12/28/21240.html'>阅读全文</a><img src ="http://www.cnitblog.com/charester/aggbug/21240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-28 20:14 <a href="http://www.cnitblog.com/charester/archive/2006/12/28/21240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bugfree学习（一）</title><link>http://www.cnitblog.com/charester/archive/2006/12/28/21231.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 28 Dec 2006 11:04:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/28/21231.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21231.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/28/21231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21231.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21231.html</trackback:ping><description><![CDATA[
		<strong>这个工具很好，可是不会采用。因为不方便，芝麻大的事情要去搞数据库。稳定性很难保证<br />停止学习这个工具</strong>
		<br />
		<br />1：BugFree的7种解决方案各自的含义是什么？ 
<p>By Design - 就是这么设计的，无效的Bug<br />Duplicate - 这个问题别人已经发现了，重复的Bug<br />External - 是个外部因素(比如浏览器、操作系统、其他第3方软件)造成的问题<br />Fixed - 问题被修理掉了。Tester要尽可能找到这种Bug<br />Not Repro - 无法复现你这个问题，无效的Bug<br />Postponed - 是个问题，但是目前不必修理了，推迟到以后再解<br />Won't Fix - 是个问题，但是不值得修理了，不管它吧<br /><br />2：如何成为管理员？ </p><p>打开Include/ConfigBug.inc.php文件:<br />$BugConfig["AdminUser"] = array("admin","你的用户名");<br />要注意引号和逗号的间隔。 <br /><br />3：如何增加上传附件的大小? </p><p>修改ConfigBug.inc.php文件。<br />$BugConfig["File"]["MaxFileSize"] = 1024 * 100; //注意单位是字节。 <br /><br /></p><dt>1.4 保护你的Shell目录，以免造成密码泄漏。 
</dt><dd>Shell目录下面的脚本程序是用来自动发送邮件通知的，这个目录必须加以保护，以免造成安全方面的隐患。<br />保护的措施有以下几个方法： 
<ul><li>1.4.1 将Shell目录移到网站目录之外。 
</li><li>1.4.2 如果是linux 系统下面，可以通过chmod o-rwx Shell -R 来去掉Shell目录的读写权限。 
</li><li>1.4.3 可以将扩展名为.sh结尾的文件删除，通过.php文件来完成自动发信的功能。具体的调用方式: <br />windows: your/path/to/php.exe your/path/to/BugFree/Shell/NoticeBug.php<br />linux: your/path/to/php your/path/to/BugFree/Shell/NoticeBug.php </li></ul></dd><dt>1.3 修改目录的权限 
</dt><dd>上传之后，必须修改几个目录的权限：<br /><ul><li>linux平台下面：chmod o=rwx Compile BugFile 
</li><li>windows平台下面，如果BugFree所在的目录分区为NTFS分区，也需要增加读写的权限。 </li></ul></dd><dt>1.4 访问install.php页面，生成ConfigBug.inc.php文件 
</dt><dd>访问http://xxx.com/BugFree/install.php页面，根据页面提示填写参数，生成BugFree的配置文件， 将其保存到Include目录下面，命名为ConfigBug.inc.php文件。 <br /><br /></dd><dt>1.5 用管理员账号登录，建立初始的项目，建立权限系统。 
</dt><dd>使用在1.4步骤里面建立的管理员账号登录，点击页面右上部的“管理”菜单进入后台管理，建立项目、模块，添加用户组，添加用户就可以了。 <br /><br /></dd><dt>3.1 不能正确的改变Bug状态 
</dt><dd>一个Bug只有3种状态：Active、Resolved、Closed。实践中经常有不熟悉的同事通过“编辑 (Edit)”来改变所有的状态，那是不合适的。 正确的状态转换方法应该是：<br /><ol><li>某个状态自己到自己的改变，使用“编辑 (Edit)”。比如一个Active的Bug，从一个人指派到另外一个人； 
</li><li>Active -&gt; Resolved 只能用“解决 (Resolve)”； Resolved -&gt; Closed 只能用“关闭 (Closed)”； 
</li><li>Resolved -&gt; Active 和 Closed -&gt; Active 只能使用“激活 (Activate)” </li></ol><p><a href="http://bugfree.1zsoft.com/Doc/FILES.htm">http://bugfree.1zsoft.com/Doc/FILES.htm</a><br /><br /><a href="http://bugfree.1zsoft.com/Doc/CONFIG.htm">http://bugfree.1zsoft.com/Doc/CONFIG.htm</a></p></dd><img src ="http://www.cnitblog.com/charester/aggbug/21231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-28 19:04 <a href="http://www.cnitblog.com/charester/archive/2006/12/28/21231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用VNC远程登陆linux (ZT)</title><link>http://www.cnitblog.com/charester/archive/2006/12/28/21225.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 28 Dec 2006 07:34:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/28/21225.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21225.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/28/21225.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21225.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21225.html</trackback:ping><description><![CDATA[
		<u>
				<font color="#810081">
						<p>由于客户需要充分利用花了N多money购买的服务器，而服务器上运行的是Linux AS,客户又不太会使用文本模式，因此只好采用配置X-server的方式来给每一个用户一个图形终端了，这多亏了X-windows设计的先进性呀。 <br />为了简单，我就使用了Linux自带的vnc-server。 <br />代码:: <br />#uname -a <br />Linux server1.linux 2.4.21-4.ELsmp #1 SMP <br />#rpm -q vnc-server <br />vnc-server-4.0-0.beta4.1.1 </p>
						<p>你可以使用特定的帐号来运行你的vncserver命令。这样可以做到同时有多个用户登录图形终端。同时一个图形终端编号只能有一个用户登录。 <br />代码:: <br />#useradd demo <br />#passwd -d demo <br />#su demo <br />$vncserver <br />passwd: //如果这个帐号是第一次运行vncserver，则会要求你输入连接的密码。 <br />verify: <br />New 'server1.linux:4 (demo)' desktop is server1.linux:4 <br />Starting applications specified in /home/demo/.vnc/xstartup <br />Log file is /home/demo/.vnc/server1.linux:4.log </p>
						<p>上面这段话表示起动了一个图形终端，编号为4,要记住这个编号，等下登录时需要提供这个编号。 <br />如果你要停止这个进程，使用 <br />代码:: <br />$vncserver -kill :4 </p>
						<p>就可以了，后面的数字表示图形终端编号。 <br />ok，这样，x-server已经起动了。 <br />我们来测试一下。 <br />找另外一台机器，如果是Linux的系统，那就比较方便，直接使用下面的命令 <br />代码:: <br />#vncviewer xx.xx.xx.xx:4 ;连接方式是ip地址:编号,这里的编号是4. </p>
						<p>会弹出一个对话框，要求你输入密码，如果密码正确，这是就会出现图形终端了。 <br />如果是windows的机器，那就下载一个vnc的软件吧。我用的是winVNC。 <br />连接方式是一样的。 <br />不过大家也看到了，虽然图形界面是看到了，但是好丑呀！的确，因为默认的图形终端采用xterm+twm，桌面上什么都没有。如果能使用默认的GNOME或者KDE或者FVWM等X-manager该有多好？ <br />没有问题，接下来的配置就是解决这个问题。 <br />每当一个帐号运行一次vncserver后，就会在家目录下创建.vnc目录。 <br />里面有一个可执行脚本xstartup。看看里面的内容就知道了，默认起动的是twm。 <br />那么我们就修改这个文件吧，去掉里面的所有内容，写入下面一行 <br />代码:: <br />gnome-session </p>
						<p>这样就指定起动gnome。 <br />也可以写入 <br />代码:: <br />unset SESSION_MANAGER <br />exec /etc/X11/xinit/xinitrc </p>
						<p>表示起动默认的图形管理器。 <br />保存退出，然后重新起动vncserver。 <br />代码:: <br />$vncserver -kill :4 <br />$vncserver </p>
						<p>然后到客户端去连接X-server，看是不是变得漂亮些啦。 <br />可能你又会问了，如果我有1000个用户呢，是不是每一个用户都需要去修改这个文件呀，那多麻烦呀。 <br />那我们就找到根源吧，看到底xstartup是谁创建的。 <br />找到/usr/bin/vncserver，他是一个perl脚本程序。 <br />打开看看 <br />转到43行，你就会看到 <br />$defaultXStartup变量的定义了，看到了吧。 <br />这下你知道怎么改了吧。 <br />把他变成这个样子： <br />代码:: <br />$defaultXStartup <br /> = ("#!/bin/shnn". <br /> "# Uncomment the following two lines for normal desktop:n". <br /> "unset SESSION_MANAGERn". <br /> "exec /etc/X11/xinit/xinitrcnn". <br /> "#[ -r $HOME/.Xresources ] &amp;&amp; xrdb $HOME/.Xresourcesn". <br /> "#xsetroot -solid greyn". <br /> "#vncconfig -iconic &amp;n". <br /> "#xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &amp;n". <br /> "#twm &amp;n"); </p>
						<p>实际上就是去掉最前面的两行注释，注释掉下面的几行。保存退出。 <br />你再创建一个帐号，运行vncserver看看。 <br />是不是默认的图形终端就修改了呢？ <br />我的任务完成了。 <br />需要去面试了。 <br />大家试试吧。<br /></p>
						<br />
						<br />
						<br />
						<font color="#000080">安装远程桌面，VNC Server on FreeBSD + VNC Viewer on Windows ！</font>
						<div class="postText">一直都在思考*NIX下面如何远程桌面，发现VNC实在是一个很好的东东，在*NIX平台上的性能表现远超过于Windows平台上面！<br /><br />下面就以FreeBSD为例子来说明如何建立Remote Desktop：<br /><br /><span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,255); FONT-FAMILY: tahoma">1) FreeBSD + X-Window(xorg) + Gnome Desktop + VNCServer</span><br style="FONT-WEIGHT: bold; COLOR: rgb(0,0,255); FONT-FAMILY: tahoma" /><span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,255); FONT-FAMILY: tahoma">2) Windows + RealVNC Viewer Free Edition<br /><br /></span>安装FreeBSD, xorg, Gnome不作过多叙述了，直入主题！<br /><table cellspacing="0" cellpadding="0" width="780" border="0"><tbody><tr><td bgcolor="#000000"> <br /><font style="COLOR: rgb(192,192,192)" size="2"><span style="FONT-FAMILY: courier new">FreeBSD# cd /usr/ports/net/vnc<br />FreeBSD# make<br />FreeBSD# make install<br />FreeBSD# make clean distclean<br /><br type="_moz" /></span></font></td></tr></tbody></table><br />完成后，可以用<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,255); FONT-FAMILY: courier new">which vncserver</span>查看路径为：<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,255); FONT-FAMILY: courier new">/usr/local/bin/vncserver<br /></span>在自己的home目录下面新建一个目录：<br /><table cellspacing="0" cellpadding="0" width="780" border="0"><tbody><tr><td bgcolor="#000000"><br /><font style="COLOR: rgb(192,192,192)" size="2"><span style="FONT-FAMILY: courier new">[xport@FreeBSD ~] $ mkdir .vnc<br />[xport@FreeBSD ~] $ cd .vnc<br /></span></font><font style="COLOR: rgb(192,192,192)" size="2"><span style="FONT-FAMILY: courier new">[xport@FreeBSD ~/.vnc] $<br /><br /></span></font></td></tr></tbody></table><br />启动vncserver，第一次启动会为你的session设定密码：<br /><table cellspacing="0" cellpadding="0" width="780" border="0"><tbody><tr><td bgcolor="#000000"><font style="COLOR: rgb(192,192,192)" size="2"><span style="FONT-FAMILY: courier new"> </span><br style="FONT-FAMILY: courier new" /></font><font style="COLOR: rgb(192,192,192)" size="2"><span style="FONT-FAMILY: courier new"><span style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new">[xport@FreeBSD ~/.vnc] $ vncserver</span><br style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new" /><span style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new">You will require a password to access your desktops.</span><br style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new" /><br style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new" /><span style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new">Password:<span style="COLOR: rgb(255,255,0)">&lt;--输入密码</span></span><br style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new" /><span style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new">Verify:  <span style="COLOR: rgb(255,255,0)">&lt;--确认密码</span></span><br style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new" /><span style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new">xauth: creating new authority file /home/xport/.Xauthority</span><br style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new" /><br style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new" /><span style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new">New 'X' desktop is xport.localdomain:1</span><br style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new" /><br style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new" /><span style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new">Creating default startup script <span style="COLOR: rgb(255,255,0)">/home/xport/.vnc/xstartup  &lt;--这个文件很重要，接下来会修改它！</span></span><br style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new" /><span style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new">Starting applications specified in /home/xport/.vnc/xstartup</span><br style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new" /><span style="COLOR: rgb(192,192,192); FONT-FAMILY: courier new">Log file is /home/dan/.vnc/xport.localdomain:1.log</span><br /><br type="_moz" /></span></font></td></tr></tbody></table><br />如果要关闭vncserver，用下面的方法：<br /><table cellspacing="0" cellpadding="0" width="780" border="0"><tbody><tr><td bgcolor="#000000"> <br /><font style="COLOR: rgb(192,192,192)" size="2"><span style="FONT-FAMILY: courier new">[xport@FreeBSD ~/.vnc] $ vncserver -kill :1</span><br style="FONT-FAMILY: courier new" /><span style="FONT-FAMILY: courier new">[xport@FreeBSD ~/.vnc] $ ls -al</span><br style="FONT-FAMILY: courier new" /><span style="FONT-FAMILY: courier new">total 16</span><br style="FONT-FAMILY: courier new" /><span style="FONT-FAMILY: courier new">-rw-r--r--  1 xport  users  10382 Oct 11 23:20 FreeBSD.localdomain:1.log</span><br style="FONT-FAMILY: courier new" /><span style="FONT-FAMILY: courier new">-rw-------  1 xport  users      8 Oct 11 23:09 passwd</span><br style="FONT-FAMILY: courier new" /><span style="FONT-FAMILY: courier new">-rwxr-xr-x  1 xport  users    184 Oct 11 23:11 <span style="COLOR: rgb(255,0,0)">xstartup</span></span></font><font style="COLOR: rgb(192,192,192)" size="2"><span style="FONT-FAMILY: courier new"><br /><br type="_moz" /></span></font></td></tr></tbody></table><br />接下来修改xstartup：<br /><table cellspacing="0" cellpadding="0" width="780" border="0"><tbody><tr><td bgcolor="#000000"><br /><font style="COLOR: rgb(192,192,192)" size="2"><span style="FONT-FAMILY: courier new">[xport@FreeBSD ~/.vnc] vi xstartup<br /><span style="COLOR: rgb(255,255,0)"># 修改成下面的内容</span><br />#!/bin/sh<br /><br />[ -r $HOME/.Xresources ] &amp;&amp; xrdb $HOME/.Xresources<br />xsetroot -solid grey<br />vncconfig -iconic &amp;<br /><span style="COLOR: rgb(255,255,0)"># 下面的2行是vncserver第一次启动的时候产生的，为了使用Gnome，我把它们给</span><br style="COLOR: rgb(255,255,0)" /><span style="COLOR: rgb(255,255,0)"># 注释掉了</span><br /># xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &amp;<span style="FONT-FAMILY: courier new"><br /># twm &amp; <br /></span></span></font><code class="code" style="FONT-FAMILY: courier new"><font style="COLOR: rgb(192,192,192)" size="2"><span style="FONT-FAMILY: courier new">gnome-session &amp; <span style="COLOR: rgb(255,255,0)">&lt;--这个是我增加的，不要忘了后面的&amp;</span><br /><br /></span></font></code></td></tr></tbody></table><br />好了，再次启动vncserver吧！<br /><table cellspacing="0" cellpadding="0" width="780" border="0"><tbody><tr><td bgcolor="#000000"><br /><font style="COLOR: rgb(192,192,192)" size="2"><span style="FONT-FAMILY: courier new">[xport@FreeBSD ~/.vnc] $ vncserver<br />New 'FreeBSD.localdomain:1 (xport)' desktop is FreeBSD.localdomain:1<br /><br />Starting applications specified in /home/xport/.vnc/xstartup<br />Log file is /home/xport/.vnc/FreeBSD.localdomain:1.log<br />[xport@FreeBSD ~/.vnc] $<br /><br /></span></font></td></tr></tbody></table><br />好现在我们从Windows下面连接FreeBSD：<br /><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/xport/72526/o_VNC_On_FreeBSD_01.jpg" border="0" /><br /><br />输入密码：<br /><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/xport/72526/o_VNC_On_FreeBSD_02.jpg" border="0" /><br /><br />进入Gnome，我启动了Eclipse IDE：<br /><img alt="" src="http://blog.csdn.net/images/blog_csdn_net/xport/72526/o_VNC_On_FreeBSD_03.jpg" border="1" /><br /><br />哈哈，感觉这样运行比较爽！<br type="_moz" /></div>
				</font>
		</u>
<img src ="http://www.cnitblog.com/charester/aggbug/21225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-28 15:34 <a href="http://www.cnitblog.com/charester/archive/2006/12/28/21225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FTP站长必读(ZT)</title><link>http://www.cnitblog.com/charester/archive/2006/12/27/21176.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Wed, 27 Dec 2006 09:03:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/27/21176.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21176.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/27/21176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21176.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21176.html</trackback:ping><description><![CDATA[
		<font color="#b22222"> 您是否正准备搭建自己的FTP网站？您知道FTP协议的工作机制吗？您知道什么是PORT方式？什么是PASV方式吗？如果您不知道，或没有完全掌握，请您坐下来，花一点点时间，细心读完这篇文章。所谓磨刀不误砍柴功，掌握这些基础知识，会令您事半功倍。否则，很可能折腾几天，最后一事无成。<br />FTP基础知识    FTP是File Transfer Protocol（文件传输协议）的缩写，用来在两台计算机之间互相传送文件。相比于HTTP，FTP协议要复杂得多。复杂的原因，是因为FTP协议要用到两个TCP连接，一个是命令链路，用来在FTP客户端与服务器之间传递命令；另一个是数据链路，用来上传或下载数据。<br />    FTP协议有两种工作方式：PORT方式和PASV方式，中文意思为主动式和被动式。<br />    PORT（主动）方式的连接过程是：客户端向服务器的FTP端口（默认是21）发送连接请求，服务器接受连接，建立一条命令链路。当需要传送数据时，客户端在命令链路上用PORT命令告诉服务器：“我打开了XXXX端口，你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求，建立一条数据链路来传送数据。<br />    PASV（被动）方式的连接过程是：客户端向服务器的FTP端口（默认是21）发送连接请求，服务器接受连接，建立一条命令链路。当需要传送数据时，服务器在命令链路上用PASV命令告诉客户端：“我打开了XXXX端口，你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求，建立一条数据链路来传送数据。<br />    从上面可以看出，两种方式的命令链路连接方法是一样的，而数据链路的建立方法就完全不同。而FTP的复杂性就在于此。<br />   FTP服务器端的注意事项<br />   一、FTP服务器是公网IP，用公网动态域名；或是内网IP，用内网专业版TrueHost1、服务器如果安装了防火墙，请记住要在防火墙上打开FTP端口（默认是21）。<br />   2、所有FTP服务器软件都支持PORT方式。至于PASV方式，大部分FTP服务器软件都支持。支持PASV方式的FTP服务器软件，也可以设置为只工作在PORT方式上。<br />   3、为了PASV方式能正常工作，需要在FTP服务器软件上为PASV方式指定可用的端口范围（设置方法）。此外，还要在服务器的防火墙上打开这些端口。当客户端以PASV方式连接服务器的时候，服务器就会在这个端口范围里挑选一个端口出来，给客户端连接。<br />   二、FTP服务器是内网IP，用内网动态域名标准版cmxnatproxy 这种情况下，FTP服务器不需要做特殊设置，只要支持PASV方式就可以了。大部分FTP服务器软件都支持PASV方式。<br />   FTP客户端的注意事项<br />    请注意：选择用PASV方式还是PORT方式登录FTP服务器，选择权在FTP客户端，而不是在FTP服务器。<br />    一、客户端只有内网IP，没有公网IP    从上面的FTP基础知识可知，如果用PORT方式，因为客户端没有公网IP，FTP将无法连接客户端建立数据链路。因此，在这种情况下，客户端必须要用PASV方式，才能连接FTP服务器。大部分FTP站长发现自己的服务器有人能登录上，有人登录不上，典型的错误原因就是因为客户端没有公网IP，但用了IE作为FTP客户端来登录（IE默认使用PORT方式）。<br />    作为FTP站长，有必要掌握FTP的基础知识，然后指导您的朋友如何正确登录您的FTP。<br />   二、客户端有公网IP，但安装了防火墙    如果用PASV方式登录FTP服务器，因为建立数据链路的时候，是由客户端向服务器发送连接请求，没有问题。反过来，如果用PORT方式登录FTP服务器，因为建立数据链路的时候，是由服务器向客户端发送连接请求，此时连接请求会被防火墙拦截。如果要用PORT方式登录FTP服务器，请在防火墙上打开1024以上的高端端口。<br />   三、连接用内网标准版cmxnatproxy搭建的FTP服务，必须要用PASV方式。连接任何公网FTP服务器、或用内网专业版TrueHost搭建的FTP服务器，PORT方式和PASV方式都可以使用。<br />    当然，使用PORT方式的时候，还要满足上面的两个条件。<br />   四、常见的FTP客户端软件PORT方式与PASV方式的切换方法。<br />    大部分FTP客户端默认使用PASV方式。IE默认使用PORT方式。<br />    在大部分FTP客户端的设置里，常见到的字眼都是“PASV”或“被动模式”，极少见到“PORT”或“主动模式”等字眼。因为FTP的登录方式只有两种：PORT和PASV，取消PASV方式，就意味着使用PORT方式。<br />IE：工具 -&gt; Internet选项 -&gt; 高级 -&gt; “使用被动FTP”（需要IE6.0以上才支持）。如果找不到这个选项，请看 图片。<br />CuteFTP：<br />    Edit -&gt; Setting -&gt; Connection -&gt; Firewall -&gt; “PASV Mode”<br />或    File -&gt; Site Manager，在左边选中站点 -&gt; Edit -&gt; “Use PASV mode”<br />FlashGet：<br />    工具 -&gt; 选项 -&gt; 代理服务器 -&gt; 直接连接 -&gt; 编辑 -&gt; “PASV模式”<br />FlashFXP：<br />    选项 -&gt; 参数选择 -&gt; 代理/防火墙/标识 -&gt; “使用被动模式”<br />或    站点管理 -&gt; 对应站点 -&gt; 选项 -&gt; “使用被动模式”<br />或    快速连接 -&gt; 切换 -&gt; “使用被动模式”<br />LeechFTP：<br />    Option -&gt; Firewall -&gt; Do not Use<br />五、请尽量不要用IE作为FTP客户端    IE只是个很粗糙的FTP客户端工具。首先，IE6.0以下的版本不支持PASV方式；其次，IE在登录FTP的时候，看不到登录信息。在登录出错的时候，无法找到错误的原因。在测试自己的FTP网站的时候，强烈建议不要使用IE。<br />   FTP建站的详细配置过程<br />    请参考这个网页的说明来配置：<br />    使用Serv-U建立FTP网站<br />   高级话题<br />   一、为什么没有公网IP，也能使用PORT方式登录FTP？<br />    NAT网关的工作方式是在TCP/IP数据包的包头里找局域网的源地址和源端口，替换成网关的地址和端口。对数据包里的内容，是不会改变的。而使用PORT方式登录FTP的时候，IP地址与端口信息是在数据包里面的，而不是在包头。因此，没有公网IP，使用PORT方式是无法从internet上的ftp服务器下载数据的。 <br />    但是，极少数的NAT网关也支持PORT方式。这些NAT网关连数据包里面的内容都扫描，扫描到PORT指令后会替换PORT方式的IP和端口。在这种NAT网关下面，用PORT方式就没问题了。不过，这些网关也只扫描21端口的数据包，如果FTP服务器不是用默认的21端口，也无法使用PORT方式。<br />   二、内网可以用PORT访问其他FTP，为什么不能用PORT访问自己的TrueHost FTP？<br />    下面要讨论的问题，只是为了说明一些原理，是不影响实际使用的。如果您没有兴趣深究这些原理，不必花时间看。<br />    内网用户通过支持PORT方式的NAT网关，访问自己本机利用TrueHost建立的FTP服务器，FTP命令链路的建立过程如下：<br />FTP客户端10.10.0.1端口xxx &lt;==&gt; ISP NAT网关61.144.1.2端口xxxx &lt;==&gt; TH服务器x.x.x.x端口21 &lt;==&gt; TH客户端 &lt;==&gt; 用户FTP服务器10.10.0.1端口21<br />    FTP客户端通过ISP的NAT网关、科迈TrueHost服务器、TrueHost客户端，连接用户本机的FTP服务器的21端口。<br />    当需要下载数据的时候，FTP客户端通过这条命令链路，向FTP服务器发送PORT命令。<br />假设命令为：<br />        PORT 10,10,0,1,30,4 （即IP=10.10.0.1 端口=30*256+4=7684）  当命令通过ISP的NAT网关的时候，NAT网关判断目的端口是21，并且是PORT命令，于是，修改命令里的IP和端口，替换为自己的IP和端口，比如：<br />        PORT 61,144,1,2,50,6 （即IP=61.144.1.2 端口=50*256+6=12806）    用户的FTP服务器最终收到的是上面这个PORT命令。于是，FTP服务器向这个IP和端口发送连接请求，建立数据链路。图示：<br />用户FTP服务器10.10.0.1端口20 &lt;==&gt; ISP NAT网关61.144.1.2端口12806 &lt;==&gt; FTP客户端10.10.0.1端口7684<br />    但是，因为NAT网关的公网IP只能接收外来的连接请求。就是说，61.144.1.2:12806只能接收其他公网IP的连接请求，对于从NAT内部（10.10.0.1:20）发起的连接请求，是无法建立连接的。为什么？原因很简单，因为内网IP要访问外网，必须要通过NAT建立映射。于是FTP数据链路无法建立。于是，用户无法在自己的机器上通过21端口访问自己的TrueHost FTP。<br />    我们再来看看，如果FTP端口不是21，比如是22，会发生什么情况呢？在FTP客户端发送PORT命令的时候，NAT网关检测到目标端口是22，因为支持PORT的NAT网关只监视目的端口是21的数据包，发现目的端口是22的数据包，不做任何处理，完全放行。于是FTP服务器收到的PORT命令依然是PORT 10,10,0,1,30,4。于是FTP服务器向这个IP和端口发送连接请求。图示：<br />用户FTP服务器10.10.0.1端口20 &lt;==&gt; FTP客户端10.10.0.1端口7684<br />    这种情况下命令链路就可以建立起来了。而且是等于本机连接本机，速度飞快。<br />    综上所述，内网用户无法用PORT方式通过21端口访问自己的TrueHost FTP服务器。如果FTP端口不是21，则可以访问，而且实际上是本机连接本机。<br />    上面的文字，仅仅是为了说明一些原理，不影响实际使用。如果本机访问本机，还要通过FTP的话，就有画蛇添足之嫌了。</font>
		<br />
<img src ="http://www.cnitblog.com/charester/aggbug/21176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-27 17:03 <a href="http://www.cnitblog.com/charester/archive/2006/12/27/21176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MSN 登录时出现80048820错误的官方解释(ZT)</title><link>http://www.cnitblog.com/charester/archive/2006/12/27/21156.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Wed, 27 Dec 2006 02:25:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/27/21156.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21156.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/27/21156.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21156.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21156.html</trackback:ping><description><![CDATA[ <b><font color="#0066cc">资料:MSN 登录时出现80048820错误的官方解释</font></b><div class="content_head">[ 分类：<a href="http://www.pxue.com/?CateID=3">资源分享</a> ]   [阅读：146617 ]   [ 日期：<a href="http://www.pxue.com/?Log_year=2005&amp;Log_Month=11&amp;log_day=4">2005-11-4</a> ]   [ 来自：<a href="http://www.pxue.com/" target="_blank">飘雪工作室</a> ]</div><div class="content_main"><div id="fp"><div class="code_head">Quote:</div><div class="code_main">When you start MSN Messenger you cannot sign in, and you get the message:<br /><br />Sorry, we were unable to sign you in to the MSN Messenger at this time. Please try again later. <br /><br />To let us try and troubleshoot the problem, click the Troubleshoot button. <br /><br />80048820 <br /><br />Fix this error / possible solutionThis error seems to indicate a problem with MSN Messenger's encryption routines. <br />The usual cause is that the time on your computer is not correct. <br />To correct the time on your computer, double-click the clock in the bottom right of your screen, in the window that appears you should check both the time and date. <br />If you use Windows XP, you can automatically correct the time by clicking the "Internet Time" tab, next click the "Update Now" button. <br />If you still have problems connecting with the time adjusted, try to run this file. This will make sure MSN Messenger can find all the files it needs on your computer. </div><br /><br /><font color="red">中文大概意思</font>:当你的MSN 无法登录，且提示错误代码为80048820，这种问题一般是由于你的系统时间不对，先校准系统时间，如果仍然无法登录，可能是由于DLL文件注册信息丢失，下载这个批处理文件 <a href="http://www.msn-problems.com/downloads/register-messenger-dll-files.bat " target="_blank" rel="nofollow">http://www.msn-problems.com/downloads/register-messenger-dll-files.bat </a>运行一下，问题应该可以解决.<br /><br /><font color="red">近期反应无法下载批处理文件的比较多,特放到本地供大家下载:</font><br /><img src="http://www.pxue.com/images/download.gif" align="absMiddle" /><a href="http://www.pxue.com/attachments/month_0512/PXue_20051226170638_2351.rar" target="_blank">点击下载此文件</a><br /><br />注:如果你的系统时间无法同步的话,请使用这个<a class="vLink1" id="vad_3" onmouseover="if(typeof(showTitle)!='undefined'){this.title='';window.clearTimeout(hideTO);showTitle(event, this, 3,'');}" title="" style="FONT-SIZE: 1em" onclick="" onmouseout="if(typeof(showTitle)!='undefined'){mouseIsOverLayer = false; mouseOverWhileLoad = false; hideTO = window.setTimeout('checkIfMouseOverLayer()',500);}" href="http://action.vogate.com/click/click.php?ads_id=909&amp;site_id=6235007045035709&amp;click=1&amp;url=http%3A//www.onlycollege.com.cn/courses/computer/index.html&amp;v=0&amp;k=%u8F6F%u4EF6&amp;s=http%3A//www.pxue.com/Html/517.html&amp;rn=464266" target="_blank">软件</a>来同步时间<br /><font color="green">时间同步程序 1.0.0.1（<a href="http://www.onlinedown.net/soft/23218.htm" target="_blank" rel="nofollow">http://www.onlinedown.net/soft/23218.htm</a>）</font><br /><br />据小道消息说这几天MSN及HOTMAIL无法登陆是因为被屏掉了，所以如果有能力的话，请寻找国外的代理服务器即可正常使用。<br /><font color="blue">此处给大家留一个代理服务器列表页</font>：<a href="http://www.proxy4free.com/page1.html" target="_blank" rel="nofollow">http://www.proxy4free.com/page1.html</a><br /><br /><strong><font color="green">WENDY网友提出这个解决办法：</font></strong><br /><div class="code_head">Quote:</div><div class="code_main">我最近也遇到了80048820问题，我按照这里说的所有方法都试过，都不成功。但是我在留言里看到有位朋友提到，新帐户可以登陆，我试了试真的可以，<font color="red">于是我把老账户里的C:\Documents and Settings\你的账户名\Application Data下的所有文件夹和文件都删除</font>，问题解决。</div><br /><br /><strong>其实不需要删除那么多，在其下面有一个目录：Microsfot\MSN Messenger\下保存的就是MSN的资料，各位网友可以试试把这个目录删除看看能否登陆，如果不行的话，再<a class="vLink1" id="vad_4" onmouseover="if(typeof(showTitle)!='undefined'){this.title='';window.clearTimeout(hideTO);showTitle(event, this, 4,'');}" title="学做麻辣诱惑TOP10菜品 @Vogate.com" style="FONT-SIZE: 1em" onclick="" onmouseout="if(typeof(showTitle)!='undefined'){mouseIsOverLayer = false; mouseOverWhileLoad = false; hideTO = window.setTimeout('checkIfMouseOverLayer()',500);}" href="http://action.vogate.com/click/click.php?ads_id=674&amp;site_id=6235007045035709&amp;click=1&amp;url=http%3A//my.vogate.com/ebnqsgm&amp;v=0&amp;k=%u52A8%u624B&amp;s=http%3A//www.pxue.com/Html/517.html&amp;rn=350485" target="_blank">动手</a>删除<a href="http://www.microsoft.com/china/" target="_blank">Microsoft</a>，再不行的话，再按这位网友的办法试试，感谢Wendy网友！</strong></div></div><img src ="http://www.cnitblog.com/charester/aggbug/21156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-27 10:25 <a href="http://www.cnitblog.com/charester/archive/2006/12/27/21156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的试用考核...</title><link>http://www.cnitblog.com/charester/archive/2006/12/24/21047.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Sun, 24 Dec 2006 07:08:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/24/21047.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21047.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/24/21047.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21047.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21047.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 21pt 0pt 7.4pt; TEXT-INDENT: -7.4pt; mso-char-indent-count: -.49">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="FONT-SIZE: 15pt; FONT-FAMILY: Verdana">Probationary Evaluation on New Employee<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 21pt 0pt 5.15pt; TEXT-INDENT: -5.15pt; mso-char-indent-count: -.49">
				<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-language: #AC45">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 21pt 0pt 5.9pt; TEXT-INDENT: -5.9pt; mso-char-indent-count: -.49">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana">Name:</span>
				</b>
				<b>
						<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'">：</span>
				</b>
				<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?>
				<st1:personname w:st="on">
						<b>
								<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-hansi-font-family: 'Times New Roman'">Kaka Zhou</span>
						</b>
				</st1:personname>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 21pt 0pt 0cm">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana">Position</span>
				</b>
				<b>
						<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'">：</span>
				</b>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-hansi-font-family: 'Times New Roman'">Software Testing Assistant Engineer</span>
				</b>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 5.25pt; TEXT-INDENT: -5.25pt; mso-char-indent-count: -.5">
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-language: #AC45; mso-ascii-font-family: Verdana">　　　　　　</span>
				<span lang="EN-US" style="FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-language: #AC45">
						<br />
						<b>From:</b>
						<u>
								<span style="mso-spacerun: yes">  </span>3<span style="mso-spacerun: yes">  </span></u>(DD)<u><span style="mso-spacerun: yes">  </span>July<span style="mso-spacerun: yes">  </span></u>(MM)<u> 2006 </u>(YY)<u style="text-underline: white"><b>To</b></u><b><u></u></b><u><span style="mso-spacerun: yes"> </span>3<span style="mso-spacerun: yes">  </span></u>(DD)<u> Oct. </u>(MM)<u>2006 </u>(YY) <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 6pt; TEXT-INDENT: -6pt; mso-char-indent-count: -.5">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-language: #AC45">
						<br />
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-language: #AC45; mso-ascii-font-family: Verdana">　　</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-language: #AC45">The probationary period for <st1:personname w:st="on">Kaka Zhou</st1:personname> has ended up on<u> Oct. 3, 2006 </u>. Below is the comprehensive evaluation on him, which based on different opinions from both of his teammates and director.<span style="mso-spacerun: yes">  </span><br style="mso-special-character: line-break" /><br style="mso-special-character: line-break" /><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 48.75pt; TEXT-INDENT: -21.75pt; mso-list: l0 level2 lfo1; tab-stops: list 48.75pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-fareast-font-family: Verdana; mso-bidi-font-family: Verdana">
						<span style="mso-list: Ignore">1．<span style="FONT: 7pt 'Times New Roman'">  </span></span>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana">Work performance and adaptability to company’s culture or environment during probationary period:<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LAYOUT-GRID-MODE: char; TEXT-INDENT: 52.5pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-char-indent-count: 5.0">
				<span lang="EN-US" style="COLOR: #333399; FONT-FAMILY: Verdana">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 52.5pt; LAYOUT-GRID-MODE: char; TEXT-INDENT: 24pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-char-indent-count: 2.0; mso-para-margin-left: 5.0gd">
				<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana">Before entered into probationary period, Kaka had been a trainee in C (<st1:state w:st="on"><st1:place w:st="on">Hunan</st1:place></st1:state>) Inc. for 2 months. As a freshman, he devoted himself to his first full-time job with much passion and enthusiasm. Although it took him a long time to accommodate himself from a student to be a staff, he has managed it and is qualified to be a Testing Assistant Engineer so far. He has also accumulated some testing experiences and improved his working capabilities in a whole team after XV project.</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-language: #AC45">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 30pt; mso-char-indent-count: 2.5; mso-para-margin-left: 2.0gd">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana">
						<span style="mso-spacerun: yes">      </span>2</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'">．</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana">Comments</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'">：</span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US" style="FONT-FAMILY: Verdana">
						<o:p> </o:p>
				</span>
		</p>
		<table class="MsoNormalTable" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellspacing="0" cellpadding="0" border="1">
				<tbody>
						<tr style="HEIGHT: 170.9pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes">
								<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 426.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 170.9pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" valign="top" width="568">
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-FAMILY: Verdana">
														<o:p> </o:p>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; mso-char-indent-count: 2.0">
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-language: #AC45">It is suggested that we give him the permission to be a formal employee of C (Hunan) Inc. </span>
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana">
														<o:p>
														</o:p>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LAYOUT-GRID-MODE: char; mso-pagination: widow-orphan">
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-language: #AC45">
														<o:p> </o:p>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LAYOUT-GRID-MODE: char; mso-pagination: widow-orphan">
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-language: #AC45">Position: Software Testing Assistant Engineer.     <o:p></o:p></span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LAYOUT-GRID-MODE: char; mso-pagination: widow-orphan">
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体; mso-bidi-language: #AC45">Salary: RMB**** per month.<o:p></o:p></span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana">
														<o:p> </o:p>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-FAMILY: Verdana">
														<o:p> </o:p>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-FAMILY: Verdana">
														<o:p> </o:p>
												</span>
										</p>
										<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
												<span lang="EN-US" style="FONT-FAMILY: Verdana">
														<o:p> </o:p>
												</span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/charester/aggbug/21047.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-24 15:08 <a href="http://www.cnitblog.com/charester/archive/2006/12/24/21047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序员考试补课笔记(ZT)</title><link>http://www.cnitblog.com/charester/archive/2006/12/24/21017.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Sat, 23 Dec 2006 17:36:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/24/21017.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21017.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/24/21017.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21017.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21017.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 准备明年考高程,所以就到网上找了点资料(发现这方面的东西比较少,  ),看了一下这个东西,觉得不错,很多都是些基本的东西,特转来与大家分享,特别是也想考高程的朋友,也希望有这方面经验的朋友给予帮助.     这些东西好像是原作者为了考程序员而参加相关的C语言培训时做的听课笔记.好像还没有写完,如果想知道最新的情况请到下面附的网址去看.感谢原作者!程序员考试补课笔记huoniaolinx  http...&nbsp;&nbsp;<a href='http://www.cnitblog.com/charester/archive/2006/12/24/21017.html'>阅读全文</a><img src ="http://www.cnitblog.com/charester/aggbug/21017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-24 01:36 <a href="http://www.cnitblog.com/charester/archive/2006/12/24/21017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（12.17--12.23）工作回顾 </title><link>http://www.cnitblog.com/charester/archive/2006/12/23/21007.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Sat, 23 Dec 2006 08:20:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/23/21007.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21007.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/23/21007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21007.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21007.html</trackback:ping><description><![CDATA[
		<table style="WIDTH: 837pt; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="1115" border="0" x:str="">
				<colgroup>
						<col style="WIDTH: 87pt; mso-width-source: userset; mso-width-alt: 3712" width="116" />
						<col style="WIDTH: 104pt; mso-width-source: userset; mso-width-alt: 4448" width="139" />
						<col style="WIDTH: 101pt; mso-width-source: userset; mso-width-alt: 4320" width="135" />
						<col style="WIDTH: 173pt; mso-width-source: userset; mso-width-alt: 7360" width="230" />
						<col style="WIDTH: 139pt; mso-width-source: userset; mso-width-alt: 5920" width="185" />
						<col style="WIDTH: 125pt; mso-width-source: userset; mso-width-alt: 5312" width="166" />
						<col style="WIDTH: 54pt" span="2" width="72" />
				</colgroup>
				<tbody>
						<tr style="HEIGHT: 37.5pt; mso-height-source: userset" height="50">
								<td class="xl26" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 0.5pt solid; BORDER-LEFT: windowtext 2pt double; WIDTH: 87pt; BORDER-BOTTOM: #ece9d8; HEIGHT: 259.5pt; BACKGROUND-COLOR: transparent" width="116" height="346" rowspan="7" x:num="39069">18-Dec-06</td>
								<td class="xl28" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 104pt; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" width="139" rowspan="7" x:num="39075" x:fmla="=A1+6">24-Dec-06</td>
								<td class="xl24" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="135" x:num="39069">
										<font face="Arial">Mon</font>
								</td>
								<td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<font size="2">
												<font face="Arial">1:</font>
												<font class="font7" face="宋体">测试X</font>
												<font class="font6" face="Arial">MS Admin Console</font>
												<font class="font7" face="宋体">全部流程，测试出</font>
												<font class="font6" face="Arial">3</font>
												<font class="font7" face="宋体">个</font>
												<font class="font6" face="Arial">bug</font>
										</font>
										<font size="2">
												<font class="font7" face="宋体">，通过邮件提交<br /></font>
												<font class="font6" face="Arial">2: </font>
												<font class="font7" face="宋体">阅读开心需求等相关文档</font>
										</font>
								</td>
								<td class="xl30" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 139pt; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" width="185" rowspan="7">
										<font face="宋体">1：基本上全部在测试 XMS<span style="mso-spacerun: yes">  </span><br /><br />2：开心目前产品和市场那边按照他们的计划进行，业务需求文档进一步完善，UI的设计等<br /><br />开发那边目前没具体计划，未知。<br /><br />开心环境的配置目前也处于闲置中。<br /><br /><br /></font>
								</td>
								<td class="xl33" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 125pt; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" width="166" rowspan="7">
										<font face="宋体">1：继续XMS AdminConsole<br />的测试，<br />2：继续做好系统管理工作，等待新的工作安排<br />3：bugfree的搭建<br />4：开心环境的配置<br />5：开心方面文档和邮件的整理，时刻准备测试</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 54pt; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" width="72">
										<font face="宋体">
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 54pt; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" width="72">
										<font face="宋体">
										</font>
								</td>
						</tr>
						<tr style="HEIGHT: 39.75pt; mso-height-source: userset" height="53">
								<td class="xl24" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 39.75pt; BACKGROUND-COLOR: transparent" width="135" height="53" x:num="39070" x:fmla="=C1+1">
										<font face="Arial">Tue</font>
								</td>
								<td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<font size="2">
												<font face="Arial">1:</font>
												<font class="font7" face="宋体">测试X</font>
												<font class="font6" face="Arial">MS Admin Console</font>
										</font>
										<font size="2">
												<font class="font7" face="宋体">全部流程<br /></font>
												<font class="font6" face="Arial">2</font>
												<font class="font7" face="宋体">：</font>
												<font class="font6" face="Arial">Exception</font>
										</font>
										<font size="2">
												<font class="font7" face="宋体">测试<br /></font>
												<font class="font6" face="Arial">3</font>
												<font class="font7" face="宋体">：开心学堂服务器方面文档阅读</font>
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
						</tr>
						<tr style="HEIGHT: 42pt; mso-height-source: userset" height="56">
								<td class="xl24" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 42pt; BACKGROUND-COLOR: transparent" width="135" height="56" x:num="39071" x:fmla="=C2+1">
										<font face="Arial">Wed</font>
								</td>
								<td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<font size="2">
												<font face="Arial">1:</font>
												<font class="font7" face="宋体">测试X</font>
												<font class="font6" face="Arial">MS Admin Console</font>
										</font>
										<font size="2">
												<font class="font7" face="宋体">全部流程<br /></font>
												<font class="font6" face="Arial">2</font>
												<font class="font7" face="宋体">：</font>
												<font class="font6" face="Arial">Exception</font>
										</font>
										<font size="2">
												<font class="font7" face="宋体">测试<br /></font>
												<font class="font6" face="Arial">3</font>
												<font class="font7" face="宋体">：开心服务器方面文档阅读</font>
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
						</tr>
						<tr style="HEIGHT: 39.75pt; mso-height-source: userset" height="53">
								<td class="xl24" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 39.75pt; BACKGROUND-COLOR: transparent" width="135" height="53" x:num="39072" x:fmla="=C3+1">
										<font face="Arial">Thu</font>
								</td>
								<td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<font size="2">
												<font face="Arial">1:</font>
												<font class="font7" face="宋体">测试X</font>
												<font class="font6" face="Arial">MS Admin Console</font>
										</font>
										<font size="2">
												<font class="font7" face="宋体">全部流程<br /></font>
												<font class="font6" face="Arial">2</font>
												<font class="font7" face="宋体">：</font>
												<font class="font6" face="Arial">11</font>
												<font class="font7" face="宋体">封邮件中的</font>
												<font class="font6" face="Arial">1.4.6.7.8</font>
										</font>
										<font size="2">
												<font class="font7" face="宋体">测试<br /></font>
												<font class="font6" face="Arial">3</font>
												<font class="font7" face="宋体">：开心服务器方面文档阅读</font>
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
						</tr>
						<tr style="HEIGHT: 52.5pt; mso-height-source: userset" height="70">
								<td class="xl24" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 52.5pt; BACKGROUND-COLOR: transparent" width="135" height="70" x:num="39073" x:fmla="=C4+1">
										<font face="Arial">Fri</font>
								</td>
								<td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<font size="2">
												<font face="Arial">1:</font>
												<font class="font7" face="宋体">测试X</font>
												<font class="font6" face="Arial">MS Admin Console</font>
										</font>
										<font size="2">
												<font class="font7" face="宋体">全部流程<br /></font>
												<font class="font6" face="Arial">2</font>
												<font class="font7" face="宋体">：</font>
												<font class="font6" face="Arial">11</font>
										</font>
										<font size="2">
												<font class="font7" face="宋体">封邮件中的剩余邮件测试<br /></font>
												<font class="font6" face="Arial">3</font>
												<font class="font7" face="宋体">：</font>
												<font class="font6" face="Arial">PAD</font>
										</font>
										<font size="2">
												<font class="font7" face="宋体">测试<br /></font>
												<font class="font6" face="Arial">4</font>
												<font class="font7" face="宋体">：开心服务器方面文档阅读</font>
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
						</tr>
						<tr style="HEIGHT: 30pt; mso-height-source: userset" height="40">
								<td class="xl24" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 30pt; BACKGROUND-COLOR: transparent" width="135" height="40" x:num="39074" x:fmla="=C5+1">
										<font face="Arial">Sat</font>
								</td>
								<td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<font size="2">
												<font face="Arial">1:</font>
												<font class="font7" face="宋体">测试X</font>
												<font class="font6" face="Arial">MS Admin Console</font>
										</font>
										<font size="2">
												<font class="font7" face="宋体">全部流程<br /></font>
												<font class="font6" face="Arial">2</font>
												<font class="font7" face="宋体">：</font>
												<font class="font6" face="Arial">PAD</font>
												<font class="font7" face="宋体">测试</font>
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
						</tr>
						<tr style="HEIGHT: 18pt; mso-height-source: userset" height="24">
								<td class="xl24" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 18pt; BACKGROUND-COLOR: transparent" width="135" height="24" x:num="39075" x:fmla="=C6+1">
										<font face="Arial">Sun</font>
								</td>
								<td class="xl25" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<font face="Arial" size="2">　</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />格式懒得动了。。只是记录。。。<br />我觉得形式不是最重要的，关键是员工做了事情<img src ="http://www.cnitblog.com/charester/aggbug/21007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-23 16:20 <a href="http://www.cnitblog.com/charester/archive/2006/12/23/21007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（12.10--12.16）工作回顾 </title><link>http://www.cnitblog.com/charester/archive/2006/12/23/21006.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Sat, 23 Dec 2006 08:18:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/23/21006.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/21006.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/23/21006.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/21006.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/21006.html</trackback:ping><description><![CDATA[
		<table style="WIDTH: 837pt; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="1115" border="0" x:str="">
				<colgroup>
						<col style="WIDTH: 87pt; mso-width-source: userset; mso-width-alt: 3712" width="116" />
						<col style="WIDTH: 104pt; mso-width-source: userset; mso-width-alt: 4448" width="139" />
						<col style="WIDTH: 101pt; mso-width-source: userset; mso-width-alt: 4320" width="135" />
						<col style="WIDTH: 173pt; mso-width-source: userset; mso-width-alt: 7360" width="230" />
						<col style="WIDTH: 139pt; mso-width-source: userset; mso-width-alt: 5920" width="185" />
						<col style="WIDTH: 125pt; mso-width-source: userset; mso-width-alt: 5312" width="166" />
						<col style="WIDTH: 54pt" span="2" width="72" />
				</colgroup>
				<tbody>
						<tr style="HEIGHT: 15pt" height="20">
								<td class="xl25" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: windowtext 2pt double; BORDER-LEFT: windowtext 2pt double; WIDTH: 87pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 15pt; BACKGROUND-COLOR: transparent" width="116" height="20">
										<strong>
												<em>
														<font face="Arial">From</font>
												</em>
										</strong>
								</td>
								<td class="xl26" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: windowtext 2pt double; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 104pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="139">
										<strong>
												<em>
														<font face="Arial">To</font>
												</em>
										</strong>
								</td>
								<td class="xl26" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: windowtext 2pt double; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="135">
										<strong>
												<em>
														<font face="Arial">Week</font>
												</em>
										</strong>
								</td>
								<td class="xl26" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: windowtext 2pt double; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<strong>
												<em>
														<font face="Arial">Work List</font>
												</em>
										</strong>
								</td>
								<td class="xl26" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: windowtext 2pt double; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 139pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="185">
										<strong>
												<em>
														<font face="Arial">Summarizer&amp;Suggestion</font>
												</em>
										</strong>
								</td>
								<td class="xl27" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext 2pt double; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 125pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="166">
										<strong>
												<em>
														<font face="Arial">Plan of Next Week</font>
												</em>
										</strong>
								</td>
								<td class="xl28" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 54pt; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" width="72">
										<strong>
												<em>
														<font face="Arial">
														</font>
												</em>
										</strong>
								</td>
								<td class="xl28" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 54pt; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent" width="72">
										<strong>
												<em>
														<font face="Arial">
														</font>
												</em>
										</strong>
								</td>
						</tr>
						<tr style="HEIGHT: 50.25pt" height="67">
								<td class="xl31" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 2pt double; WIDTH: 87pt; BORDER-BOTTOM: black 0.5pt solid; HEIGHT: 234pt; BACKGROUND-COLOR: transparent" width="116" height="312" rowspan="7" x:num="39062">11-Dec-06</td>
								<td class="xl33" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 104pt; BORDER-BOTTOM: black 0.5pt solid; BACKGROUND-COLOR: transparent" width="139" rowspan="7" x:num="39068" x:fmla="=A2+6">17-Dec-06</td>
								<td class="xl24" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="135" x:num="39062">
										<font face="Arial">Mon</font>
								</td>
								<td class="xl29" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<font size="2">
												<font face="Arial">1</font>
												<font class="font7" face="宋体">：协助</font>
												<font class="font6" face="Arial">f</font>
												<font class="font7" face="宋体">编写的</font>
												<font class="font6" face="Arial">TFS</font>
												<font class="font7" face="宋体">教程</font>
												<font class="font6" face="Arial">---</font>
										</font>
										<font size="2">
												<font class="font7" face="宋体">测试工具入门<br /></font>
												<font class="font6" face="Arial">2:VPN</font>
										</font>
										<font size="2">
												<font class="font7" face="宋体">问题解决，正常工作<br /></font>
												<font class="font6" face="Arial">3</font>
												<font class="font7" face="宋体">：测试</font>
												<font class="font6" face="Arial">XMS Admin Console Part4</font>
										</font>
								</td>
								<td class="xl35" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 139pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="185" rowspan="7">
										<font face="宋体">基本上全部在测试 XMS Admin Console ，中途也很好的完成了系统管理员的工作，TFS，打印机，网络方面都做了很多工作<br /><br /><br /></font>
								</td>
								<td class="xl36" style="BORDER-RIGHT: windowtext 2pt double; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 125pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="166" rowspan="7">
										<font face="宋体">继续XMS Admin Console的测试，继续做好系统管理工作，等待新的工作安排</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体">
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体">
										</font>
								</td>
						</tr>
						<tr style="HEIGHT: 56.25pt; mso-height-source: userset" height="75">
								<td class="xl24" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 56.25pt; BACKGROUND-COLOR: transparent" width="135" height="75" x:num="39063" x:fmla="=C2+1">
										<font face="Arial">Tue</font>
								</td>
								<td class="xl29" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<font face="Arial" size="2">1</font>
										<font size="2">
												<font class="font7" face="宋体">：配置公司的打印机，彩打，扫描仪等全部正常工作，并且亲自帮助市场部和行政部安装打印机驱动<br /></font>
												<font class="font6" face="Arial">2</font>
												<font class="font7" face="宋体">：测试</font>
										</font>
										<font class="font6" face="Arial" size="2">XMS Admin Console Part4<br /></font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="Arial" size="2">
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="Arial" size="2">
										</font>
								</td>
						</tr>
						<tr style="HEIGHT: 45pt; mso-height-source: userset" height="60">
								<td class="xl24" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 45pt; BACKGROUND-COLOR: transparent" width="135" height="60" x:num="39064" x:fmla="=C3+1">
										<font face="Arial">Wed</font>
								</td>
								<td class="xl29" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<font size="2">
												<font face="Arial">1:</font>
												<font class="font7" face="宋体">起草打印机使用说明，编写文档：</font>
												<font class="font6" face="Arial">c</font>
												<font class="font7" face="宋体">打印机使用说明</font>
										</font>
										<font size="2">
												<font class="font6" face="Arial">.doc<br />2</font>
												<font class="font7" face="宋体">：测试X</font>
												<font class="font6" face="Arial">MS Admin Console Part4</font>
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="Arial" size="2">
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="Arial" size="2">
										</font>
								</td>
						</tr>
						<tr style="HEIGHT: 28.5pt; mso-height-source: userset" height="38">
								<td class="xl24" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 28.5pt; BACKGROUND-COLOR: transparent" width="135" height="38" x:num="39065" x:fmla="=C4+1">
										<font face="Arial">Thu</font>
								</td>
								<td class="xl30" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<font size="2">
												<font face="Arial">1:</font>
												<font class="font7" face="宋体">测试X</font>
										</font>
										<font size="2">
												<font class="font6" face="Arial">MS Admin Console Part4<br />2:check </font>
												<font class="font7" face="宋体">邮件</font>
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
						</tr>
						<tr style="HEIGHT: 18pt; mso-height-source: userset" height="24">
								<td class="xl24" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 18pt; BACKGROUND-COLOR: transparent" width="135" height="24" x:num="39066" x:fmla="=C5+1">
										<font face="Arial">Fri</font>
								</td>
								<td class="xl29" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<font size="2">
												<font face="Arial">1:</font>
												<font class="font7" face="宋体">测试X</font>
												<font class="font6" face="Arial">MS Admin Console</font>
												<font class="font7" face="宋体">全部流程</font>
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
						</tr>
						<tr style="HEIGHT: 18pt; mso-height-source: userset" height="24">
								<td class="xl24" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 18pt; BACKGROUND-COLOR: transparent" width="135" height="24" x:num="39067" x:fmla="=C6+1">
										<font face="Arial">Sat</font>
								</td>
								<td class="xl29" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<font size="2">
												<font face="Arial">1:</font>
												<font class="font7" face="宋体">测试X</font>
												<font class="font6" face="Arial">MS Admin Console</font>
												<font class="font7" face="宋体">全部流程</font>
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
										<font face="宋体" size="2">
										</font>
								</td>
						</tr>
						<tr style="HEIGHT: 18pt; mso-height-source: userset" height="24">
								<td class="xl24" style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 101pt; BORDER-BOTTOM: windowtext 0.5pt solid; HEIGHT: 18pt; BACKGROUND-COLOR: transparent" width="135" height="24" x:num="39068" x:fmla="=C7+1">
										<font face="Arial">Sun</font>
								</td>
								<td class="xl29" style="BORDER-RIGHT: windowtext 0.5pt solid; BORDER-TOP: windowtext; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 173pt; BORDER-BOTTOM: windowtext 0.5pt solid; BACKGROUND-COLOR: transparent" width="230">
										<font face="Arial" size="2">　</font>
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
								</td>
								<td style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; BORDER-BOTTOM: #ece9d8; BACKGROUND-COLOR: transparent">
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />我很讨厌这样写。。。。。我都懒得写。。<img src ="http://www.cnitblog.com/charester/aggbug/21006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-23 16:18 <a href="http://www.cnitblog.com/charester/archive/2006/12/23/21006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>也谈LINUX的学习方向及学习方法. （ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20948.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 13:15:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20948.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20948.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20948.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20948.html</trackback:ping><description><![CDATA[
		<p>首先,我想说的是,我自己接触LINUX是今年7月份,以前我接触的是一些UNIX系统,如SCO OPENSVER、HP UX、IBM AIX等。本人干的一直都是系统管理方面的工作，学习LINUX一半是由于自己的兴趣，一半是工作的需要（为以后打基础）。对LINUX而言，我还处在熟悉阶段。<br />其次，我要说的是，如果你整天就是美化界面、玩安装、汉化等，你并不能说你是一个LINUX的高手，甚至连一个LINUX的熟悉人士都谈不上。君不见老外有几个懂汉化的？但是你能说你的LINUX水平比他们高吗？<br />学习方向：<br />一、内核源码学习。我现在没时间也没精力来干着件事，大学时曾经读过UNIX的一些源码，我觉得即使你不分析它，读一遍对每个人都是有好处的。<br />二、系统管理、SHELL界面、图形外挂等。就系统管理、用户管理、文件管理等来说，LINUX跟UNIX很相象，很多的命令跟UNIX也差不多。在目前，这是我的学习方向。<br />三、应用开发。就目前而言，在易用性、应用系统多样化方面等，LINUX跟它的竞争对手WINDOWS相比还有一定的差距，我本人的工作性质的关系，基本上不作在LINUX上开发应用的尝试。采用的是拿来就用的原则。<br />四、应用集成。根据自己的工作环境，尝试将一些LINUX的应用集成到工作中，与公司中其它的各种系统、应用形成一个整体，进行统一的管理。这也是我的学习重点。<br />学习方法：<br />一、比较法。我喜欢将一些windows、UNIX中的知识、管理工具、思路跟LINUX作一些比较。发掘它们的相同之处和不同之处。如文件系统，LINUX支持哪些文件系统，而常用的UNIX中又有哪些文件系统，不同的文件系统有什么差异。不同的工作环境中应该怎样选用不同的文件系统？应该怎样在可管理性、安全性、性能等方面进行综合评估它们？如果你一点都说不上的话，我想你应该补补课了。<br />二、举一反三法。对任何的命令，我习惯性的就是先弄清楚它到底有那些参数，能做什么用；跟它相关的命令有哪些，又能做些什么？；这些命令它到底涉及到哪些系统文件？只有这样，才能对这个命令称得上说熟悉，说不定很多你自以为很熟悉的命令能干很多你意想不到的工作哦！<br />三、查询法。我不想对一个自己不知道的问题马上去问别人。很多时候MAN一下，用google查询一下，论坛中搜索一下，答案可能就在你的眼前。我发现很多的弟兄没有养成这种习惯，其实通过你自己查询来的知识，你可能领会得更深，因为你需要好好的从头看一下，看看有什么遗漏的，而不是别人简单的一就是一的告诉你。<br />四、交流法。如果对一个问题进行了思考，查询到了一定的知识，还是解决不了，那么最直接的方法就是上网问别人了，不耻下问嘛！将你的困难、理解、观点告诉别人，请别人来帮助你。<br />好啦，说了一堆费话，也该入正题了。<br />一、问问各位斑竹，咱们论坛的方向是什么，立足LINUX使用普及推广；LINUX系统管理；LINUX与其它系统的集成应用管理；LINUX应用开发；LINUX内核技术研究？？？？？怎样从不同的方向来引导弟兄们进行不同层次的学习？<br />二、也问问各位弟兄们。你们学习LINUX的目的是什么？成为一个使用者；LINUX系统管理者；各种系统综合管理者（集成方案提供者）；应用开发人员；LINUX研究者？？？？？<br />我抛砖引玉，请弟兄们能谈谈自己的一些观点及想法。谢谢！<br /><br /><br /><br /><br />wxz8兄抛砖引玉，我这块碎瓦也来说说。<br />美化界面、玩安装、汉化等是推广Linux的基础，我们都希望有更多的朋友加入Linux。一个论坛光推广Linux也不行的，也要在技术上有所成长。所以我想除了推广，咱们还要发展兄弟提到的LINUX系统管理；LINUX与其它系统的集成应用管理；LINUX应用开发；LINUX内核技术研究等等方面，这就是各个专题版块的所要做的。把新手带进了Linux大门，有了一定的基础，就要看各人自己喜好选择感兴趣的方面研究，这时候相应的版块就给这些朋友们提供了一个好地方。LinuxSir应该是个Linux技术的综合论坛。从入门到高手都会找到适合自己的版块，我是这么期望的。<br />关于大家学习Linux的目的，以前也讨论过，什么都有，很多人都是兴趣，就跟一个爱好一样。并不是都想着将来靠Linux吃饭，这点兄弟你有点现实了，Linux本来就是靠黑客等凭兴趣和自由的信念发展起来的。<br />wxz8兄分析得很好，尤其是学习法，值得大家学习，谢谢。<br /><br /><br />我的观点，入门级和高级应用都要做而且要做好（两手抓两手都要硬 <img class="inlineimg" title="使眼色" alt="" src="http://www.linuxsir.org/bbs/images/smilies/wink.gif" border="0" /> ）<br />虽然现在论坛中大部分的讨论都是很初级的，但想让让更多的人加入linux队伍<br />这些讨论显然还是远远不够的。我们和那些英语国家的人相比，在用linux时又多了语言障碍。汉化过程中会有许多问题，往往一个问题解决了，另一个问题又有了。需要中文输入法。还有就是看“帮助”，人家man一下就解决了很多问题，而我们呢，看不懂，还是得问。（虽然现在有中文的man但还是资料有限，所以一定要把英语学好）。推广linux的基础就是使linux外表更像windows，所以，安装、汉化的讨论是不可避免的，也是很重要的。<br /><br />企业级应用、高级应用也要做好，因为linux在这些方面是强项。而且只有学习这方面知识才能真正提高自己的水平。做好了才能吸引更多的高手到这个论坛。<br /><br />关于资金问题，我觉得可以卖linux的相关东西，国外许多非营利组织也是这么做的（也有许多兄弟没用刻录机没有上宽带，卖光盘也是方便了这些兄弟）<br />还可以找一个信誉比较好的网上广告站点，在页面放些banner 兄弟们会帮着点的。<img class="inlineimg" title="酷" alt="" src="http://www.linuxsir.org/bbs/images/smilies/cool.gif" border="0" /><br /><br /><br /><br />1.读核心源代码是绝对收益大的，而且需要极大的耐心。<br />2.如果能加入一些感兴趣的源码开发项目，收获自然不会少。<br />3.如果能在LINUX下试着开发一个小的项目(哪怕是一个小的工资程序)，则一定能收到意想不到的效果。<br />4.做网管不论做到什么境界，最后还得会编程序，一些东西不是随时有补丁可用的。如想弄懂shellcode，自然还得会看懂代码，不然认识不会深刻。<br />5.要在浓厚兴趣下，努力试着自己解决，自己查找，最后不行再到新闻组或BBS上问。呵呵，自己解决问题后的快感应该象打桥牌后，打了个打大满贯一样爽就可以了。<br /><br />观点可能不好，愿者上勾吧。:-)<br /><br /><br />我很早就想学学关于UNIX/LINUX方面的东西，去年的时候机子上就有了MANDRAKE 8.2了，可是当时一直没怎么用。<br />大概2，3个月前，带着对windows的一些厌倦，重新开始用linux了，开始有很多问题，很多东西都不懂。现在一般的安装、操作都没有什么问题。一是自己学到一些东西，另一方面，现在的发行版安装其实都比较简单了，各种语言一般都支持，只是可能离我们的期望还差那么一点点了。但是要能用总的来说不是太难的事情，但是要用好就是另外一回事。<br />我是做windows下的程序开发的，对windows的整个系统结构，特别是桌面程序还是比较了解，虽然不能进入windows的系统内核，不过写过这么多程序之后，我想对这方面的了解还是比这回用的人更深入一些。明白了他最基本的道理，你就可以驾驭他，让自己随心所欲做一些事情。linux也是一样的，你想驾驭他，那么你必须先了解他的习性，看一些系统较底层一些的东西是很有用处的，毕竟一个操作系统都不是在一定的范围内不断发展，很多基本的东西是不大会有大的改动。就像是unix上的东西大多数在linux上可以用的。了解他们之间的关系对你深入了解这个系统很有帮助的。现在在看两本书，一本是&lt;UNIX操作系统教程&gt;,一本是《unix环境高级编程》，很有启发。<br />我是从一个程序员的角度出发说这些的，如果你想在这个系统上作一些个性话的事情，那么你不了解他怎么性呢。至于“面子”上的事情，过得去就行了！不用太在意。<br /><br /><br />linux太难用了!(一通鼠标点击，进入/etc)<br />学习linux,你忘记windows的思维方式了吗？<br />怎么安装软件阿？那一堆文件是干什么的阿？<br />学习linux,你还在浮躁吗？<br />进入linux,随便按了几下.赶紧重启进入win<br />学习linux,你用心了吗？<br />.......<br />你我共勉之<br /><br />作者:GuCuiwen email:win2linux@163.com<br /><br /><font color="red">版权声明:<br />本文档可以在网络上在非商业范围内自由转载,转载请注明出处<br />如果转载版面包含商业广告,请向作者支付至少每千字100园的稿费<br />以书面,书籍形式转载和出版请按至少每千字100园人民币的标准向作者支付稿费</font><br /><br /><br />首先,我想引用一下别人说过的一句话:除非在过去的十年你一直生活在山洞里,否则你一定听说过linux.<br /><br />是的,现在听说过linux,会一点linux基本操作的人多如牛毛,然而真正能用linux做一点事情的确少之又少,这就造成了现在的状况:各大 linux论坛十分热闹,但我国linux人材却还十分紧缺.到底是什么原因造成了这样的状况? 纠其原因,只有两个字:浮燥!<br /><br />如果在论坛里来一次调查投票,看一下在论坛里的人到底有多少人手头有一本以上的正规linux教材.我想这个数字不会超过30%. 如果再问一下,有多少人完整的读过各发行版自带的入门文档,系统定制文档,系统管理文档和系统安全文档,恐怕这个数字不到10%. 如果进一步再调查一下究竟有多少人静下心来学习过操作系统和计算机网络等和linux学习十分密切的专业课程,那么恐怕只有3%的数字都不到了.<br /><br />这让我想到了98年前后IT泡沫时代的中关村.在中关村的大街小巷,到处是一个个意气分发牛哄哄的IT精英.他们戴着默镜,剔着小平头,张口闭口都是网络,安全,信息,黑客,代码,产业.T恤背后写着三个字:别惹我! 然而最后IT泡沫一过,只有那些真正肯安安心心静心学习的人在IT界存活了下来.<br /><br />现在国人学习linux的状况也是这样,学linux的人个个都意气分发,以为学习linux会用linux是多么了不起.学了一点皮毛就认为很牛了.但是那些企业用人单位却很难找到真正适合的linux人材.因此,我想就目前的状况发表一下我的看法.<br /><br />首先,这篇文章是写给那些想成为linux高手,并真正想用linux做些事情的人.如果你只想做一个菜鸟,没事的时候在你双系统启动的电脑上偶尔选一次linux,然后没事进去偷着乐,那就请你自便.另外,我想说明,和真正的牛人比起来,我自己还处于一个比较低的水平.我没有读过内核源代码,不知道linux工作原理等等,但是通过摸索,至少我已经找到了通往高手的道路的方向.因此还是想说两句.<br /><br />1,linux不是玩具<br /><br />如果你想系统的学习linux,你必需清楚的认识到这一点.现在有很多人,号称是linux爱好者,但是他们大部分的事情还是用windows 做,而linux只是作为一个随便玩玩的系统.他们懂得一些linux的基本操作,知道有linux这个玩艺,也因为经常听人家说linux好就咬定了 linux就是好.只要有人说linux比windows差,那么他们就奋起反驳,他们也看不起用windows的人,认为用windows的人水平低. 但是自己用电脑的大部分时间还是用windows并且把重要的文件都放在了windows分区,因为他们骨子里只把linux当做玩具,没有真正领悟 linux的精髓所在.如果你真正想系统的学习linux,想用linux有所作为,那么请忘记windows的思维方式,慢慢感受和习惯linux的操作方式,总有一天你会真正体验到他的奥妙所在,从而从自己内心深处喜欢他,使用他,而不是为了赶时髦或向人炫耀而使用他.<br /><br />2,手头有一本好的入门教材吗<br /><br />"如果你还没有好好的读完过一本linux安装及入门教材就不要到初学者论坛来问题!因为你连问问题的资格都没有! " 这是我的一个比较偏激的观点.<br /><br />如果你现在开始下决心学习linux了,那么第一件你要做的事情是到书店去挑一本好书.而不是到论坛社区去问该用什么版本,该如何学习 linux.一本好的入门教材可以让你快速领悟linux的操作方式,系统的基本使用等等.而且都是前人总结经验写出来的,他可以帮你搭起一个学习 linux的框架,对linux有一个总体的认识.就好比建一撞大楼前先打好地基,搭好混凝土框架.以后就可以慢慢往这个框架里添砖加瓦,最后建起大楼. 而那些想急于学习的,不想看书,只想靠混论坛来学习linux知识的人,就好比建一撞大楼,今天建好第一层,然后第一层就要全部粉刷好,装修好,家具买好住进去,然后第二天再开始建第二层.这样没有整体规划的学习是学不好linux的,最后的结果是浪费自己的时间,也浪费别人的时间. 如果你不信,可以让实事去告诉你,以一年为限,你和你的一个朋友同时从0开始学linux,计算机基础差不多.你去买几本好书自己慢慢看边看边做实验,让你的朋友整天到各大论坛瞎混零散的学些linux知识.也许一开始,你的朋友会比你懂得多,但是一年以后你的水平肯定在你的朋友之上. 在初学阶段,不要随便在论坛上发问,多看书是根本,即使真的非问不可的问题,也要先自己动手察资料解决.实在不行再来问,高手不会鄙视菜鸟,因为每一个高手都是从菜鸟过来的,他们都知道菜鸟的苦衷.但是高手会看不起那些自己不愿动手动脑不会学习解决问题而只想得到现成答案的人.那样的人会被高手在心里暗骂成不配用linux的蠢货.<br /><br />你需要以下几种书:<br />一本好入门教材-&gt;一本linux指令参考手册-&gt;linux系统管理手册-&gt;讲解linux系统原理的书.<br /><br />一开始,你只需要入门教材就可以了.并且严格安教材的讲解去学习,不要一天到晚想着去装显卡驱动啦,装游戏啦,装软件啦,这些都没有必要.你就当你自己的电脑不能上网,只能通过看书学习.慢慢看书,稳抓稳打.慢慢地就融会贯通了.这时候你再到linux初学者论坛去看看,你在那里早已经是高手了.<br /><br />另外,一开始你要选定一本入门教材,但是不能只看一本,因为有些书上讲的,可能是另外的书上没有的.因此,重点选一本教材看完.然后再看两三本入门教材浏览一下.作为对第一本书的知识的扩充和巩固. 在看书过程中,如果你有什么不懂的,不要急于上论坛问,自己认真看几次,实在不懂没有关系,把问题放在那里.不要钻牛角尖不懂不肯放手,这种精神是好的, 但是方法是错误的.你尽管学下去,也许你看完书本以后的内容,就对前面不懂的内容豁然开朗了.这是在学习linux中常有的情况.<br /><br />另外,现在很多入门书籍是针对非技术型用户的.(我把那些对linux本身不感兴趣,只想用他来上网,听音乐和打字的人称为非技术型用户,而把对linux本身感兴趣的人称为技术用户)<br />这些针对非技术型用户的入门书籍几乎通篇都是插图,讲解的内容都是如何在图形界面下操作.这些书籍并不能帮你成为一个高手.反而会让你养成倚赖鼠标和图形界面操作的习惯以后很难改掉.因此不能看这些书,一定要买那些一开始就从系统基本机构基本命令开始讲解的书籍.我看过的第一本linux入门书籍共有十多章,但是他从第十一章开始才大致的讲解了一下图形界面的知识.我很感谢这本书,让我一开始就脱离了windows的思维方式,给我以后的进一步学习带来了很大帮助.<br /><br />完成以上的内容,你就完成了建大楼打地基建混凝土框架的过程了.可以接下来进一步学习了.<br /><br />3,你看完系统自带的文档了吗?<br /><br />当你完成入门的过程后,就可以开始读其他的文档,然后到论坛的精华区看看,向你建起来的大楼框架中添砖头了.当然 ,首先要读的,还是系统自带的文档.<br /><br />绝大多数linux发行版都自带非常详细的文档.比如我一直在用的redhat,他有从系统安装到系统安全,针对不同层次的人的详尽文档.静下心来,把这些文档读完,比看任何论坛的精华区都有用.书籍和文档就好比是你每天都离不开的一日三餐,论坛区的精华文档就好比是点心和水果.你可以不吃点心和水果,但是决不能不吃正餐.<br /><br />当然,不能为看文档而看文档,你一定要边看边安文档中说的做试验验证.这样才印象深刻,否则看过就忘记了等于没有看.<br /><br />另外,如果真心想学习linux就不要吝啬,也不要害怕丢失数据而不敢做实验.我建议你去买一个小的二手硬盘,然后放开手干.不要怕丢失数据而不敢做,如果你没有学会技能,将来做了linux系统管理员或者网络管理员到那时因为不会而丢了数据就是大事情了.<br /><br />4,学习linux不是逛自由市场.<br /><br />经常看到有人问用什么版本的linux好,其实只要你认真学习无论什么版本都挺好的.要知道,开发linux发行版的人都是通读过linux内核代码,对linux原理极其精通的人,而且每一个开发团队都对他的发行版做过测试后放出的.那些国际知名的大品牌更是如此. 因此,讨论什么版本好并无意义,关键是你是不是真心想学.不过,为了避免曲高和寡,最好选用的人多的版本,比如redhat manrake suse 等等. 国内有一两个linux版本做的也不错,但是国内的linux都是面向非技术型用户开发的,因此,如果你想成为高手,建议不要用国内的版本.<br />学习linux不是逛自由市场,选定版本就要静下心来学习.不要今天换版本明天要升级.这样对你没有好处.我见过一些人号称用过十几种甚至几十种linux,向人谈论起来头头是到,好像懂的很多,但是如果你让他去用linux搭建一个web服务器,做一个linux网关,他就什么都不会了.他们把时间都浪费在了版本的转换上了.<br /><br />5,你能看懂英文文档吗?<br /><br />谈论这个问题,我有点低气不足,因为我自己的英语很差.但是,至少我可以无障碍的读完一般的计算机文档.计算机英语很简单,只要熟悉了计算机专业英语,高中毕业的水平就可以轻松的阅读计算机文档了.如果你的英语实在太差了,连最简单的计算机英语文档都看不懂,那么在学习linux的同时,请赶紧学习英语.也许你说,你可以看翻译的文档,当我还是一个菜菜鸟的时候,也是这样认为的.但是,后来才发现,如果你想深入学习linux,看不懂因为文档实在是太难了.写的最好的,最全面的文档都是英语写的,最先发布的技术信息也都是用英语写的.即便是非英语国家的人发布技术文档,也都首先翻译成英语在国际学术杂志和网络上发表.你去看看各大软硬件生产商的官方网站,有哪一个不是用英语作为其主站的? 长期用windows的人会很不习惯这一点,装个软件还要看半天文档,应为windows用起来实在太简单了.但是如果你想学习linux就必需学会看各种文档,而大部分的文档都是用英语写的.我发现很多人甚至连man文档都不会看,有什么命令不会用了就跑到论坛上来问,还装出一副可怜相,乞讨一个命令的用法.有这些时间还不如自己看看man文档,即使你一个一个单词的翻译成中文再自己看都比问别人强,因为别人的回答再怎么详尽都比不上man文档详尽.安装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么.否则,说明文档都不看,结果出了问题再来找答案反而浪费时间! 古人说欲速则不达就是这个道理!<br /><br />6,忘记windows的思维方式<br /><br />思想性的转变比暂时性的技术提高更有用,因为他能帮助你加快学习速度.现在很多人用linux.但是,他们用linux的方式完全是 windows的那一套方式.骨子里都是windows的思想.这样是不能领悟linux的精髓体验不到他的优越性的.我前几天看到一个朋友要把刚装了不到2天的mandrake 10 删除掉,我问他为什么,他说太慢了,受不了,还是用windows快.然后我留意了一下他用linux的方式,他的所有操作都带着windows的影子. 他连最基本的删除,移动文件这样的操作都要用鼠标,这样当然慢了!最后我只好说,你删除吧,你不适合用linux,linux不是这样用的.各位可以去看看那些linux高级用户,他们是怎样操作的.通常他们都是在X上开一个xterm或者rxvt终端,80%以上的操作都在这个终端下用命令完成,因为 linux的命令行十分强大,速度也十分快,简单的几个命令的组合就能完成非常复杂的操作.举一个例子:linux的常用命令find,去看看man文档,初学者一定会觉得太复杂而不原意用,但是你一旦学会了就对他爱不释手.他的功能实在太强了,在配合exec参数或者通过管道重定向到xargs命令和 grep命令,那么他能完成非常复杂的操作,如果同样的操作你用图形界面的工具来完成,恐怕要多花十几陪的时间.因此linux高手经常会说:如果没有 find和grep我们还怎么活.但是现在大部分的linux初级用户受到windows影响都喜欢用图形界面的工具来完成一些基本的操作,我并不是说图形界面不好.只是由于linux和windows设计思想的不同他们的操作方式也有很大不同.在windows下用图形界面操作会比敲命令快,但是 linux是一个命令行组成的操作系统,他的精髓在命令行! 无论图形界面发展到什么水平这个原理是不会变的!<br /><br />7,入门以后多学命令<br /><br />当你看完了一两本入门书籍后就应该扩充自己的知识,多学习linux命令,但是不要在初学阶段就系统的学习linux命令,初学阶段只要学会书上提到过的命令就可以了.单靠学习各种命令而成为高手是不可能的,但不会命令而成为高手也是不可能的.这就好比学英语,什么语法都不懂,只捧着单词手册背单词是学不会英语的,但是没有单词词汇量英语水平也提不高的.<br /><br />在linux中学习命令的最好办法是学习bash脚本编程.bash脚本比起其他语言来学习简单,但是功能却十分强大.通过学习bash编程,能让你掌握大量的linux命令.另外,买一本命令参考手册是必要的,遇到不知道怎么用的命令可以随时查询,这要比察man文档快.特别适合英语不好,看不懂man文档的人.<br /><br />在linux中,命令可分为系统基本命令和应用程序命令.系统基本命令是所有的unix类系统都支持的命令,走到哪都不变,只要是unix类系统上就肯定有.比如ls,rm,rmdir,cp,cd,mv,cat等等.这样的基本命令大约有200个,这些命令是一定要掌握的,我买了一本&lt; redhat 7 指令参考手册&gt;这本书非常好,他根据命令的常用指数分类,标明3颗星的为最常用命令,一定要掌握,两颗星的其次,1颗星的只要知道一下就可以了虽然现在都已经FC3了,但是经典的UNIX基本命令几十年来都没有变过!另外有些命令是linux特有的或者是某一个应用程序的可执行文件比如xmms播放器.这些只要知道就可以了,不知道也无所谓.有些命令比较少用,因此通常都记不住他的用法,对于这些命令至少要知道有这个命令,脑子里有印象,需要用的时候察一下手册就可以了,但是决不能不知道这个命令的存在!<br /><br />8,学会管理系统<br /><br />等到有了基本知识,也掌握了一定量的命令用法后,就可以进一步学习管理系统.这些内容入门书上会有,但是不会很深入.要深入的学习系统管理,就要去买一本类似&lt;linux系统管理大全&gt;之类的书.认真的看书并做实验,可以让你很快的进步.学习配置各种网络服务器,用linux搭建网络,这些都是学习linux系统管理和网络管理的好方法. 到了这个阶段就可以经常上网察察资料,看发布软件的官方网站文档和FAQ,看看论坛精华区文章.但是不能本末倒置,多看书还是根本.书籍和官方文档可以让你系统的学习,但是论坛可以让你学到一些小知识,小技巧.我本人也经常到论坛上来看看,因为即便是一个新手,也可能会发现一些你所不知道的小技巧,看论坛可以学到这些小技巧.但是我看文档和看论坛的时间比不会小于4:1 . 可以把平时积累的问题一次在论坛上发问. 但是初学的时候不要频繁上论坛,因为你要问的问题都在书上写着,耐心一点,你很快就能看到了.<br /><br />9,了结系统结构<br /><br />等你有了一定的系统管理知识,知道了/etc下那些配置文件有什么用,知道了一般的网络服务器如何配置后,就可以去了解系统结构了. 了解系统结构不是要你去看什么文件夹放什么内容,而是要学习一些原理性的东西.比如系统是如何引导的,引导后启动了那些东西.系统中哪些是最基本的库文件,有什么用等等.学习系统结构的最好方法是自己做一个linux系统,再也没有什么能比自己做一个linux系统更能学习系统结构的了.LFS (linux from strach)可以教你从源代码自己编译一个系统.通过自己编译一个系统,你就可以了结linux系统结构,知道哪些文件是干什么用的,以及他们如何协调工作.当然,在你达到LFS水平之前还有很多事情要做,比如学会如何编译安装源代码发布的软件和编译新的内核等等.到了LFS水平,那么在大多数 linux论坛上你就可以被人称作"高手"了!到了这个地步,就相当于一撞大楼已经基本建好,但是还需要粉刷和装修,真正的细活还在后面!<br /><br />永远记住天外有天,人外有人的道理.即便有了LFS水平,在那些搞linux系统开发,通读过linux内核代码的人看来你还是一个菜鸟.因此, 请时刻保持虚心的态度.即便是在 论坛上只有一颗星级别的人,也有可能是一个潜在的,真正的高手! 大多数真正的高手平时都在搞研发工作,哪里有时间上论坛啊! 倒是有很多大学还没毕业的学生,整天混在论坛上.<br /><br />10,学习专业课程<br /><br />如果你不是计算机专业的,而想把linux学好,就一定要学习专业课程.学习微机原理,操作系统,计算机网络等等专业课程是必需的.为什么同时开始学习linux,有些人学的非常快,不到半年就成了高手,有些人玩来玩去还玩不出名堂,玩了一两年还是菜鸟? 因为那些学得快的人有基础,他们都学过专业课程.同样一篇文档,没有基础的人可能看了三遍还不明白,基础扎实的眼睛扫两下就懂了! 这就是专业和非专业的差别! 因此,要想达到更高的境界就一定要学习基础的专业课程.<br /><br />11,保持虚心学习的态度<br /><br />我想再重复一遍天外有天,人外有人的道理!<br />保持虚心的学习态度不仅能让你学到更多知识,而且会让你受人尊重.<br /><br />在linux的世界里,如果你想靠混论坛,发水贴,换几颗星星增加一下级别,然后再面对菜鸟说几句牛哄哄的话来赢得别人的尊重是不可能的.即便是一个刚入门的菜鸟,也能分辨你回答问题的质量,从而知道你到底有多少水平. 另外,当你成了"高手"的时候,你也能从"菜鸟"那里学到很多知识.因为有很多问题是你从来没有想过的,认为自己肯定会的,但是实际遇到的时候会有困难. 而"菜鸟"们往往更善于发现这类问题.这就是中国人常说的"教学相长"!<br /><br />在linux的世界里,越是水平高的人越谦虚,因为他们知道自己还有很多不知道的,而那些半瓶水就想晃荡的人反而自以为是,因为他们还不知道自己还有很多不知道的! 去看看,<a href="http://www.linuxforum.net/" target="_blank"><font color="#000000">www.linuxforum.net</font></a> 嵌入式开发和UNIX版块的牛人,他们很多都是有过好几年linux方面的工作经验,精通linux和unix的好手,但是每个人都保持着非常谦逊的态度,这些人是值得尊敬的<br /><br /><br /><br /><!-- vB 中文修改开始: 显示声望 --><!-- vB 中文修改结束 --></p>
<img src ="http://www.cnitblog.com/charester/aggbug/20948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 21:15 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC 入门资料（三）（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20946.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 13:06:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20946.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20946.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20946.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20946.html</trackback:ping><description><![CDATA[动态库*.so在linux下用c和c++编程时经常会碰到，最近在网站找了几篇文章介绍动态库的编译和链接，总算搞懂了这个之前一直不太了解得东东，这里做个笔记，也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。<br />1、动态库的编译<br /><br />下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件：so_test.h，三个.c文件：test_a.c、test_b.c、test_c.c，我们将这几个文件编译成一个动态库：libtest.so。<br /><br />so_test.h：<br /><br /><br /><br />#include <br /><br />#include <br /><br /><br /><br />void test_a();<br /><br />void test_b();<br /><br />void test_c();<br /><br /><br /><br />test_a.c：<br /><br /><br /><br />#include "so_test.h"<br /><br /><br /><br />void test_a()<br /><br />{<br /><br />printf("this is in test_a...\n");<br /><br />}<br /><br /><br /><br />test_b.c：<br /><br /><br /><br />#include "so_test.h"<br /><br /><br /><br />void test_b()<br /><br />{<br /><br />printf("this is in test_b...\n");<br /><br />}<br /><br /><br /><br />test_a.c：<br /><br /><br /><br />#include "so_test.h"<br /><br /><br /><br />void test_c()<br /><br />{<br /><br />printf("this is in test_c...\n");<br /><br />}<br /><br /><br /><br />将这几个文件编译成一个动态库：libtest.so<br /><br /><br /><br />$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so<br /><br /><br />2、动态库的链接<br /><br />在1、中，我们已经成功生成了一个自己的动态链接库libtest.so，下面我们通过一个程序来调用这个库里的函数。程序的源文件为：test.c。<br /><br />test.c：<br /><br /><br /><br />#include "so_test.h"<br /><br /><br /><br />int main()<br /><br />{<br /><br />test_a();<br /><br />test_b();<br /><br />test_c();<br /><br /><br /><br />return 0;<br /><br />}<br /><br /><br /><br />l 将test.c与动态库libtest.so链接生成执行文件test：<br /><br /><br /><br />$ gcc test.c -L. -ltest -o test<br /><br /><br /><br />l 测试是否动态连接，如果列出libtest.so，那么应该是连接正常了<br /><br /><br /><br />$ ldd test<br /><br /><br /><br />l 执行test，可以看到它是如何调用动态库中的函数的。<br />3、编译参数解析<br />最主要的是GCC命令行的一个选项:<br />-shared 该选项指定生成动态连接库（让连接器生成T类型的导出符号表，有时候也生成弱连接W类型的导出符号），不用该标志外部程序无法连接。相当于一个可执行文件<br /><br />l -fPIC：表示编译为位置独立的代码，不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要，而不能达到真正代码段共享的目的。<br /><br />l -L.：表示要连接的库在当前目录中<br /><br />l -ltest：编译器查找动态连接库时有隐含的命名规则，即在给出的名字前面加上lib，后面加上.so来确定库的名称<br /><br />l LD_LIBRARY_PATH：这个环境变量指示动态连接器可以装载动态库的路径。<br /><br />l 当然如果有root权限的话，可以修改/etc/ld.so.conf文件，然后调用 /sbin/ldconfig来达到同样的目的，不过如果没有root权限，那么只能采用输出LD_LIBRARY_PATH的方法了。<br />4、注意<br /><br />调用动态库的时候有几个问题会经常碰到，有时，明明已经将库的头文件所在目录 通过 “-I” include进来了，库所在文件通过 “-L”参数引导，并指定了“-l”的库名，但通过ldd命令察看时，就是死活找不到你指定链接的so文件，这时你要作的就是通过修改LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。<img src ="http://www.cnitblog.com/charester/aggbug/20946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 21:06 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC 入门资料（四）（ZT） </title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20947.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 13:06:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20947.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20947.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20947.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20947.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20947.html</trackback:ping><description><![CDATA[Linux编程入门-gcc、make和gdb简介<br /><br />欢迎来到Linux的编程世界！<br />　　如果你已是Windows下优秀的程序员，那么到了这里，你将会发现一个崭新的天地，虽然在Linux下编程比起在Windows下编程有种种的不便，但她的许多迷人之处一定会让你流连忘返-----只要你是一个真正"热爱"编程的程序员；如果你以前很少编程，只是刚刚迈进了这个大门，那么，你更是走对了地方，在这里，你会得到比MSDN更多的指引和帮助，你会迅速的成长为真正的程序员----如果你想成为的话。当然，这里最吸引人的，还应该是自由软件的精神。或许，在以后，你会把这里作为自己的家园。<br />　　要成为Linux下优秀的程序员，首先你要接触的便是gcc、make和gdb。如果你对微软的Visual系列开发工具有所了解的话，那么下面的等式会让你对它们有所了解，虽然并不是那么贴切：<br />　　　　gcc + make + gdb = Visual C ++<br />　　gcc(GNU cc)是一个编译器套件，它不仅能编译C、Objective C和C++程序，还能编译Fortran、Pascal等语言编写的程序。但就编译器而言，它是目前编译最快、效率最高的编译器，当然，这是非官方的说法。<br />　　make是一个项目管理工具。如果你早已习惯了敲F9、Ctrl+F9或者点击某个按钮来编译运行程序，那么，这个工具将会使你明白这一切如何发生的。<br />　　gdb（GNU DeBugger）是一个调试器，这对一个程序员是必不可少的。gdb的功能非常强大，但如果把友好的图形化的界面作为衡量的主要标准之一，那么现阶段在Linux下的确缺少好的调试器。xxgdb和kde下的Debugger正在这方面努力着。<br />　　和绝大多数教材、文章一样，我们从"Hello World!"开始。<br />　　我们先用vi或者其他一些图形化的编辑器生成一个hello.c文件： <br /><br />　　#include <br />　　void main(void)<br />　　{<br />　　　printf("Hello World!");<br />　　}<br /><br />　　我们使用gcc进行编译：<br />　　gcc hello.c -o hello<br />　　就在当前目录下生成可执行文件hello，运行这个文件，你自然就会看到Hello World!的字样。这里hello.c是源文件，-o是编译选项，hello是你指定的文件名。要注意的是，不要使用test、help这类"常用"的名字来命名自己的可执行文件，他们往往早已被系统捷足先登了。<br />　　在程序中如果引用了其它的头文件，则需要用 -I路径名 选项告诉编译器在那里才能找到这些头文件。例如，在hello.c文件中有如下的两行：<br />　　#include <br />　　#include <br />　　其中myheadfile1.h在目录/usr/local/include目录下，myheadfile2.h在上一层目录下，则编译命令如下：<br />　　gcc -I/usr/local/include -I.. hello.c -o hello<br />程序中如果使用了不在默认库中的调用，例如，要在hello.c中调用pthread_create( )函数创建多线程，输入如下代码：<br />　　……<br />　　#include <br />　　……<br />　　pthread_create(t,attr,0,0);<br />　　……<br />　　使用上面的命令编译将出错：undefined reference to 'pthread_create'。这是因为没有告诉编译器在哪里能找到包含了名为pthread_create的调用。pthread_create在/usr/lib目录下的库文件libpthread.a(静态库)和libpthread.so（动态库）中。用 -L路径名 指定库的位置，用 -lFILE 指定库名为libFILE的静态或动态库。包含了pthread_create的hello.c的编译命令为：<br />　　gcc -L/usr/lib -lpthread hello.c -o hello<br />　　当程序为一个项目，包含很多文件时，可以先用 -c 选项编译生成目标文件，然后再用-o选项连接目标文件生成可执行文件。例如，项目的源文件为server.c 和 client.c，想生成名为 myapp 的可执行文件，则编译命令为：<br />　　gcc -c server.c<br />　　gcc -c client.c<br />　　gcc server.o client.o -o myapp<br />　　以上编译命令和下面的编译命令是等价的：<br />　　gcc client.c server.c -o myapp<br />　　当项目包含多个文件时，每一次敲入繁琐的编译命令大概会吓跑所有慕名到Linux下来开发的程序员们。这时，就该make来大显身手了。<br />　　make会在当前目录下寻找名为Makefile或makefile的文件，然后依次执行该文件。以前面的myapp为例：<br />　　myapp: server.o client.o<br />　　gcc server.o client.o -o myapp<br />　　server.o: server.c<br />　　gcc -c server.c<br />　　client.o: client.c<br />　　gcc -c client.c<br />　　其中，为键盘Tab键，不能用几个空格代替，即使它们看起来一样。第1、3、5行定义了依赖关系，第2、4、6行定义了相应的编译命令。make扫描1、3、5行，目标不存在则调用相应的命令行编译，若已经存在，则比较文件日期，若冒号后的文件新于冒号前的，同样重新编译。这样，如果用户仅仅修改了client.c一个文件，则用make重新编译时server.o就不会被重新编译，这样大大节省了时间。<br />　　千里之行，始于足下。这虽然只是一个简单的开始，但是，通向一个神秘殿堂的大门已经打开了，如何才能成为一个合格的程序员，一切都要靠努力，努力养成看文档、看How-to、看高手程序的好习惯，努力自己去动手实践，一切都会好起来的<img src ="http://www.cnitblog.com/charester/aggbug/20947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 21:06 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC 入门资料（一）（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20944.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 13:04:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20944.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20944.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20944.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20944.html</trackback:ping><description><![CDATA[学习GCC的时候,在网上搜集的部分入门的资料.希望对您有所帮助!<br /><br />一、GCC简介<br /><br />通常所说的GCC是GUN Compiler Collection的简称，除了编译程序之外，它还含其他相关工具，所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进制代码。GCC是Linux平台下最常用的编译程序，它是Linux平台编译器的事实标准。同时，在Linux平台下的嵌入式开发领域，GCC也是用得最普遍的一种编译器。GCC之所以被广泛采用，是因为它能支持各种不同的目标体系结构。例如，它既支持基于宿主的开发（简单讲就是要为某平台编译程序，就在该平台上编译），也支持交叉编译（即在A平台上编译的程序是供平台B使用的）。目前，GCC支持的体系结构有四十余种，常见的有X86系列、Arm、PowerPC等。同时，GCC还能运行在不同的操作系统上，如Linux、Solaris、Windows等。<br /><br /><br />除了上面讲的之外，GCC除了支持C语言外，还支持多种其他语言，例如C++、Ada、Java、Objective-C、FORTRAN、Pascal等。<br /><br /><br />本系列文章中，我们不仅介绍GCC的基本功能，还涉及到一些诸如优化之类的高级功能。另外，我们还考察GCC的一些映像操作工具，如size和objcopy等，这将在后续的文章中加以介绍。<br /><br /><br />二、程序的编译过程<br /><br /><br />对于GUN编译器来说，程序的编译要经历预处理、编译、汇编、连接四个阶段，如下图所示：<br /><br /><br /><br /><br /><br />从功能上分，预处理、编译、汇编是三个不同的阶段，但GCC的实际操作上，它可以把这三个步骤合并为一个步骤来执行。下面我们以C语言为例来谈一下不同阶段的输入和输出情况。<br /><br /><br />在预处理阶段，输入的是C语言的源文件，通常为*.c。它们通常带有.h之类头文件的包含文件。这个阶段主要处理源文件中的#ifdef、 #include和#define命令。该阶段会生成一个中间文件*.i，但实际工作中通常不用专门生成这种文件，因为基本上用不到；若非要生成这种文件不可，可以利用下面的示例命令：<br /><br /><br /><br /><br />gcc -E test.c -o test.i<br /><br /><br /><br /><br />在编译阶段，输入的是中间文件*.i，编译后生成汇编语言文件*.s 。这个阶段对应的GCC命令如下所示：<br /><br /><br /><br /><br />GCC -S test.i -o test.s <br /><br /><br /><br /><br />在汇编阶段，将输入的汇编文件*.s转换成机器语言*.o。这个阶段对应的GCC命令如下所示：<br /><br /><br /><br /><br />GCC -c test.s -o test.o <br /><br /><br /><br /><br />最后，在连接阶段将输入的机器代码文件*.s（与其它的机器代码文件和库文件）汇集成一个可执行的二进制代码文件。这一步骤，可以利用下面的示例命令完成：<br /><br /><br /><br /><br />GCC test.o -o test <br /><br /><br /><br /><br />上面介绍了GCC编译过程的四个阶段以及相应的命令。下面我们进一步介绍常用的GCC的模式。<br /><br /><br />三、GCC常用模式<br /><br /><br />这里介绍GCC追常用的两种模式：编译模式和编译连接模式。下面以一个例子来说明各种模式的使用方法。为简单起见，假设我们全部的源代码都在一个文件test.c中，要想把这个源文件直接编译成可执行程序，可以使用以下命令：<br /><br /><br /><br /><br />$ GCC -o test<br /><br /><br /><br /><br />这里test.c是源文件，生成的可执行代码存放在一个名为test 的文件中（该文件是机器代码并且可执行）。-o 是生成可执行文件的输出选项。如果我们只想让源文件生成目标文件（给文件虽然也是机器代码但不可执行），可以使用标记-c ，详细命令如下所示：<br /><br /><br /><br /><br />$ GCC -c test.c<br /><br /><br /><br /><br />默认情况下，生成的目标文件被命名为test.o，但我们也可以为输出文件指定名称，如下所示：<br /><br /><br /><br /><br />$ GCC -c test.c -o <br /><br /><br /><br /><br />上面这条命令将编译后的目标文件命名为mytest.o，而不是默认的test.o。<br /><br /><br />迄今为止，我们谈论的程序仅涉及到一个源文件；现实中，一个程序的源代码通常包含在多个源文件之中，这该怎么办？没关系，即使这样，用GCC处理起来也并不复杂，见下例：<br /><br /><br /><br /><br />$ GCC -o test first.c second.c third.c<br /><br /><br /><br /><br />需要注意的是，要生成可执行程序时，一个程序无论有有一个源文件还是多个源文件，所有被编译和连接的源文件中必须有且仅有一个main函数，因为main函数是该程序的入口点（换句话说，当系统调用该程序时，首先将控制权授予程序的main函数）。但如果仅仅是把源文件编译成目标文件的时候，因为不会进行连接，所以main函数不是必需的。<br /><br /><br />四、常用选项<br /><br /><br />许多情况下，头文件和源文件会单独存放在不同的目录中。例如，假设存放源文件的子目录名为./src，而包含文件则放在层次的其他目录下，如./inc。当我们在./src 目录下进行编译工作时，如何告诉GCC到哪里找头文件呢？方法如下所示：<br /><br /><br /><br /><br />$ gcc test.c �I../inc -o test<br /><br /><br /><br /><br />上面的命令告诉GCC包含文件存放在./inc 目录下，在当前目录的上一级。如果在编译时需要的包含文件存放在多个目录下，可以使用多个-I 来指定各个目录：<br /><br /><br /><br /><br />$ gcc test.c �I../inc �I../../inc2 -o test<br /><br /><br /><br /><br />这里指出了另一个包含子目录inc2，较之前目录它还要在再上两级才能找到。<br /><br /><br />另外，我们还可以在编译命令行中定义符号常量。为此，我们可以简单的在命令行中使用-D选项即可，如下例所示：<br /><br /><br /><br /><br />$ gcc -DTEST_CONFIGURATION test.c -o test<br /><br /><br /><br /><br />上面的命令与在源文件中加入下列命令是等效的：<br /><br /><br /><br /><br />#define TEST_CONFIGURATION<br /><br /><br /><br /><br />在编译命令行中定义符号常量的好处是，不必修改源文件就能改变由符号常量控制的行为。<br /><br /><br />五、警告功能<br /><br /><br />当GCC在编译过程中检查出错误的话，它就会中止编译；但检测到警告时却能继续编译生成可执行程序，因为警告只是针对程序结构的诊断信息，它不能说明程序一定有错误，而是存在风险，或者可能存在错误。虽然GCC提供了非常丰富的警告，但前提是你已经启用了它们，否则它不会报告这些检测到的警告。<br /><br /><br />在众多的警告选项之中，最常用的就是-Wall选项。该选项能发现程序中一系列的常见错误警告，该选项用法举例如下：<br /><br /><br /><br /><br />$ gcc -Wall test.c -o test<br /><br /><br /><br /><br />该选项相当于同时使用了下列所有的选项：<br /><br /><br />◆unused-function：遇到仅声明过但尚未定义的静态函数时发出警告。<br /><br />◆unused-label：遇到声明过但不使用的标号的警告。<br /><br />◆unused-parameter：从未用过的函数参数的警告。<br /><br />◆unused-variable：在本地声明但从未用过的变量的警告。<br /><br />◆unused-value：仅计算但从未用过的值得警告。<br /><br />◆Format：检查对printf和scanf等函数的调用，确认各个参数类型和格式串中的一致。<br /><br />◆implicit-int：警告没有规定类型的声明。<br /><br />◆implicit-function-：在函数在未经声明就使用时给予警告。<br /><br />◆char-subscripts：警告把char类型作为数组下标。这是常见错误，程序员经常忘记在某些机器上char有符号。<br /><br />◆missing-braces：聚合初始化两边缺少大括号。<br /><br />◆Parentheses：在某些情况下如果忽略了括号，编译器就发出警告。<br /><br />◆return-type：如果函数定义了返回类型，而默认类型是int型，编译器就发出警告。同时警告那些不带返回值的 return语句，如果他们所属的函数并非void类型。<br /><br />◆sequence-point：出现可疑的代码元素时，发出报警。<br /><br />◆Switch：如果某条switch语句的参数属于枚举类型，但是没有对应的case语句使用枚举元素，编译器就发出警告（在switch语句中使用default分支能够防止这个警告）。超出枚举范围的case语句同样会导致这个警告。<br /><br />◆strict-aliasing：对变量别名进行最严格的检查。<br /><br />◆unknown-pragmas：使用了不允许的#pragma。<br /><br />◆Uninitialized：在初始化之前就使用自动变量。<br /><br /><br />需要注意的是，各警告选项既然能使之生效，当然也能使之关闭。比如假设我们想要使用-Wall来启用个选项，同时又要关闭unused警告，利益通过下面的命令来达到目的：<br /><br /><br /><br /><br />$ gcc -Wall -Wno-unused test.c -o test<br /><br /><br /><br /><br />下面是使用-Wall选项的时候没有生效的一些警告项：<br /><br /><br />◆cast-align：一旦某个指针类型强制转换时，会导致目标所需的地址对齐边界扩展，编译器就发出警告。例如，某些机器上只能在2或4字节边界上访问整数，如果在这种机型上把char *强制转换成int *类型， 编译器就发出警告。<br /><br />◆sign-compare：将有符号类型和无符号类型数据进行比较时发出警告。<br /><br />◆missing-prototypes ：如果没有预先声明函数原形就定义了全局函数，编译器就发出警告。即使函数定义自身提供了函数原形也会产生这个警告。这样做的目的是检查没有在头文件中声明的全局函数。<br /><br />◆Packed：当结构体带有packed属性但实际并没有出现紧缩式给出警告。<br /><br />◆Padded：如果结构体通过充填进行对齐则给出警告。<br /><br />◆unreachable-code：如果发现从未执行的代码时给出警告。<br /><br />◆Inline：如果某函数不能内嵌（inline），无论是声明为inline或者是指定了-finline-functions 选项，编译器都将发出警告。 <br /><br />◆disabled-optimization：当需要太长时间或过多资源而导致不能完成某项优化时给出警告。<br /><br /><br />上面是使用-Wall选项时没有生效，但又比较常用的一些警告选项。本文中要介绍的最后一个常用警告选项是-Werror。使用该选项后，GCC发现可疑之处时不会简单的发出警告就算完事，而是将警告作为一个错误而中断编译过程。该选项在希望得到高质量代码时非常有用。 <br /><br /><br />六、小结<br /><br /><br />本文介绍了GCC的基本编译过程和编译模式，并详细阐述了GCC的一些常用选项以及警告功能。这些是在利用GCC进行应用编程时最基本也最常用的一些内容，我们会在后续文章中继续介绍GCC的调试和优化技术。<img src ="http://www.cnitblog.com/charester/aggbug/20944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 21:04 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC 入门资料（二）（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20945.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 13:04:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20945.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20945.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20945.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20945.html</trackback:ping><description><![CDATA[GCC 是 GNU 的 C 和 C++ 编译器。实际上，GCC 能够编译三种语言：C、C++ 和 O <br />bject C（C 语言的一种面向对象扩展）。利用 gcc 命令可同时编译并连接 C 和 C++ <br />源程序。 <br />　　如果你有两个或少数几个 C 源文件，也可以方便地利用 GCC 编译、连接并生成可 <br />执行文件。例如，假设你有两个源文件 main.c 和 factorial.c 两个源文件，现在要编 <br />译生成一个计算阶乘的程序。 <br />代码: <br />----------------------- <br />清单 factorial.c <br />----------------------- <br />int factorial (int n) <br />{ <br />　　if (n &lt;= 1) <br />　　　return 1; <br />　　else <br />　　　return factorial (n - 1) * n; <br />} <br />----------------------- <br />清单 main.c <br />----------------------- <br />#include　&lt;stdio.h&gt; <br />#include　&lt;unistd.h&gt; <br />int factorial (int n); <br />int main (int argc, char **argv) <br />{ <br />　　int n; <br />　　if (argc &lt; 2) <br />　　{ <br />　　　　printf ("Usage: %s n\n", argv [0]); <br />　　　　return -1; <br />　　} <br />　　else <br />　　{ <br />　　　n = atoi (argv[1]); <br />　　　printf ("Factorial of %d is %d.\n", n, factorial (n)); <br />　　 } <br />　　return 0; <br />} <br />----------------------- <br />利用如下的命令可编译生成可执行文件，并执行程序： <br />$ gcc -o factorial main.c factorial.c <br />$ ./factorial 5 <br />Factorial of 5 is 120. <br />　　GCC 可同时用来编译 C 程序和 C++ 程序。一般来说，C 编译器通过源文件的后缀 <br />名来判断是 C 程序还是 C++ 程序。在 Linux 中，C 源文件的后缀名为 .c，而 C++ 源 <br />文件的后缀名为 .C 或 .cpp。但是，gcc 命令只能编译 C++ 源文件，而不能自动和 C <br />++ 程序使用的库连接。因此，通常使用 g++ 命令来完成 C++ 程序的编译和连接，该程 <br />序会自动调用 gcc 实现编译。假设我们有一个如下的 C++ 源文件（hello.C）： <br />#include &lt;iostream&gt; <br />void main (void) <br />{ <br />　　cout &lt;&lt; "Hello, world!" &lt;&lt; endl; <br />} <br />则可以如下调用 g++ 命令编译、连接并生成可执行文件： <br />$ g++ -o hello hello.C <br />$ ./hello <br />Hello, world! <br />**********************gcc/egcs 的主要选项********* <br />gcc 命令的常用选项 <br />选项 解释 <br />-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色， <br />例如 asm 或 typeof 关键词。 <br />-c 只编译并生成目标文件。 <br />-DMACRO 以字符串“1”定义 MACRO 宏。 <br />-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。 <br />-E 只运行 C 预编译器。 <br />-g 生成调试信息。GNU 调试器可利用该信息。 <br />-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。 <br />-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。 <br />-lLIBRARY 连接时搜索指定的函数库LIBRARY。 <br />-m486 针对 486 进行代码优化。 <br />-o FILE 生成指定的输出文件。用在生成可执行文件时。 <br />-O0 不进行优化处理。 <br />-O 或 -O1 优化生成代码。 <br />-O2 进一步优化。 <br />-O3 比 -O2 更进一步优化，包括 inline 函数。 <br />-shared 生成共享目标文件。通常用在建立共享库时。 <br />-static 禁止使用共享连接。 <br />-UMACRO 取消对 MACRO 宏的定义。 <br />-w 不生成任何警告信息。 <br />-Wall 生成所有警告信息。<img src ="http://www.cnitblog.com/charester/aggbug/20945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 21:04 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI 学习（四）vi的使用总结（图形）（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20943.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 13:01:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20943.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20943.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20943.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20943.html</trackback:ping><description><![CDATA[
		<p>
				<strong>
						<img onmouseover="if(this.alt) this.style.cursor='pointer';" style="CURSOR: pointer" onclick="if(this.alt) window.open('http://cache45.51.com/photo5/f4/1c/linuwa/f200ce85ff603dc59cdd3908822beb09.gif');" alt="��ͼƬ�ѱ���С�������鿴ԭ��СͼƬ��" src="http://cache45.51.com/photo5/f4/1c/linuwa/f200ce85ff603dc59cdd3908822beb09.gif" width="980" onload="if(this.width&gt;screen.width-300) {this.width=screen.width-300;this.alt='��ͼƬ�ѱ���С�������鿴ԭ��СͼƬ��';}" border="0" />
						<br />
						<br />
						<br />
						<br />
						<br />
						<br />
						<br />
						<img style="-MS-INTERPOLATION-MODE: nearest-neighbor" height="1252" src="http://www.linuxsir.org/bbs/attachment.php?attachmentid=30699&amp;d=1132376940" width="1218" />
				</strong>
		</p>
<img src ="http://www.cnitblog.com/charester/aggbug/20943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 21:01 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI 学习（三）屏幕文本编辑器Vi</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20940.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 12:49:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20940.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20940.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20940.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20940.html</trackback:ping><description><![CDATA[
		<div id="post_message_27083" style="OVERFLOW-X: hidden">屏幕文本编辑器Vi<br /><br />本章介绍Linux上最常用的文本编辑器Vi。文本编辑器是所有计算机系统中最常使用的一种工具。用户在使用计算机的时候，往往需要建立自己的文件，无论是一般的文本文件、数据文件，还是编写的源程序文件，这些工作都离不开编辑器。<br /><br />Linux系统提供了一个完整的编辑器家族系列，如Ed、Ex、Vi和Emacs等，按功能它们可以分为两大类：行编辑器（Ed、Ex）和全屏幕编辑器（Vi、Emacs）。行编辑器每次只能对一行进行操作，使用起来很不方便。而全屏幕编辑器可以对整个屏幕进行编辑，用户编辑的文件直接显示在屏幕上，修改的结果可以立即看出来，克服了行编辑的那种不直观的操作方式，便于用户学习和使用，具有强大的功能。<br /><br />Vi是Linux系统的第一个全屏幕交互式编辑程序，它从诞生至今一直得到广大用户的青睐，历经数十年仍然是人们主要使用的文本编辑工具，足见其生命力之强，而强大的生命力是其强大的功能带来的。<br /><br />本章中，我们将循序渐进地介绍如何使用Vi来建立、编辑、显示以及处理文件。（注：文中的大写字母为［shift］键+相应的小写字母的组合）<br /><br />　Vi简介<br /><br />Vi是“Visual interface”的简称，它在Linux上的地位就仿佛Edit程序在DOS上一样。它可以执行输出、删除、查找、替换、块操作等众多文本操作，而且用户可以根据自己的需要对其进行定制，这是其他编辑程序所没有的。<br /><br />Vi不是一个排版程序，它不象Word或WPS那样可以对字体、格式、段落等其他属性进行编排，它只是一个文本编辑程序。<br /><br />Vi没有菜单，只有命令，且命令繁多。Vi有三种基本工作模式：命令行模式、文本输入模式和末行模式。<br /><br />命令行模式<br /><br />任何时候，不管用户处于何种模式，只要按一下键，即可使Vi进入命令行模式；我们在shell环境（提示符为$）下输入启动Vi命令，进入编辑器时，也是处于该模式下。<br /><br />在该模式下，用户可以输入各种合法的Vi命令，用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释，若输入的字符是合法的Vi命令，则Vi在接受用户命令之后完成相应的动作。但需注意的是，所输入的命令并不在屏幕上显示出来。若输入的字符不是Vi的合法命令，Vi会响铃报警。<br /><br />文本输入模式<br /><br />在命令模式下输入插入命令i、附加命令a 、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。在该模式下，用户输入的任何字符都被Vi当做文件内容保存起来，并将其显示在屏幕上。在文本输入过程中，若想回到命令模式下，按键即可。<br /><br />末行模式<br /><br />末行模式也称ex转义模式。<br /><br />Vi和Ex编辑器的功能是相同的，二者主要区别是用户界面。在Vi中，命令通常是单个键，例如i、a、o等；而在Ex中，命令是以按回车键结束的正文行。Vi有一个专门的“转义”命令，可访问很多面向行的Ex命令。在命令模式下，用户按“:”键即可进入末行模式下，此时Vi会在显示窗口的最后一行（通常也是屏幕的最后一行）显示一个“:”作为末行模式的提示符，等待用户输入命令。多数文件管理命令都是在此模式下执行的（如把编辑缓冲区的内容写到文件中等）。末行命令执行完后，Vi自动回到命令模式。例如：<br /><br />:1，$s / A / a / g<br /><br />则从文件第一行至文件尾将大写A全部替换成小写a。<br /><br />若在末行模式下输入命令过程中改变了主意，可按键，或用退格键将输入的命令全部删除之后，再按一下退格键，即可使Vi回到命令模式下。<br /><br />Vi编辑器的三种工作模式之间的转换如图11-1所示。<br /><br /><br />　<br /><br />如果要从命令模式转换到编辑模式，可以键入命令a或者i；如果需要从文本模式返回，则按Esc键即可。在命令模式下输入“:”即可切换到末行模式，然后输入命令。<br /><br />第二十五课 Vi的进入与退出　　　　　　2000年/6月/13日<br /><br /><br />Vi 的进入<br /><br />用户登录到系统中之后，系统给出提示符“$”。在提示符后键入Vi和想要编辑（或建立）的文件名，便可进入Vi。<br /><br />［例1］ 键入命令：<br /><br />$ vi example.c<br /><br />屏幕显示如下：<br /><br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［New File］<br /><br />如果只键入Vi，而不带文件名，也可以进入Vi。之后在光标处键入文件内容，退出Vi时，只需在退出命令后输入文件名即可。<br /><br />进入Vi之后，首先进入的就是命令模式，也就是说等待命令输入而不是文本输入。这时输入的字母都将作为命令来解释。光标停在屏幕第一行首位上（用表示），其余各行行首均有一个“~”符号，表示该行为空行。最后一行也称状态行，显示出当前正在编辑的文件名以及其状态。如本例是［New File］，表示example.c是一个新建的文件。如果example.c文件已在系统中存在，那么输入上述命令后，则在屏幕上显示出该文件的内容，并且光标停在第一行的首位，在状态行显示出该文件的文件名、行数和字符数。<br /><br />［例2］ 键入命令：<br /><br />$ vi example.c<br /><br />然后键入：<br /><br />#include<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［ New File］<br /><br />注意，在这里我们为了节省篇幅起见，屏幕只显示15行。事实上，初始的显示行数与用户所用终端有关，一般的CRT终端可显示25行。在窗口系统中，显示行数与运行Vi的那个窗口有关。然而我们可以对显示行数进行设置。例如，在能显示25行的CRT终端上，让Vi只显示15行。设置的方法将在本节后面介绍。<br /><br />当用Vi建立一个新文件时，在进入Vi的命令中也可以不给出文件名，当编辑完文件需要保存数据时，再由用户指定文件名。<br /><br />进入Vi时，用户不仅可以指定一个待编辑的文件名，而且还有许多附加操作。<br /><br /><br />如果希望在进入Vi之后，光标处于文件中特定的某行上，可在Vi后加上任选项+n，其中n为指定的行数。<br /><br />［例3］ 键入命令：<br /><br />$ vi +5 example1.c<br /><br />后，屏幕显示如下：<br /><br />#include<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” 12 lines, 125 characters<br /><br />光标将位于文件example1.c中的第5行上。<br /><br />如果希望在进入Vi之后光标处于文件最末行，则只需把命令中附加项“+”后面的数字n省略掉即可。<br /><br /><br />在进入Vi时，除了可以指定一个光标起始行号之外，还可以在命令中指定一个模式串，此时在进入Vi后，光标就处于文件中第一个与指定模式串相匹配的那行上。<br /><br />［例4］ 键入命令：<br /><br />$ vi +/int example1.c<br /><br />屏幕显示如下：<br /><br />#include<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” 12 lines, 125 characters<br /><br />光标将位于文件example1.c中的第3行上。<br /><br /><br />使用Vi可以同时编辑多个文件，只要在进入Vi的命令中写入所要操作的文件即可，还可以使用通配符。<br /><br />［例5］ 键入命令：<br /><br />$ vi *.cat<br /><br />就可以编辑所有后缀为cat的文件了。当然，您还可以使用shell中内置的模式匹配来装载文件，这样会更富技巧性。一旦您在命令行中包含了所有的待编辑文件名，就可以在Vi中方便地移来移去。<br /><br />退出Vi<br /><br />当编辑完文件，准备退出Vi返回到shell时，可以使用以下几种方法之一。<br /><br /><br />在命令模式中，连按两次大写字母Z，若当前编辑的文件曾被修改过，则Vi保存该文件后退出，返回到shell；若当前编辑的文件没被修改过，则Vi直接退出, 返回到shell。<br /><br /><br />在末行模式下，输入命令<br /><br />:w<br /><br />Vi保存当前编辑文件，但并不退出，而是继续等待用户输入命令。在使用w命令时，可以再给编辑文件起一个新的文件名。<br /><br /><br />［例6］<br /><br />:w newfile<br /><br />此时Vi将把当前文件的内容保存到指定的newfile中，而原有文件保持不变。若newfile是一个已存在的文件，则Vi在显示窗口的状态行给出提示信息：<br /><br />File exists （use ! to override）<br /><br />此时，若用户真的希望用文件的当前内容替换newfile中原有内容，可使用命令<br /><br />:w! newfile<br /><br />否则可选择另外的文件名来保存当前文件。<br /><br /><br />在末行模式下，输入命令<br /><br />:q<br /><br />系统退出Vi返回到shell。若在用此命令退出Vi时，编辑文件没有被保存，则Vi在显示窗口的最末行显示如下信息：<br /><br />No write since last change （use ! to overrides）<br /><br />提示用户该文件被修改后没有保存，然后Vi并不退出，继续等待用户命令。若用户就是不想保存被修改后的文件而要强行退出Vi时，可使用命令<br /><br />:q!<br /><br />Vi放弃所作修改而直接退到shell下。<br /><br /><br />在末行模式下，输入命令<br /><br />:wq<br /><br />Vi将先保存文件，然后退出Vi返回到shell。<br /><br /><br />在末行模式下，输入命令<br /><br />:x<br /><br />该命令的功能同命令模式下的ZZ命令功能相同。</div>
		<!-- / message -->
		<!-- sig -->
		<br />
		<br />
		<div id="post_message_27084" style="OVERFLOW-X: hidden">Vi中的行号<br /><br />Vi中的许多命令都要用到行号及行数等数值。若编辑的文件较大时，自己去数是非常不方便的。为此Vi提供了给文本加行号的功能。这些行号显示在屏幕的左边，而相应行的内容则显示在行号之后。<br /><br />使用的命令为：在末行方式下输入命令：<br /><br />:set number<br /><br />需要说明的是，这里加的行号只是显示给用户看的，它们并不是文件内容的一部分。<br /><br />在一个较大的文件中，用户可能需要了解光标当前行是哪一行，在文件中处于什么位置，可在命令模式下用组合键&lt;Ctrl+g&gt;，此时Vi会在显示窗口的最后一行显示出相应信息。该命令可以在任何时候使用。<br /><br />［例7］<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［Modified］ lines 4 of 10 --40%-- col 11<br /><br />在末行方式下，我们可以输入命令nu（单词number的缩写）来获得光标当前行的行号与该行内容。<br /><br />光标移动操作<br /><br />全屏幕文本编辑器中，光标的移动操作无疑是最经常使用的操作了。用户只有熟练地使用移动光标的这些命令，才能迅速准确地到达所期望的位置处进行编辑。<br /><br />Vi中的光标移动既可以在命令模式下，也可以在文本输入模式下，但操作的方法不尽相同。<br /><br />在文本输入模式下，可直接使用键盘上的四个方向键移动光标。<br /><br />在命令模式下，有很多移动光标的方法。不但可以使用四个方向键来移动光标，还可以用h、j、k、l这四个键代替四个方向键来移动光标，这样可以避免由于不同机器上的不同键盘定义所带来的矛盾，而且使用熟练后可以手不离开字母键盘位置就能完成所有操作，从而提高工作效率。另外还可以用&lt;Spacebar&gt;、&lt;Backspace&gt;、&lt;Ctrl+n&gt;和&lt;ctrl+p&gt;四个键或组合键移动光标。且以上这三种键在实现功能上是等价的。除此之外，还有一些移动光标的命令。下面对它们的工作方式介绍如下：<br /><br />&lt;Spacebar&gt;、® （均称为右向键）<br /><br />右向键的作用是将光标向右移动一个位置。若在向右键前先输入一个数字n，那么光标就向右移动n个位置。例如5l表示光标向右移动5个位置。需要注意的是，光标移动不能超过当前行的末尾。若给定的n超过光标当前位置至行尾的字符个数，如果用右向键，光标只能移到行尾；如果用&lt;Spacebar&gt;，光标移到下面一行或几行的适当位置。<br /><br />h、&lt;Backspace&gt;、¬ （向左键）<br /><br />执行一次向左键，光标向左移动一个位置。同向右键一样，也可以在向左键的前面输入一个数字n，那么光标就向左移动n个位置。需要注意的是，如果用左向键，光标左移不能超出该行的开头；如果用&lt;Backspace&gt;，光标移到上面一行或几行的适当位置。<br /><br />j、&lt;Ctrl+n&gt;、¯ （向下键）<br /><br />执行一次向下键光标向下移动一个位置（即一行），但光标所在的列不变。当这些命令前面加上数字n，则光标下移n行。<br /><br />Vi除了可以用向下键将光标下移外，还可以用&lt;Enter&gt;键和“+”键将光标下移一行或n行（不包括本行在内），但此时光标下移之后将位于该行的第一个字符处。例如：<br /><br />3j 光标下移3行，且光标所在列的位置不变。<br /><br />3+或3&lt;Enter&gt; 光标下移3行，且光标位于该行的行首。<br /><br />k、&lt;Ctrl+p&gt;、­ （向上键）<br /><br />执行一次向上键光标向上移动一个位置（即一行），但光标所在的列不变。同样在这些命令前面加上数字n，则光标上移n行。<br /><br />若希望光标上移之后，光标位于该行的行首，则可以使用命令“- ”。<br /><br />L （移至行首）<br /><br />L 命令是将光标移到当前行的开头，即将光标移至当前行的第一个非空白处（非制表符或非空格符）。<br /><br />$（移至行尾）<br /><br />该命令将光标移到当前行的行尾，停在最后一个字符上。若在$命令之前加上一个数字n，则光标下移n-1行并到达行尾。<br /><br />［行号］ G（移至指定行）<br /><br />该命令将光标移至指定行号所指定的行的行首。这种移动称为绝对定位移动。<br /><br />［例8］<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” 12 lines, 125 characters<br /><br />键入命令:6G后，屏幕显示如下：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” 12 lines, 125 characters<br /><br />光标移到了第6行的行首。<br /><br />若省略行号，则光标移至该文件的最后一行的行首，即无论该文件有多少屏，都跳至最后一行。<br /><br />第二十七课 vi命令　　　2000年/6月/26日<br /><br />　<br /><br />在屏幕上移动<br /><br />Vi提供了三个关于光标在全屏幕上移动并且文件本身不发生滚动的命令。它们分别是H、M和L命令。<br /><br />1. H命令<br /><br />该命令将光标移至屏幕首行的行首（即左上角），也就是当前屏幕的第一行，而不是整个文件的第一行。利用此命令可以快速将光标移至屏幕顶部。若在H命令之前加上数字n，则将光标移至第n行的行首。<br /><br />［例9］ 屏幕显示如下内容：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）; }<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x=%d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［ New File］<br /><br />在命令模式下输入4H命令后，光标移到以for开头的这一行的字母f上。<br /><br />值得一提的是，使用命令dH将会删除从光标当前所在行至所显示屏幕首行的全部内容。<br />2. M命令<br /><br />该命令将光标移至屏幕显示文件的中间行的行首。即如果当前屏幕已经充满,则移动到整个屏幕的中间行；如果并未充满，则移动到文本的那些行的中间行。利用此命令可以快速地将光标从屏幕的任意位置移至屏幕显示文件的中间行的行首。例如，在上面屏幕显示的情况下（不论光标在屏幕的何处），在命令模式下，输入命令M之后，光标都将移到add这一行的字母a上。<br /><br />同样值得一提的是，使用命令dM将会删除从光标当前所在行至屏幕显示文件的中间行的全部内容。<br />3. L命令<br /><br />当文件显示内容超过一屏时，该命令将光标移至屏幕上的最底行的行首；当文件显示内容不足一屏时，该命令将光标移至文件的最后一行的行首。可见，利用此命令可以快速准确地将光标移至屏幕底部或文件的最后一行。若在L命令之前加上数字n，则将光标移至从屏幕底部算起第n行的行首。例如，在上面屏幕显示的情况下（不论光标在屏幕的何处），在命令模式下，输入命令3L之后，光标都将移到x++这一行的字母x上。<br /><br />同样值得一提的是，使用命令dL将会删除从光标当前行至屏幕底行的全部内容。<br /><br />按字移动光标<br /><br />首先介绍一下Vi中“字”的概念。在Vi中“字”有两种含义。一种是广义的字，它可以是两个空格之间的任何内容。<br /><br />［例10］ 在文件example.c 中的第4行：<br /><br />{int k；<br /><br />它只有2个字，一个是{int ，另一个是k;<br /><br />Vi中另一种字是狭义上的字，在此种意义之下，英文单词、标点符号和非字母字符（如!、@、#、$、%、^、&amp;、*、（、）、-、+、{、}、［、］、~、|、\、&lt;、&gt;、/等）均被当成是一个字。因此，上面那一行中就包括{、int、k、；这4个字。<br /><br />Vi中使用大写命令一般就是指将字作为广义来对待，使用小写命令就是作为狭义对待。<br /><br />搞清楚Vi中字的含义后，我们就可以介绍按字移动光标的命令了。<br /><br />Vi 一共提供了三组关于按字移动光标的命令，分别是：<br /><br />1. w和W命令<br /><br />将光标右移至下一个字的字首；<br /><br />［例11］ 屏幕上显示如下：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />现在使用w命令，把光标移到下一个字（狭义）的字首“（”上：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />下面使用W命令，将把光标移到下一个字（广义）的字首“M”上：<br /><br />printf（“Hello Mr.Huang!\n”）;<br />2. e和E命令<br /><br />如果光标起始位置处于字内（即非字尾处），则该命令将把光标移到本字字尾；如果光标起始位置处于字尾，则该命令将把光标移动到下一个字的字尾。<br />3. b和B<br /><br />如果光标处于所在字内（即非字首），则该命令将把光标移至本字字首；如果光标处于所在字字首，则该命令将把光标移到上一个字的字首。<br /><br />［例12］ 屏幕显示如下：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />现在使用b命令，由于光标处于该字中间，所以光标移动到本字字首“H”处：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />如果使用B命令，则如下所示：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />按句移动光标<br /><br />在Vi中，一个句子被定义为是以逗号（,）、句号（.）、问号（?）和感叹号（!）结尾，且其后面跟着至少两个以上（含两个）空格或一个换行符的字符序列。<br /><br />Vi提供了关于按句移动光标的两个命令，分别为：<br /><br />1. （ 命令<br /><br />将光标移至上一个句子的开头。<br /><br />2. ） 命令<br /><br />该命令将光标移至下一个句子的开头。<br /><br />按段移动光标<br /><br />在Vi中，一个段被定义为是以一个空白行开始和结束的片段。Vi提供了关于按段移动光标的两个命令，分别为：<br /><br />1. { 命令<br /><br />该命令将光标向前移至上一个段的开头；<br /><br />2. } 命令<br /><br />该命令将光标向后移至下一个段的开头。<br /><br />屏幕滚动<br /><br />屏幕命令是以屏幕为单位移动光标的，常用于文件的滚屏和分页。需要注意的是，屏幕命令不是光标移动命令，不能作为文本限定符用于删除命令中。<br /><br />在命令模式下和文本输入模式下均可以使用屏幕滚动命令。<br /><br />　<br /><br />1. 滚屏命令<br /><br />关于滚屏命令有两个：<br /><br />· &lt; Ctrl+u &gt; 将屏幕向前（文件头方向）翻滚半屏；<br /><br />· &lt; Ctrl+d &gt; 将屏幕向后（文件尾方向）翻滚半屏。<br /><br />可以在这两个命令之前加上一个数字n，则屏幕向前或向后翻滚n行。并且这个值被系统记住，以后再用&lt; Ctrl+u &gt;和&lt; Ctrl+d &gt;命令滚屏时，还滚相应的行数。<br /><br />2. 分页命令<br /><br />关于分页命令也有两个：<br /><br />· &lt; Ctrl+f &gt; 将屏幕向文件尾方向翻滚一整屏（即一页）；<br /><br />· &lt; Ctrl+b &gt; 将屏幕向文件首方向翻滚一整屏（即一页）。<br /><br />同样也可以在这两个命令之前加上一个数字n，则屏幕向前或向后移动n页。<br /><br />3. 状态命令&lt; Ctrl+G &gt;<br /><br />命令显示在vi状态行上的vi状态信息，包括正在编辑的文件名、是否修改过、当前行号、文件的行数以及光标之前的行占整个文件的百分比。<br /><br />4. 屏幕调零命令<br /><br />Vi 提供了三个有关屏幕调零的命令。它们的格式分别为：<br /><br />· ［行号］ z ［行数］ &lt;回车&gt;<br /><br />· ［行号］ z ［行数］ .<br /><br />· ［行号］ z ［行数］ _<br /><br />若省略了行号和行数，这三个命令分别为将光标所在的当前行作为屏幕的首行、中间行和最末行重新显示；若给出行号，那么该行号所对应的行就作为当前行显示在屏幕的首行、中间行和最末行；若给出行数，则它规定了在屏幕上显示的行数。<br /><br />［例13］<br /><br />8z16&lt;回车&gt; ：将文件中的第8行作为屏幕显示的首行，并一共显示16行。<br /><br />15z . ：将文件中的第15行作为屏幕显示的中间行，显示行数为整屏。<br /><br />15z 5_ ：将文件中的第15行作为屏幕显示的最末行，显示行数为5行。<br /><br />文本插入操作<br /><br />在命令模式下用户输入的任何字符都被Vi当作命令加以解释执行，如果用户要将输入的字符当作是文本内容时，则首先应将Vi的工作模式从命令模式切换到文本输入模式。切换的方式是使用下面的命令。<br /><br />　<br /><br />插入（Insert）命令<br /><br />Vi提供了两个插入命令：i和 I。<br /><br />　<br /><br />　<br /><br />1. i命令<br /><br />插入文本从光标所在位置前开始,并且插入过程中可以使用&lt;Backspace&gt;键删除错误的输入。此时Vi处于插入状态，屏幕最下行显示“--INSERT--”（插入）字样。<br /><br />［例14］ 有一正在编辑的文件，如下所示：<br /><br />Welcome to vi world!Come on!<br /><br />~<br /><br />~<br /><br />光标位于第一个“!”上，需在其前面插入：<br /><br />This is an example!<br /><br />使用i命令，并输入相应文本后，屏幕显示如下：<br /><br />Welcome to vi world This is an example!!Come on!<br /><br />~<br /><br />~<br /><br />由此例可以看到，光标本来是在第一个“!”处，但是由于是从光标所在位置前开始插入，所以这个“!”就被挤到了新插入的文本之后。<br />2. I命令<br /><br />该命令是将光标移到当前行的行首，然后在其前插入文本。</div>
		<!-- / message -->
		<!-- sig -->
		<br />
		<br />
		<br />
		<br />
		<br />
		<div id="post_message_27085" style="OVERFLOW-X: hidden">vi命令<br /><br />在屏幕上移动<br /><br />Vi提供了三个关于光标在全屏幕上移动并且文件本身不发生滚动的命令。它们分别是H、M和L命令。<br /><br />1. H命令<br /><br />该命令将光标移至屏幕首行的行首（即左上角），也就是当前屏幕的第一行，而不是整个文件的第一行。利用此命令可以快速将光标移至屏幕顶部。若在H命令之前加上数字n，则将光标移至第n行的行首。<br /><br />［例9］ 屏幕显示如下内容：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）; }<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x=%d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［ New File］<br /><br />在命令模式下输入4H命令后，光标移到以for开头的这一行的字母f上。<br /><br />值得一提的是，使用命令dH将会删除从光标当前所在行至所显示屏幕首行的全部内容。<br />2. M命令<br /><br />该命令将光标移至屏幕显示文件的中间行的行首。即如果当前屏幕已经充满,则移动到整个屏幕的中间行；如果并未充满，则移动到文本的那些行的中间行。利用此命令可以快速地将光标从屏幕的任意位置移至屏幕显示文件的中间行的行首。例如，在上面屏幕显示的情况下（不论光标在屏幕的何处），在命令模式下，输入命令M之后，光标都将移到add这一行的字母a上。<br /><br />同样值得一提的是，使用命令dM将会删除从光标当前所在行至屏幕显示文件的中间行的全部内容。<br />3. L命令<br /><br />当文件显示内容超过一屏时，该命令将光标移至屏幕上的最底行的行首；当文件显示内容不足一屏时，该命令将光标移至文件的最后一行的行首。可见，利用此命令可以快速准确地将光标移至屏幕底部或文件的最后一行。若在L命令之前加上数字n，则将光标移至从屏幕底部算起第n行的行首。例如，在上面屏幕显示的情况下（不论光标在屏幕的何处），在命令模式下，输入命令3L之后，光标都将移到x++这一行的字母x上。<br /><br />同样值得一提的是，使用命令dL将会删除从光标当前行至屏幕底行的全部内容。<br /><br />按字移动光标<br /><br />首先介绍一下Vi中“字”的概念。在Vi中“字”有两种含义。一种是广义的字，它可以是两个空格之间的任何内容。<br /><br />［例10］ 在文件example.c 中的第4行：<br /><br />{int k；<br /><br />它只有2个字，一个是{int ，另一个是k;<br /><br />Vi中另一种字是狭义上的字，在此种意义之下，英文单词、标点符号和非字母字符（如!、@、#、$、%、^、&amp;、*、（、）、-、+、{、}、［、］、~、|、\、&lt;、&gt;、/等）均被当成是一个字。因此，上面那一行中就包括{、int、k、；这4个字。<br /><br />Vi中使用大写命令一般就是指将字作为广义来对待，使用小写命令就是作为狭义对待。<br /><br />搞清楚Vi中字的含义后，我们就可以介绍按字移动光标的命令了。<br /><br />Vi 一共提供了三组关于按字移动光标的命令，分别是：<br /><br />1. w和W命令<br /><br />将光标右移至下一个字的字首；<br /><br />［例11］ 屏幕上显示如下：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />现在使用w命令，把光标移到下一个字（狭义）的字首“（”上：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />下面使用W命令，将把光标移到下一个字（广义）的字首“M”上：<br /><br />printf（“Hello Mr.Huang!\n”）;<br />2. e和E命令<br /><br />如果光标起始位置处于字内（即非字尾处），则该命令将把光标移到本字字尾；如果光标起始位置处于字尾，则该命令将把光标移动到下一个字的字尾。<br />3. b和B<br /><br />如果光标处于所在字内（即非字首），则该命令将把光标移至本字字首；如果光标处于所在字字首，则该命令将把光标移到上一个字的字首。<br /><br />［例12］ 屏幕显示如下：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />现在使用b命令，由于光标处于该字中间，所以光标移动到本字字首“H”处：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />如果使用B命令，则如下所示：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />按句移动光标<br /><br />在Vi中，一个句子被定义为是以逗号（,）、句号（.）、问号（?）和感叹号（!）结尾，且其后面跟着至少两个以上（含两个）空格或一个换行符的字符序列。<br /><br />Vi提供了关于按句移动光标的两个命令，分别为：<br /><br />1. （ 命令<br /><br />将光标移至上一个句子的开头。<br /><br />2. ） 命令<br /><br />该命令将光标移至下一个句子的开头。<br /><br />按段移动光标<br /><br />在Vi中，一个段被定义为是以一个空白行开始和结束的片段。Vi提供了关于按段移动光标的两个命令，分别为：<br /><br />1. { 命令<br /><br />该命令将光标向前移至上一个段的开头；<br /><br />2. } 命令<br /><br />该命令将光标向后移至下一个段的开头。<br /><br />屏幕滚动<br /><br />屏幕命令是以屏幕为单位移动光标的，常用于文件的滚屏和分页。需要注意的是，屏幕命令不是光标移动命令，不能作为文本限定符用于删除命令中。<br /><br />在命令模式下和文本输入模式下均可以使用屏幕滚动命令。<br /><br />　<br /><br />1. 滚屏命令<br /><br />关于滚屏命令有两个：<br /><br />· &lt; Ctrl+u &gt; 将屏幕向前（文件头方向）翻滚半屏；<br /><br />· &lt; Ctrl+d &gt; 将屏幕向后（文件尾方向）翻滚半屏。<br /><br />可以在这两个命令之前加上一个数字n，则屏幕向前或向后翻滚n行。并且这个值被系统记住，以后再用&lt; Ctrl+u &gt;和&lt; Ctrl+d &gt;命令滚屏时，还滚相应的行数。<br /><br />2. 分页命令<br /><br />关于分页命令也有两个：<br /><br />· &lt; Ctrl+f &gt; 将屏幕向文件尾方向翻滚一整屏（即一页）；<br /><br />· &lt; Ctrl+b &gt; 将屏幕向文件首方向翻滚一整屏（即一页）。<br /><br />同样也可以在这两个命令之前加上一个数字n，则屏幕向前或向后移动n页。<br /><br />3. 状态命令&lt; Ctrl+G &gt;<br /><br />命令显示在vi状态行上的vi状态信息，包括正在编辑的文件名、是否修改过、当前行号、文件的行数以及光标之前的行占整个文件的百分比。<br /><br />4. 屏幕调零命令<br /><br />Vi 提供了三个有关屏幕调零的命令。它们的格式分别为：<br /><br />· ［行号］ z ［行数］ &lt;回车&gt;<br /><br />· ［行号］ z ［行数］ .<br /><br />· ［行号］ z ［行数］ _<br /><br />若省略了行号和行数，这三个命令分别为将光标所在的当前行作为屏幕的首行、中间行和最末行重新显示；若给出行号，那么该行号所对应的行就作为当前行显示在屏幕的首行、中间行和最末行；若给出行数，则它规定了在屏幕上显示的行数。<br /><br />［例13］<br /><br />8z16&lt;回车&gt; ：将文件中的第8行作为屏幕显示的首行，并一共显示16行。<br /><br />15z . ：将文件中的第15行作为屏幕显示的中间行，显示行数为整屏。<br /><br />15z 5_ ：将文件中的第15行作为屏幕显示的最末行，显示行数为5行。<br /><br />文本插入操作<br /><br />在命令模式下用户输入的任何字符都被Vi当作命令加以解释执行，如果用户要将输入的字符当作是文本内容时，则首先应将Vi的工作模式从命令模式切换到文本输入模式。切换的方式是使用下面的命令。<br /><br />　<br /><br />插入（Insert）命令<br /><br />Vi提供了两个插入命令：i和 I。<br /><br />　<br /><br />　<br /><br />1. i命令<br /><br />插入文本从光标所在位置前开始,并且插入过程中可以使用&lt;Backspace&gt;键删除错误的输入。此时Vi处于插入状态，屏幕最下行显示“--INSERT--”（插入）字样。<br /><br />［例14］ 有一正在编辑的文件，如下所示：<br /><br />Welcome to vi world!Come on!<br /><br />~<br /><br />~<br /><br />光标位于第一个“!”上，需在其前面插入：<br /><br />This is an example!<br /><br />使用i命令，并输入相应文本后，屏幕显示如下：<br /><br />Welcome to vi world This is an example!!Come on!<br /><br />~<br /><br />~<br /><br />由此例可以看到，光标本来是在第一个“!”处，但是由于是从光标所在位置前开始插入，所以这个“!”就被挤到了新插入的文本之后。<br />2. I命令<br /><br />该命令是将光标移到当前行的行首，然后在其前插入文本。<br /><br /><br /><br />}<br /><br />第二十九课 vi命令　　　2000年/7月/10日<br /><br />　<br /><br />　<br /><br />附加（append）命令<br /><br />Vi提供了两个附加插入命令：a和A。<br /><br />1. a命令<br /><br />该命令用于在光标当前所在位置之后追加新文本。新输入的文本放在光标之后，在光标后的原文本将相应地向后移动。光标可在一行的任何位置。<br /><br />［例15］ 以例14原始情况为例，使用a命令，并输入相应文本，屏幕显示如下：<br /><br />Welcome to vi world!This is an example!Come on!<br /><br />~<br /><br />~<br /><br />本例中光标后的文本“Come on!”被新输入的文本挤到了后面。<br />2. A命令<br /><br />该命令与a命令不同的是，A命令将把光标挪到所在行的行尾，从那里开始插入新文本。当输入A命令后，光标自动移到该行的行尾。<br /><br />a和A命令是把文本插入到行尾的唯一方法。<br /><br />　<br /><br />打开（open）命令<br /><br />不论是Insert命令也好，还是append命令也好，所插入的内容都是从当前行中的某个位置开始的。若我们希望在某行之前或某行之后插入一些新行，则应使用open命令。<br /><br />Vi提供了两个打开命令：o和O。<br /><br />1. o命令<br /><br />该命令将在光标所在行的下面新开一行，并将光标置于该行的行首，等待输入文本。要注意，当使用&lt;Backspace&gt;删除字符时只能删除从插入模式开始的位置以后的字符，对于以前的字符不起作用。而且还可以在文本输入方式下输入一些控制字符，例如，Ctrl+l即是插入分页符，显示为^L。<br /><br />［例16］ 以例14的原始情况为例，只是这次要在当前行下面一行输入文本。使用o命令，并输入相应文本，屏幕显示如下：<br /><br />Welcome to vi world!Come on!<br /><br />This is an example!<br /><br />~<br /><br />~<br /><br />新输入的文本出现在原来文本所在行的下一行。<br />2. O命令<br /><br />和o命令相反，O命令是在光标所在行的上面插入一行，并将光标置于该行的行首，等待输入文本。<br /><br />［例17］ 与例14的原始情况相同，要在当前行的上面一行输入文本。使用O命令并输入文本后，屏幕显示如下：<br /><br />This is an example!<br /><br />Welcome to vi world!Come on!<br /><br />~<br /><br />~<br /><br />文本插入到了当前行之上。<br /><br />11.3.4　文本修改<br /><br />在命令模式下可以使用Vi提供的各种有关命令对文本进行修改，包括对文本内容的删除、复制、取代和替换等。<br /><br />　<br /><br />　<br /><br />文本删除<br /><br />在编辑文本时，经常需要删除一些不需要的文本，我们可以用&lt;Backspace&gt;键将输错或不需要的文本删除，但此时有一个限制就是当删到行头之后，再想删上面那行的内容是不可能的。<br /><br />在命令模式下，Vi提供了许多删除命令。这些命令大多是以d开头的。常用的有：<br /><br />1. 删除单个字符<br /><br />x： 删除光标处的字符。若在x之前加上一个数字n，则删除从光标所在位置开始向右的n个字符。<br /><br />X：删除光标前面的那个字符。若在X之前加上一个数字n，则删除从光标前面那个字符开始向左的n个字符。<br /><br />显然这两个命令是删除少量字符的快捷方法。<br /><br />2. 删除多个字符<br /><br />dd：删除光标所在的整行。在dd前可加上一个数字n，表示删除当前行及其后n-1行的内容。<br /><br />D或d$：两命令功能一样，都是删除从光标所在处开始到行尾的内容。<br /><br />d0：删除从光标前一个字符开始到行首的内容。<br /><br />dw：删除一个单词。若光标处在某个词的中间，则从光标所在位置开始删至词尾。同dd命令一样，可在dw之前加一个数字n，表示删除n个指定的单词。<br /><br />如果用户不小心进行了误删除操作，也不要紧，Vi提供了恢复误操作的命令，并且可以将恢复的内容移动，放在文本的任何地方。恢复命令用² np，其中n为寄存器号。这是因为Vi内部有9个用于维护删除操作的寄存器，分别用数字1，2，¼ ，9表示，它们分别保存以往用dd命令删除的内容。这些寄存器组成一个队列，例如最近一次使用dd命令删除的内容被放到寄存器1中；当下次再使用dd命令删除文本内容时，Vi将把寄存器1的内容转存到寄存器2中，而寄存器1中又将是最近一次dd命令删除的内容。以此类推，Vi可以保存有最近九次用dd命令删除的内容，而前面的用dd命令删除的内容则被抛弃。<br /><br />［例18］ 假设当前编辑文件为xu.c<br /><br />/* this is a example */<br /><br />#include &lt;stdio.h&gt;<br /><br />void main（ ）<br /><br />{<br /><br />int i , j ;<br /><br />printf（ “ please input a number : / n ” ）;<br /><br />scanf （ “ % d ” , &amp;i ） ;<br /><br />j = i + 100 ;<br /><br />printf （ “ /n j = % d /n ” , j ） ;<br /><br />return ;<br /><br />}<br /><br />我们对其进行如下操作：<br /><br />1. 将光标移至文件第一行，按dd命令，此时文件第一行的内容被删除，且被删除的内容保存在寄存器1中；<br />2. 按5j使光标下移至第一个printf语句行；<br />3. 按dd命令将该行删除，此时寄存器1中将保存刚刚被删除的内容：<br /><br />printf （“ please input a number :\ n ” ）;<br /><br />而寄存器1原有的内容：<br /><br />/* this is a example */<br /><br />则被保存到寄存器2中；<br /><br />在最末行模式下，也可以对文件内容进行删除，但它只能删除整行，一次可将某个指定范围内（起始行号，终止行号）的所有行全部删除。需要注意的是，用此种方法进行删除时，Vi并不把所删内容放入寄存器中，因而当发生误删除操作时，不能用² np命令恢复，只能用u命令进行有限的恢复。<br /><br />最后提一下，如何在文本输入方式时将所输入文本删除。用户使用&lt;Ctrl+u&gt;组合键即可，此时光标将返回插入开始的位置，并且Vi仍处于文本输入方式。<br /><br />　<br /><br />取消上一命令（Undo）<br /><br />取消上一命令（Undo），也称复原命令，是非常有用的命令，它可以取消前一次的误操作或不合适的操作对文件造成的影响，使之回复到这种误操作或不合适操作被执行之前的状态。<br /><br />取消上一命令有两种形式，在命令模式下键入字符u和U。它们的功能都是取消刚才输入的命令，恢复到原来的情况。小写u和大写U在具体细节上有所不同，二者的区别在于，大写U命令的功能是恢复到误操作命令前的情况，即如果插入命令后使用U命令，就删除刚刚插入的内容；如果删除命令后使用U命令，就相当于在光标处又插入刚刚删除的内容。这里把所有修改文本的命令都视为插入命令。也就是说，U命令只能取消前一步操作，如果用U命令撤消了前一步操作，当再按U键时，并不是撤消再前一步的操作，而是撤消了刚才U命令执行的操作，也就是又恢复到第一次使用U命令之前的状态，结果是什么都没做。而小写u命令的功能是把当前行恢复成被编辑前的状态，而不管此行被编辑了多少次。<br /><br />　<br /><br />［例19］ 原来屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />}<br /><br />在命令模式下输入命令o，插入一新行，输入需要插入的内容后再按&lt;Esc&gt;回到命令模式，屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />printf （ “ How do you do ! ” ） ;<br /><br />}<br /><br />若想取消这一插入操作，请按命令U后，屏幕恢复到原来显示的情况。<br /><br />注意：对于取消命令仍可以再使用取消命令。这时会产生一种“负负得正”的效果，文件状态将恢复到第一次执行取消命令之前的状态，如同没做任何操作一般。例如在上例中，再使用一次命令U，屏幕将显示的内容仍为插入后的内容。<br /><br />　<br /><br />重复命令（Redo）<br /><br />重复命令也是一个非常常用的命令。在文本编辑中经常会碰到需要机械地重复一些操作，这时就需要用到重复命令。它可以让用户方便地再执行一次前面刚完成的某个复杂的命令。<br /><br />重复命令只能在命令模式下工作，在该模式下按“.”键既可。执行一个重复命令时，其结果是依赖于光标当前位置的。<br /><br />［例20］ 屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />}<br /><br />输入命令o，并输入一行内容后，再&lt; Esc &gt;返回到命令模式下，屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />printf （ “ How do you do ! ” ） ;<br /><br />}<br /><br />此时输入命令“.”，屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />printf （ “ How do you do ! ” ） ;<br /><br />printf （ “ How do you do ! ” ） ;</div>
		<!-- / message -->
		<!-- sig -->
		<br />
		<br />
<img src ="http://www.cnitblog.com/charester/aggbug/20940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 20:49 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI 学习（二）vi的使用方法 </title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20939.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 12:42:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20939.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20939.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20939.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20939.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20939.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">vi有三种工作状态：命令状态，文本插入状态，最后一行状态<?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 14.2pt; TEXT-INDENT: -2.85pt; mso-char-indent-size: 12pt; tab-stops: list 29.35pt; mso-list: l2 level1 lfo4">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt">Ø<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">命令状态：是<span lang="EN-US">vi的初始状态及一般状态。在该状态下输入的内容均视为命令，调用命令后，若要返回初始状态，则需按〈Esc〉键。<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">注意：命令状态下，其字母大小写在<span lang="EN-US">vi中是意义不同的的命令<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">（小窍门：若不知道当前是在什么状态，可按几次〈<span lang="EN-US">Esc〉键，以确保处于命令状态。）<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 14.2pt; TEXT-INDENT: -2.85pt; mso-char-indent-size: 12pt; tab-stops: list 29.35pt; mso-list: l2 level1 lfo4">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt">Ø<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">插入状态：在命令状态调用插入命令后，进入插入状态，在此状态下输入的内容被视为文件内容，按〈<span lang="EN-US">Esc〉键回到命令状态。<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 14.2pt; TEXT-INDENT: -2.85pt; mso-char-indent-size: 12pt; tab-stops: list 29.35pt; mso-list: l2 level1 lfo4">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt">Ø<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">最后一行状态：用于存储文件、退出编辑、在<span lang="EN-US">vi中执行shell命令。在命令状态下输入引号中列出的任意一键均可进入该状态：“<span style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">：/ ？ ！</span>”。若要转换到命令状态，按<span style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">Enter</span>键即可。<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">在<span lang="EN-US">vi中执行<span style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">shell</span>命令时，在命令前需加字符“<span style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">！</span>”。<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">例：<span lang="EN-US">1 最后一行状态下，执行shell的列表命令<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">：<span lang="EN-US" style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">!ls</span><span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">file1<span style="mso-spacerun: yes">   </span>file2.f<span style="mso-spacerun: yes">   </span>test.c<span style="mso-spacerun: yes">  </span>…<span style="mso-spacerun: yes">  </span>（当前目录中的文件表）<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">… …<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">Press RETURN or Enter command to continue<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<?XML:NAMESPACE PREFIX = V /?>
						<v:shape id="_x0000_i1030" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command3">
						</a>插入命令（注意字母大小写）<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">i 在光标前插入文本<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">I 在此行开始插入文本<span style="mso-spacerun: yes">      </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">a 在光标后插入文本<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">A 在此行未插入文本<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">o 在当前行下面加一空行并进入输入方式<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">O在当前行上面加一空行并进入输入方式<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<span style="mso-spacerun: yes">    </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1034" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command4">
						</a>删除、复制、移动命令<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">x<span style="mso-spacerun: yes">  </span>删除当前字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">d$ 删除当前行中从光标往后的所有字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">d0 删除当前行中从光标往前的所有字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">dd 删除当前行<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">ndd 删除光标所在位置之下的n行<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">：<span lang="EN-US" style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">n1 ,n2d</span><span lang="EN-US"> 删除n1行到n2行<span style="mso-spacerun: yes">  </span>(在最后一行状态)<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<span style="mso-spacerun: yes"> </span>
						<span style="mso-spacerun: yes"> </span>yy<span style="mso-spacerun: yes">  </span>将当前行复制到缓冲区<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">nyy 将光标所在位置之下的n行文本复制到缓冲区<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">p：将上一次删除或复制的文本复制到光标的下方<span style="mso-spacerun: yes">  </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">P：将上一次删除或复制的文本复制到光标的上方<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">说明：移动正文时需先用删除命令将要移动的正文删除，然后使用复制命令<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1035" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command5">
						</a>光标移动命令<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt; tab-stops: 48.0pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">键盘的←↑→↓键 分别是左移<span lang="EN-US">,上移,右移,下移 <o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt; tab-stops: 42.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">O(数字), $<span style="mso-spacerun: yes">  </span>移至当前行首和行尾<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;shift&gt;+h移动光标至当前窗口的起点<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt; tab-stops: 48.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;shift&gt;+l移动光标至当前窗口的末尾<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;shift&gt;+g （或G）移动光标至文件的末尾 <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;ctrl&gt;+f前翻一页<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;ctrl&gt;+b后翻一页<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">nG 移动光标至第n行<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;ctrl&gt;+g 显示当前行号<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">J 将当前行与下一行连接<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">u 取消前一个命令<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 42pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1036" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command6">
						</a>查找字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">/要查找的字符串(回车)：查找光标位置之后的字符串 <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">?要查找的字符串(回车)：查找光标位置之前的字符串<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">n<span style="mso-spacerun: yes">  </span>继续向同一方向查找匹配的字符串<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">N<span style="mso-spacerun: yes">  </span>继续进行反方向查找匹配的字符串<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">* 在查找的字符串中可匹配任意字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">? 在查找的字符串中可匹配一个字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1037" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command7">
						</a>修改字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">r 只替换光标位置上的一个字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">R 用重写的方法替换原来的字符串，结束替换按&lt;Esc&gt;键<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">:[n1,n2]s/旧字符串/新字符串/g&lt;Enter&gt;<span style="mso-spacerun: yes">  </span>用新文本替换n1～n2行内的所有旧字符串, n1,n2缺省时只修改当前行<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">:g/旧文本/s//新文本/g&lt;Enter&gt;<span style="mso-spacerun: yes">  </span>用新文本替换缓冲区内找到的所有旧文本<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">. 重复上一次修改<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">u 取消上一次修改<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">U 将当前行恢复到修改前的状态<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1039" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command8">
						</a>常用功能选项的设置<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">功能选项将改变<span lang="EN-US">vi的显示环境，用户可在文件$HOME/.exrc中设置自己的选项，如没有此文件，则使用缺省设置。set命令在vi的最后一行命令状态使用。<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set 显示与缺省不同的设置<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set all 显示所有设置<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set ai/noai 自动/不自动缩进<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set nu/nonu 显示/不显示行号<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set list/nolist 显示/不显示不可打印字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set showmode/noshowmode显示/不显示当前操作模式<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set ts=4 设置&lt;Tab&gt;键为4个空格<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">set ic/noic 忽略/不忽略大小写<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1040" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command9">
						</a>文件的读写和退出<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">vi中文件的读写命令均在最后一行状态命令实现<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">w<span style="mso-spacerun: yes">  </span>将缓冲区内容写入原文件<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">w file2<span style="mso-spacerun: yes">  </span>将缓冲区内容写入文件file2<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">w &gt;&gt;file2<span style="mso-spacerun: yes">  </span>将缓冲区内容附加到文件file2的后面<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">q<span style="mso-spacerun: yes">  </span>退出vi<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">q! 强行退出vi,不改写文件<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">r file2 将file2中的内容读入到缓冲区当前行后<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">wq<span style="mso-spacerun: yes">  </span>存盘退出<span style="mso-spacerun: yes">  </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">!shell<span style="mso-spacerun: yes">  </span>执行shell命令<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">! 退出shell命令<o:p></o:p></span> </p>
		<br />
		<div class="postText">VI常用命令 <br /><br />VI命令可以说是Unix/Linux世界里最常用的编辑文件的命令了，但是因为它的命令集众多，很多人都不习惯使用它，其实您只需要掌握基本命令，然后加以灵活运用，就会发现它的优势，并会逐渐喜欢使用这种方法。本文旨在介绍VI的一些最常用命令和高级应用技巧。 <br /><br />一、基本命令介绍 <br /><br />---- 1．光标命令 <br /><br />k、j、h、l——上、下、左、右光标移动命令。虽然您可以在Linux中使用键盘右边的4个光标键，但是记住这4个命令还是非常有用的。这4个键正是右手在键盘上放置的基本位置。 <br />nG——跳转命令。n为行数，该命令立即使光标跳到指定行。 <br />Ctrl+G——光标所在位置的行数和列数报告。 <br />w、b——使光标向前或向后跳过一个单词。 <br />---- 2．编辑命令 <br />i、a、r——在光标的前、后以及所在处插入字符命令(i=insert、a=append、r=replace)。 <br />cw、dw——改变(置换)/删除光标所在处的单词的命令 (c=change、d=delete)。 <br />x、d$、dd——删除一个字符、删除光标所在处到行尾的所有字符以及删除整行的命令。 <br />---- 3．查找命令 <br />---- /string、?string——从光标所在处向后或向前查找相应的字符串的命令。 <br />---- 4．拷贝复制命令 <br />---- yy、p——拷贝一行到剪贴板或取出剪贴板中内容的命令。 <br /><br />二、常见问题及应用技巧 <br /><br />---- 1．在一个新文件中读/etc/passwd中的内容，取出用户名部分。 <br />---- vi file <br />---- :r /etc/passwd 在打开的文件file中光标所在处读入/etc/passwd <br />---- :%s/:.*//g 删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分。 <br />---- 您也可以在指定的行号后读入文件内容，例如使用命令“:3r /etc/passwd”从新文件的第3行开始读入 /etc/passwd的所有内容。 <br />---- 我们还可以使用以下方法删掉文件中所有的空行及以#开始的注释行。 <br />---- #cat squid.conf.default | grep -v '^$' | grep -v '^#' <br /><br />---- 2．在打开一个文件编辑后才知道登录的用户对该文件没有写的权限，不能存盘，需要将所做修改存入临时文件。 <br />---- vi file <br />---- :w /tmp/1 保存所做的所有修改，也可以将其中的某一部分修改保存到临时文件，例如仅仅把第20～59行之间的内容存盘成文件/tmp/1，我们可以键入如下命令。 <br />---- vi file <br />---- :20,59w /tmp/1 <br /><br />---- 3．用VI编辑一个文件，但需要删除大段的内容。 <br />---- 首先利用编辑命令“vi file”打开文件，然后将光标移到需要删除的行处按Ctrl+G显示行号，再到结尾处再按Ctrl+G，显示文件结尾的行号。 <br />---- :23,1045d 假定2次得到的行号为23和1045，则把这期间的内容全删除，也可以在要删除的开始行和结束行中用ma、mb命令标记，然后利用“:'a,'bd”命令删除。 <br /><br />---- 4．在整个文件的各行或某几行的行首或行尾加一些字符串。 <br />---- vi file <br />---- :3,$s/^/some string / 在文件的第一行至最后一行的行首插入“some string”。 <br />---- :%s/$/some string/g 在整个文件每一行的行尾添加“some string”。 <br />---- :%s/string1/string2/g 在整个文件中替换“string1”成“string2”。 <br />---- :3,7s/string1/string2/ 仅替换文件中的第3行到第7行中的“string1”成“string2”。 <br />---- 注意: 其中s为substitute，%表示所有行，g表示global。 <br /><br />---- 5．同时编辑2个文件，拷贝一个文件中的文本并粘贴到另一个文件中。 <br />---- vi file1 file2 <br />---- yy 在文件1的光标处拷贝所在行 <br />---- :n 切换到文件2 (n=next) <br />---- p 在文件2的光标所在处粘贴所拷贝的行 <br />---- :n 切换回文件1 <br /><br />---- 6．替换文件中的路径。 <br />---- 使用命令“:%s#/usr/bin#/bin#g”可以把文件中所有路径/usr/bin换成/bin。也可以使用命令“:%s//usr/bin//bin/g”实现，其中“”是转义字符，表明其后的“/”字符是具有实际意义的字符，不是分隔符。</div>
<img src ="http://www.cnitblog.com/charester/aggbug/20939.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 20:42 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20939.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI 学习（一）VI FAQ </title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20938.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 12:36:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20938.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20938.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20938.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20938.html</trackback:ping><description><![CDATA[
		<p>
				<font face="宋体">0.0 - 引言 -- 我怎样用这个FAQ<br /><br />这个文档分为了几个部分.首先,第0节和第1节介绍了什么是vi;第2节则收录了很多新学者的问题,一些对vi没有很多经验的人也经常问这些问题.这里面包括诸如“命令模式和插入模式之间的区别”,以及“我怎样拷贝和粘贴”之类的问题.第3节是面向vi的中级用户的,它从问题“我如何查找和替换”开始,逐步深入,直到对vi里面的宏（Macro）的用法讨论为止.第3节还包括了一个vi的快速参考,有一个规范的vi命令列表.再下面,是一个有关“:set”命令的列表,包含了所有能定制vi环境的变量,这些变量也可以在.exrc文件中定义.<br /><br />我们已经在一个运行SunOS和UCB版本vi的机器上验证了快速参考.除了SunOS带的vi外,每个命令都可以在系统V和UCB版本vi运行,但是我个人并没有验证这一点.<br /><br />除非我们在文档中指明,缺省我们假定你处在命令模式下.<br /><br />我们还尝试保留尽可能多的术语,因为在原始的vi文档中使用了这些术语,尽管我可能忘了它的本来含义.<br /><br />0.1 - 索引<br /><br />第一个文件：<br /><br />0.0 - 引言 -- 我怎样用这个FAQ？<br />0.1 - 索引<br />0.2 - 我可以散发这个FAQ吗？<br />0.3 - 你能为这个FAQ做什么？<br /><br />1.0 - 什么是vi?<br />1.1 - 关于vi有什么重大的交易吗? 为什么大家都用它? 更进一步说,为什么我要用它?<br />1.2 - 噢! 这听起来不错! 有没有理由不用vi?<br />1.3 - vi能在多少不同的操作系统下面运行?<br />1.4 - 好吧, 你说服了我. 我决定开始使用vi. 我该从哪儿开始?<br />1.5 - vi有其他一些可用的变种吗?<br /><br />2.0 - vi入门<br />2.1 - 有什么游戏帮助我们学习vi吗?<br />2.2 - 命令模式和插入模式有什么区别?<br />2.3 - 等等,我的键盘没有&lt;Esc&gt;键,我该怎么办?<br />2.4 - 那些~s是什么东西?<br />2.5 - 我无法习惯用 hjkl, 你有什么建议吗?<br />2.6 - 我如何才能不存盘就退出?<br />2.7 - 我怎样插入一个文件?<br />2.8 - 我怎样查找文本?<br />2.9 - 我怎样搜索一个控制序列?<br />2.10 - 我怎样重新格式化文本?<br />2.11 - 我怎样复制文本?<br />2.12 - 啊! 我刚才敲了一个dG,然后我的论文就没有了! 我该怎么办?<br />(或者,我刚才犯了个错误,我该怎么办?)<br />2.13 - 我正在写我的论文,被告知我必须将每一节都放在不同的文件里,我该怎么办?<br />2.14 - 所有的:命令都是怎样处理的?<br /><br />3.0 - 怎样查找和替换?<br />3.1 - 我怎样在vi中运行一个程序?<br />3.2 - 啊! 我正在写我的论文, 系统崩溃了! 怎么办?<br />3.3 - 有没有使vi对程序员更友好的窍门?<br />3.4 - 宏 -- 我怎样写宏?<br />3.5 - 我怎样将一个功能键定义成一个宏?<br />3.6 - 有没有办法缩写文本?<br />3.7 - 我怎样在当前文档中做拼写检查?<br />3.8 - 我手头有一个硬拷贝的终端, 我还能用vi吗?<br />3.9 - 好了,是不是处在开放模式下的原因呀?! 但是我现在没有用硬拷贝终端,它还是在<br />开放模式呀?<br /><br />第二个文件:<br /><br />4.0 - vi档案的在线帮助在哪儿?<br />5.0 - 好玩的vi诀窍,无聊的宏<br />5.1 - 好玩的vi诀窍<br />5.2 - 好玩的宏<br />6.0 - 依字母顺序的vi快速参考<br />6.1 - 命令模式的输入选项(:命令)<br />6.2 - 设置选项(set)<br />7.0 - 建立 .exrc文件<br />7.1 - .exrc文件的样本<br />8.0 - vi的漏洞<br />9.0 - 术语表<br />10.0 - 关于vi的参考书目<br /><br />0.2 - 我可以散发这个FAQ吗？<br /><br />可以!只要你没有对它做任何修改,或者用它来赚钱.<br /><br />0.3 - 你能为这个FAQ做什么？<br />首先, 把你发现的错误告诉我. 如果你有什么建议我们也很欢迎. 你认为还不清楚的地方告诉我们,我们同样欢迎.<br />还有, 使用vi! (Spread the word) 我很抱歉我无法将所有对这个FAQ有贡献的人都列出来, 因为许许多多的人都给过我建议和帮助,如果我将他们都列出来的话,那么恐怕这张贡献者的清单将和这个文档本身一样长了.<br /><br />1.0 - 什么是vi?<br />vi是个可视化的编辑器(vi就意味着可视化--VIsual). 那么,什么是可视化的编辑器呢？<br />(相对于非可视化的编辑器来说）?可视化的编辑器就是可以让你在编辑文本的时候看到它们.<br />今天,这听起来似乎非常普通,反之,非可视化的编辑器似乎很奇怪. 非可视化的编辑器的例子可以举出不少:如ed, sed和edlin(直到相当近的一段时间内,它是DOS自带的最后一个编辑器)等.<br />vi是威廉.侨伊写的,作为BSD UNIX的一部分. 后来AT&amp;T也开始用vi, 于是标准UNIX也开始用vi了.<br /><br />1.1 - 关于vi有什么重大的交易吗? 为什么大家都用它? 更进一步说,为什么我要用它?<br />vi是UNIX下面的缺省编辑器, 因此几乎近来所有的UNIX都捆绑了vi(近来是指1984年左右).<br />这意味着无论何时你跨平台使用某种UNIX,你都知道在你指尖下面有一个强力的编辑器.为什么不是别的呢? vi是个强大的编辑器.同样,一旦你了解了vi,你就能很快的编辑你的文件,因为它非常能节省你的敲键次数. 由于它在插入和命令两种情况下使用不同的模式,它比大多数的不基于这种模式的编辑器要快. 而且,vi非常小(我机器上面的版本只有200K).还有,vi几乎能做任何事,只要你知道如何使它做你想做的事.<br /><br />1.2 - 噢! 这听起来不错! 有没有理由不用vi?<br />有. 有一个非常好的理由: vi稍微有些难学, 如果你开始学的话,vi又慢又让人痛苦,当然,一旦你学会了, vi就快多了. 但是学习的过程很慢. 有人曾经问我, 如果vi是个比较易学的编辑器, 它是否直观(intuitive)呢? 我一般这样回答:"是的,我们有些人是这样认为.但是大多数人认为我们疯了."<br /><br />1.3 - vi能在多少不同的操作系统下面运行?<br />UNIX. 就是它. 尽管如此,还是有很多vi的变种运行在不同的操作系统上. 我就在以下一些操作系统上用过vi: UNIX, DOS, OS/2, MAC SYSTEM 7.(后面有一个有关细节的列表)<br /><br />1.4 - 好吧, 你说服了我. 我决定开始使用vi. 我该从哪儿开始?<br />好吧, 狡猾的家伙. 关于vi有很多很好的书:大多数讲UNIX的书至少有一章给了vi,而且有不少是专门讲vi的书.我没有什么偏爱. 所以你最好是问问你们那儿的vi高手们他们是从哪儿学来的. 还有,到处试. 用vi打开一个不重要的文档(你的论文不象是个学vi的好实验品),然后再到处试. 我无法想象有人学习vi却不花相当多的时间去到处试试. 记住:如果你有些地方不明白了, 只要敲两次&lt;Esc&gt;键,你就又回到命令模式下了.我要提到的一点是,我想在这里提比较合适,就是如果要成为系统管理员或者其他对UNIX配置做什么修改的话,最好是学学ed或者ex,因为有些版本的UNIX没有把vi放在根分区里面,这样你就可能无计可施了. ed是个不错的选择.<br /><br />1.5 - vi有其他一些可用的变种吗?<br />只能列出一部分:STvi (STevie), elvis, vile, vim, 和nvi, xvi.<br />elvis适用于:Amiga, DOS, OS/2, Unix, VMS, Atari.<br />STevie适用于: Atari ST, DOS, Unix, Mac System 7.<br />Mac System 7可以在很多info-mac的镜象站点获取,在/info-mac/text下.<br />(例如ftp.hawaii.edu)<br />nvi是将和BSD 4.4捆绑在一起的vi.<br />vim适用于: Amiga, DOS, Mac System 7, Unix.<br />Amiga, DOS,和源码可以在以下站点换取:ftp.fu-berlin.de /misc/editors/vim<br />Mac System 7可以在很多info-mac的镜象站点获取,在/info-mac/text下.<br />(例如ftp.hawaii.edu)<br />vile适用于: DOS, OS/2, Unix, VMS.<br />xvi适用于: DOS, Unix.<br />vi的变种之间很有很多差异.很多都改进了vi,大多数都可以使用在这个文档<br />种列出的命令,但是有一些不同的地方.更进一步的细节,你可以参考这些变种<br />附带的相应的文档.<br /><br />2.0 - vi入门<br />对vi的初学者来说,有些基本的提示.第一,任何时候,手头都要有一份命令摘要.我们将在后面给出一个快速参考/命令摘要. 第二, 找一本vi方面的比较好的书.这个文档不是学vi的最佳途径(最起码现在还不是),我不敢保证这个文档能教会一个对vi一无所知的人, 而很多书已经做到了这一点. 但是,我们这里还是给出了不少提示. 对选择书籍来说,有一个标准的原则:买之前一定要仔细阅读. 要了解这本书对你是否有意义.确信它能在你练习vi的时候有用. 和其他的书做个比较 -- 不管怎样,vi可能让你感到非常莫名其妙, 而且你要确信这么一点:是书让你糊涂,而不是<br />你低估了学vi的难度.<br />还有, 找一些诸如"学vi"(vilearn),"vi向导"(vitutor)之类的软件来帮助你掌握<br />vi的基本知识.<br /><br />2.1 - 有什么游戏帮助我们学习vi吗?<br />这似乎很无聊, 但是事实上UNIX系统里面有不少游戏可以帮助你学习使用vi.这些帮助主要是一些基本知识. 虽然我还不知道有哪个游戏可以帮你学习vi的所有命令, 但我确实知道有一些可以帮助你学习使用 hjkl来移动光标. NetHack,一个类Rogue的游戏,就对这非常有帮助. 而且它是一个很大的游戏,能玩很长一段时间. 我没有贬低其他游戏的意思,这些游戏是: rogue, moria, omega, worm, snake.<br /><br />2.2 - 命令模式和插入模式有什么区别?<br />vi将命令模式和插入模式区分开来,这经常被认为是vi的一个大问题,但往往这也被认为是vi的优势所在. 理解其中的区别是掌握vi的关键.vi启动时,开始处于命令模式;在这种模式下,我们可以在文件中到处移动,改变文本的某个特定区域, 剪切, 复制和粘贴文本,还有更多. 插入模式是指用户可以真正插入文本.换句话说,命令模式是用来在文件中移动,而插入模式是用来在文件中键入文本.有些命令,例如: a, i, c, C, O, o和其他一些可以从命令模式切换到插入模式.&lt;Esc&gt;键或者^C(CRTL+C)可以脱离插入模式而返回到命令模式.你要适应这种差别. 它使得vi区别于其他的编辑器. 它也使你能在你的手不离开标准键盘做很多事情.<br /><br />2.3 - 等等,我的键盘没有&lt;Esc&gt;键,我该怎么办?<br />试试敲 ^[(CTRL+[). 如果你的键盘有一个&lt;Meta&gt;键,再试试它.如果还不行,再试试^3.<br /><br />2.4 - 那些~s是什么东西?<br />它们仅仅是用来让你知道你的文档末尾在哪儿.实际上它们并不在你的文档里面,所以你用不着担心它们.<br /><br />2.5 - 我无法习惯用 hjkl, 你有什么建议吗?<br />首先,如果你的终端设置正确而且你连接的也没有问题的话,你可以使用箭头键.但是,如果你认为你要经常使用vi,那么最好是习惯使用 hjkl,因为它们敲起来更快. 而且,有时候连接出问题了,使得ESC序列都可能丢失了.(这样你可能就无法使用箭头键了--译注)<br /><br />2.6 - 我如何才能不存盘就退出?<br />:q!可以做到这一点. 如果vi看起来冻住了,确信你没有错敲了个 ^S. 敲^Q可以解开^S.<br /><br />2.7 - 我怎样插入一个文件?<br />:r &lt;文件名&gt;<br />例如,要插入文件/etc/motd, 可以敲 :r /etc/motd.<br />这将把文件插入到光标处.如果你在r前面指定了一个数字,那么这条命令将把文件插入到那个位置.<br /><br />2.8 - 我怎样查找文本?<br />/&lt;文本&gt;将向前查找, ?&lt;文本&gt;将向后查找. ??或者//将重复上次查找. 在UNIX下,这已经是个可爱的标准用法了. 而且, 在vi中, n将查找文本下一次的出现位置. N重复上次查找,不过逆转了查找的方向. 在查找中可以使用规范式.<br /><br />2.9 - 我怎样搜索一个控制序列?<br />/^V^&lt;序列&gt;<br />^V会告诉vi照字面理解下一个字符,不要把它看作是一条命令.<br /><br />2.10 - 我怎样重新格式化文本?<br />如果你的计算机有一个名叫fmt的程序, 你要做的仅仅是在命令模式下面敲!}fmt(记住,不要在前面加icon_smile.gif. 这可以重新格式化你的文件,从光标所在的位置一直到当前段落的结尾.如果你的机器里面没有fmt这个程序, 你就得去找个类似的软件了(我记得在公共域里面有不少这样的程序,但是我对此了解不多)<br /><br />2.11 - 我怎样复制文本?<br />这有点复杂.把这节拿出来,多看几遍;还有,一定要多做实验.<br />"&lt;字母&gt;yy可以把一行文本拷贝到寄存器中(这里的寄存器是vi的术语,指可以存放剪切和拷贝下来的东西的地方), &lt;字母&gt;里面的字母必须是a到z之间的一个. "&lt;字母&gt;dd可以把一行剪切下来放到寄存器里面. 你可以在yy或者dd前面用数字指明要拷贝或者剪切的行数.如果&lt;字母&gt;中的字母是大写的话,意味着把文本插入到寄存器中已有的文本之前."&lt;字母&gt;p把文本插入到光标之后,"&lt;字母&gt;P把文本插入到光标之前.如果寄存器中含有某一行的开头或结尾,这一行将会被放到另一合适的行上. Y是yy的快捷方式. 还有, y$, yH,yM,等等,都是可以用的.d命令也是一样的.如果要快速的剪切和粘贴, 你就无须指定寄存器了.如果这样的话,你就不能往寄存器里面添加文本了.而且只要有一个删除命令的话,寄存器中的东西就没有了(包括x命令).<br />举例来说,如果要移动上一段的话,你可以把光标移到段落的开头,敲"a13dd,再把光标移到你想要放文本的地方,敲"ap,就可以把那段文本放到光标所在的行后面.现在,大概你想要剪切和粘贴文本到不是行末尾的区域去.我们来看如何做到这一点:我们可以使用 m&lt;字母&gt; 命令来标记一个区域,这个字母可以和剪切/粘贴寄存器的字母相同,因为它们是保存在内存中的不同位置. 然后,敲"&lt;寄存器&gt;`&lt;字母&gt;[yy或者dd], 这里的寄存器就是要保存文本的那个寄存器,&lt;字母&gt;是用来标记的,yy和dd是你的操作.<br /><br />2.12 - 啊! 我刚才敲了一个dG,然后我的论文就没有了! 我该怎么办?<br />(或者,我刚才犯了个错误,我该怎么办?)u可以撤消你刚才的操作.U可以撤消你对当前行的修改(当然,一行对于一篇论文来说当然很不够了). :e!可以不保存修改而重新把你的文件调进来. 还有,你删除的文本都保存在从0到9编号的寄存器里.所以,"&lt;n&gt;p就可以把上第n次的删除文本粘贴出来.你可以按如下的方法迅速地查看所有删除的文本. 先试一个,不对的话,敲u,再试下一个.(为加速这个过程,这时vi中的.命令和通常的用法不一样了.它不是重复上次操作,而是试下一个寄存器,这样<br />你要做的无非就是: "1p u . u .,直到你撤消了你想撤消的删除操作)<br /><br />2.13 - 我正在写我的论文,被告知我必须将每一节都放在不同的文件里,我该怎么办?:[m],[n]w &lt;文件名&gt;可以将从第m行到第n行之间的文本保存到&lt;文件名&gt;所指定的文件中.这种行序号方法几乎在所有的:命令下都可以使用. 如果你用命令:[m],[n] w &gt;&gt;&lt;文件名&gt;,这些文本将添加到文件的后面.<br /><br />2.14 - 所有的:命令都是怎样处理的?<br />:后面的命令都是从ex编辑器里面过来的. 这就给vi加入了很多灵活性,也使vi功能更强大. 例如, 有很多的方法可以用来查找和替换,它们有很多的类似地方(事实上,它们在某种意义上说都是一样的)<br /><br /><br />3.0 - 怎样查找和替换?<br />有很多方法. 最简单的是:<br />:s/old/new/g, 但是,这仅对当前行起作用..., 所以,我们用<br />:%s/old/new/g, 更一般的,我们还可以用<br />:[范围]s/old/new/[cg],这里,[范围]是任意的行范围,包括行号,$(文件末尾),.(当前行),%(当前文件),或者两个行号之间加个破折号(或者可以这样: .,+5,这表示下面5行).[cgi]是c,g,i中间的一个或者什么也没有.c告诉vi每次替换的时候要给提示,g是说对所有一行中出现的地方都做替换.i则是指在查找时不区分大小写.如果最后一个斜杠(/)后面没有东西的话,那么vi只替换在行中第一次匹配的地方.<br />我比较喜欢这样做:<br />:g/foobar/s/bar/baz/g, 这个命令首先搜寻foobar,然后把它变成foobaz. 它没有改变jailbars, 而其他的一些命令可能会改变jailbars. 这是我的方法,但是可能比较难记.<br />当然,你还可以在查找的的时候使用正规式,以及在替换文本的时候使用其他一些命令.如果你在正规式里用\(和\)来剥离一个序列的话,你会发现你可以做很多好玩的事情.</font>
		</p>
		<p>
				<font face="宋体,verdana, arial, helvetica">例如:<br />:g/\(foo\)\(bar\)/s/\2/\1baz/g 将foobar替换成foobaz<br />还有一些特殊的序列:<br />&amp; 所有查找时匹配到的东西<br />\[1-9] 1到9号用\(和\)括起来的东西<br />\u 下一个字符将被变成大写.<br />\U 以后的字符都变成大写,直到遇到\e或\E<br />\l 下一个字符将被变成小写.<br />\L 以后的字符都变成大写,直到遇到\e或\E<br />\[Ee] 更改大小写的选择区域的终点<br /><br />3.1 - 我怎样在vi中运行一个程序?<br />:!命令 可以在vi中运行程序. :sh会启动一个交互式的外壳(SHELL).在这个外壳<br />里面, 如果你愿意,你还可以再次运行vi. 当你在编辑Makefiles和配置文件来编译<br />某个程序的时候,这可能比较有用. 这比:e优越之处在于它无须保存文件,而且如果<br />你退出外壳的时候,vi还回到原来的地方.(当然,我还是建议你先保存一下文件)<br /><br />3.2 - 啊! 我正在写我的论文, 系统崩溃了! 怎么办?<br />不要怕! 你会收到一封电子邮件,里面就是你的论文.敲入vi -r &lt;文件名&gt;<br />(这个文件名就是系统崩溃时你正在编辑的文件)你就可以恢复出你的论文来.只敲<br />vi -r将把所有可能恢复的文件都列出来.<br /><br />3.3 - 有没有使vi对程序员更友好的窍门?<br />:set ai可以让vi自动对齐.<br />:set sw=#,#是移动的宽度(shiftwidth),或者说TAB键的宽度(tabwidth);你可以<br />用&lt;&lt;或者&gt;&gt;命令来左移或右移某一行. 还有, 你可以使用 &lt;%或&gt;%来将{,(或[等符号<br />括起来的文本都左移或右移;这时候,你必须把光标放在这些符号({,(或[)上面.<br />:set sm会在你敲},]或)显示出对应匹配的{,[或(来.<br />:set lisp会对lisp编程有些帮助. ()被移到s表达式(s-expressions)外面,如果<br />原子(atoms)没有停止则{}将被移走.<br /><br />3.4 - 宏 -- 我怎样写宏?<br />:map &lt;lhs&gt; &lt;rhs&gt;, 其中&lt;lhs&gt;最多10个字符,&lt;rhs&gt;最多100个字符. 以后,如果<br />你敲了&lt;lhs&gt;,vi就会用&lt;rhs&gt;来取代它.所有的宏都是在命令模式下开始的,但是可以<br />在你想在的模式下终止. 记住,在你想用的控制字符前面加上^V.<br />:unmap &lt;lhs&gt;将删除这个宏. :map！&lt;lhs&gt; &lt;rhs&gt; 使得&lt;lhs&gt;将&lt;rhs&gt;插入到文档<br />中去.<br /><br />3.5 - 我怎样将一个功能键定义成一个宏?<br />如果&lt;lhs&gt;是#n,n是0-9之间的一个数,那么这个宏就映射成某一个功能键了.(你<br />可以试一下F1-F10之间的键--译者)<br /><br />3.6 - 有没有办法缩写文本?<br />当然了. 这可是vi呀,它能做任何事情!<br />:ab email <a href="mailto:ellidz@midway.uchicago.edu"><font color="#333333">ellidz@midway.uchicago.edu</font></a> 可以在你敲完email后,把那个没有缩写<br />的文本插入到文件中. :una email取消缩写.<br /><br />3.7 - 我怎样在当前文档中做拼写检查?<br />这儿有一个宏可以做到这一点. 这些应该放在你的.exrc文件中(后面我们将对.exrc<br />进一步讨论). 它是一个相当简单的宏. 它仅仅是调用ispell来处理当前文件.当然,你<br />的系统里面一定得有ispell这个程序. 使用它的时候,只需要敲个V键就行了(因为vi并<br />没有用V,所以V是一个比较合适的键)<br /><br />map V :w^M:!ispell % ^M:e!^M^M<br /><br />第二个^M使你在拼写检查完之后无须敲回车就可以到vi中.<br />(译注, 在我的系统里,没有ispell,只有spell,我用它替换了ispell,工作的不错;还有,<br />^M不是两个字符,而是一个字符,通过^V^M敲进去的;另外,我个人认为第二个^M还是不要<br />的好,因为直接回到vi后你就无法看到拼写检查的结果了)<br /><br />3.8 - 我手头有一个硬拷贝的终端, 我还能用vi吗?<br />好了,好了. 我并认为有人会真的问这个问题.这个问题太偏了,我们大可不必理<br />它.(而且,它回答了一个非常普通的问题)<br />vi启动的时候处于一种特殊的模式下面,叫做"开放模式"; 在这种状态下,事情或多或少<br />的有些不同. 删除的字符在你面前显示成一些',vi会认为你的终端窗口只有一行. ^r<br />可以把当前行重新输出. z则把当前行周围的窗口重画一遍.<br /><br />3.9 - 好了,是不是处在开放模式下的原因呀?! 但是我现在没有用硬拷贝终端,它还是在开放<br />模式呀?<br />这儿的问题就是vi没有认出你用的终端的类型. 于是它假定你有的是个最烂的终端,<br />所以它决定依然处在开放模式下.这似乎没什么用处.因为没有多少人喜欢开放模式,但是开放<br />模式还是需要知道你的终端的一些最起码的信息的.<br />现在,我们来看如何解决这个问题.我们有可能把它分成几种特殊的情形,但是,一般情况下,<br />这并没有用处. 如果你直到你的终端的类型, 你可以在UNIX提示符下面设置终端类型(在CSH<br />及其变种下面,使用命令setenv TERM &lt;终端类型&gt;;在SH及其变种下面,使用命令TERM=&lt;终端类型&gt;;<br />export TERM)<br />最好你能把上面的命令写在.profile文件或者.cshrc文件里面,这样你一登录它就自动地给<br />你设置好了.(当然,你应该知道如何使用ed,或者你能在UNIX提示符下面设置好终端类型以便能<br />使用vi, 这样你才有可能去编辑这些文件)<br />如果你确实不知道你地终端类型,试一试vt100.现在大多数地终端或者终端仿真器都能仿真<br />vt100. 如果这还不能生效的话,你只好去找个高手来帮你了.<br /><br />4.0 - vi档案的在线帮助在哪儿?<br />有一个vi的FAQ,其中列出了vi档案的所有在线文件. 同时它还列出了这些文档<br />的镜象站点. 最主要的一个地址是alf.uib.no,但是这些文档在很多很多地地方<br />都保存着. vi-archive faq把它们都给列出来了.你在下载这些文件之前一定要<br />核对一下这个FAQ.因为很有可能有一个站点比去挪威的站点更近更快些.<br />一个镜象站点是cs.uwp.edu/pub/vi, 另一个是monu6.cc.monash.edu.au/pub/Vi,<br />这些站点上有很多有关vi的文件,还有一些vi的变种版本;当然,UCB版本的vi是<br />肯定有的, 还有许多的宏.<br /><br />5.0 - 好玩的vi诀窍,好玩的宏<br />这一节主要讲述一些无聊的诀窍和一些无聊的宏.事实上,任何vi的诀窍和宏我们<br />都欢迎,只要它们不是过分冗长. 如果有人向我建议而我也认为确实值得加的话,<br />我会考虑加进去的.<br /><br />5.1 - 好玩的vi诀窍<br />xp 删除光标下的字符,再把粘贴到后面去.换句话说,它交换了当前两个字符<br />的位置.<br />ddp 和xp类似,不过是交换两行的位置.<br />uu 撤消和重复上次所做的修改.(这可以使你不改变什么东西就可以到你上次所<br />做的修改处)<br /><br />5.2 - 好玩的宏<br />和垂直上方的字符交换位置<br />map * kxjphxkP<br /><br />折行<br />map g $80|F r<br />(译注,我对这条宏表示疑问!)<br /><br />改变大多数单词的大小写<br />map v ywmno:s/./\~/g<br />(译注,这条好象也不大对!)<br /><br />在当前的单词周围加上`和'<br />map *` i`'<br />在当前的单词周围加上'和'<br />map *' i''<br />在当前的单词周围加上"和"<br />map *" i""<br />(这几条也太无聊了吧--译注)<br />在当前的单词周围加上``和``<br />map! `` `'<br />(咦,好象又有问题?--译注)<br /><br />从光标处把当前行分开,在下一行开头加上一个&gt;号(例如,引用USENET).如果加上了单词的折行<br />功能那么最后一个单词可能被折在第一行.<br />map g may0O`ay$:s/./ /g<br />(不对吧--译注)<br /><br />插入一个字符<br />map g i$^[r<br /><br />6.0 - 依字母顺序的vi快速参考<br />... 是指有些东西需要在命令之前或之后指明.这通常是说光标的移动键<br />(h,j,k,l,w,b等等)或者是指行号.<br /># (这里#代表一个数字) 执行n次后面的命令...<br />: 进入ex模式<br />) 下一句<br />( 上一句<br />} 下一段<br />{ 上一段<br />]] 下一节<br />[[ 上一节<br />0 行的开头<br />$ 行的末尾<br />^ 行的第一个非空白字符<br />+ 下一行的开头<br />- 上一行的开头<br />(空格) 下一个字符<br />(回车) 下一行<br />/ 向前搜索<br />? 向后搜索<br />% 查找当前小(中,大)括号的匹配字符<br />, 逆向重复上一个f,F,t或T操作<br />; 重复上一个f,F,t或T操作<br />. 重复上一个操作<br />` 转到标记处<br />' 转到标记所在行的开头<br />`` 查找前回到上一个做标记的地方<br />'' 查找前回到上一个做标记所在行的开头<br />~ 切换字符的大小写<br />" 保存到寄存器中<br />!! 重复上一次SHELL命令<br />! 把后面的文本送给命令, 取代输出(例如, !}fmt把当前的段落<br />送给命令fmt处理,然后用fmt返回的东西替换输出.)<br />&gt;&gt; 右移当前段落一个移动宽度(shiftwidth)<br />&lt;&lt; 左移当前段落一个移动宽度(shiftwidth)<br />&gt;% 从当前到匹配小(中,大)括号之间的文本右移<br />&lt;% 从当前到匹配小(中,大)括号之间的文本左移<br />(似乎漏了一个符号|, 移动到某一列----译注)<br />a 在当前位置之后添加<br />A 在当前行的末尾添加<br />^a 没有使用<br />b 上一个单词的开头<br />B 上一个单词的开头,忽略标点符号<br />^b 上移一屏<br />c 覆盖...<br />C 覆盖到行末尾<br />^c 终止插入模式,在命令模式没有用<br />d 删除...<br />D 删除到行末尾<br />^d 下移半屏，如果在插入模式下则移到上一个移动宽度（ShiftTab)处<br />e 单词的末尾<br />E 单词的末尾,忽略标点符号<br />^e 屏幕下卷一行<br />f 查找...<br />F 向后查找...<br />^f 下移一屏<br />g 未用<br />G ...跳至[缺省是到文件末尾]<br />^g 显示状态栏<br />h 左移<br />H 屏幕上的第一行<br />^h 在插入模式下是退格,命令模式下是左移<br />i 在当前的位置前面插入<br />I 在本行的第一个非空白字符前面插入<br />^i 插入模式下是制表键,命令模式下未用<br />j 下移<br />J 把下一行合并到本行<br />^j 命令模式下是下移,插入模式下是建一个新行<br />k 上移<br />K 未用<br />^k 未用<br />l 右移<br />L 屏幕中的最后一行<br />^l 重绘屏幕<br />m 把当前位置标记到寄存器中<br />M 屏幕的中间行<br />^m 回车<br />n 重复上次查找<br />N 逆向重复上次查找<br />^n 命令模式下是下移<br />o 在当前行的下面建一个新行<br />O 在当前行的上面建一个新行<br />^o 未用<br />p 在当前行的下面粘贴<br />(译注--应为在当前位置的后面粘贴)<br />P 在当前行的上面粘贴<br />(译注--应为在当前位置的前面粘贴)<br />^p 命令模式下是上移<br />q 未用<br />Q 退出并且启动ex<br />^q 未用<br />r 覆盖当前的字符<br />R 在插入模式下一直覆盖字符<br />^r 在命令模式下面重绘屏幕<br />s 替换<br />S 替换整行<br />t 到...<br />T 向后到...<br />^t 移到下一个移动宽度(shifttab)处<br />u 撤消上一次操作<br />U 撤消对本行的所有修改<br />^u 上移半屏<br />v 未用<br />V 未用<br />^v 未用<br />w 下一个单词的开头<br />W 下一个单词的开头,忽略标点符号<br />^w 命令模式下未用,在插入模式下是到上一个单词的开头处<br />x 删除当前字符<br />X 删除前一个字符<br />^x 未用<br />y 复制...<br />Y 复制整行<br />^y 屏幕上卷一行<br />z 重新配置当前行周围的屏幕<br />ZZ 保存之后退出<br />^z 未用<br />(译注--在命令模式下,^z执行了UNIX暂停操作)<br /><br />6.1 - 命令模式的输入选项(:命令)<br />(注: 这不是一个规范的列表,, 我只是列出了一些最重要的命令)<br />:r &lt;文件&gt; 把&lt;文件&gt;读入到当前文档<br />:r !&lt;命令&gt; 把&lt;命令&gt;的输出插入到当前文本中<br />:nr &lt;文件&gt; 把&lt;文件&gt;插入到第n行<br />:!&lt;命令&gt; 运行&lt;命令&gt;,然后返回<br />:sh 转到SHELL<br />:so &lt;文件&gt; 读取&lt;文件&gt;,再执行文件里面的命令<br />(译注--文件中的命令应该都是一些ex命令)<br />icon_mad.gif 保存之后退出<br />:wq 保存之后退出<br />:l1,l2w &lt;文件&gt;把第l1和第l2行之间的文本写到&lt;文件&gt;中去,如果没有指定&lt;文件&gt;,<br />vi就假定是当前文件,如果没有指定l1,l2,就假定是整个文件(就成了:w)<br />:w &gt;&gt; &lt;文件&gt; 添加到&lt;文件&gt;末尾. 也可以使用行号<br />:w! 覆盖当前文件<br />:q 退出<br />:q! 不存盘就退出<br />:e &lt;文件&gt; 不离开vi编辑&lt;文件&gt;<br />:e! 重新编辑当前文件,忽略所有的修改<br />:n 编辑下一个文件<br />:e +n &lt;文件&gt; 从第n行开始编辑&lt;文件&gt;,如果超过了末尾,就从末尾开始编辑<br />:e# 编辑替换文件(如果使用了命令:e&lt;文件&gt;,替换文件就指的是原始文件)<br />:args 显示所有要编辑的文件<br />:rew 重新回到第一个编辑的文档<br />:map m n 创建一个宏(使 m 做 n)<br />:map! m n 创建一个插入模式的宏(使 m 做 n)<br />:unmap m 删除宏m<br />:unmap! m 删除插入模式的宏m<br />:ab &lt;1&gt; &lt;2&gt; 缩写,敲&lt;1&gt;的时候用&lt;2&gt;取代<br />:unab &lt;1&gt; 取消缩写&lt;1&gt;<br />:set &lt;选项&gt; 设置&lt;选项&gt;...<br /><br />6.2 - 设置选项(set)<br />可以使用括号中的缩写形式. 语法:<br />:set &lt;选项&gt; &lt;参数&gt; (如果需要参数的话)<br />也可以在一行中指定多个选项<br />:set &lt;选项&gt;? 显示出当前这个选项的参数值<br />:set all 则显示所有的选项值<br />对那些无须参数的选项来说,使用:set no&lt;选项&gt;就可以把它给关了<br /><br /><br />选项: 缺省值: 含义:<br />autoindent (ai) noai 使新行自动缩进,和上(下)行的位置对齐<br />autoprint (ap) ap 每条命令之后都显示出修改之处<br />autowrite (aw) noaw 在:n,:!命令之前都自动保存文件<br />beautify (bf) nobf 在输入的时候忽略所有的控制字符<br />(除了制表键(tab),换行(newline),进纸(formfeed))<br />directory= (dir=) /tmp 存放缓冲区的目录名<br />edcompatible noedcompatible 在替换的时候使用类ed的用法<br />errorbells (eb) errorbells 出错的时候响铃<br />exrc (ex) noexrc 允许在主目录(home)外面之外放.exrc文件<br />hardtabs= (ht=) 8 设置硬制表的边界<br />ignore case (ic) noic 正规式里忽略大小写<br />lisp nolisp 打开lisp模式<br />list nolist 显示所有的制表键和行的结尾<br />magic magic 可以使用更多的正规表达式<br />mesg mesg 允许向终端发送消息<br />number (nu) nonumber 显示行号<br />open open 允许开放和可视化<br />optimize (opt) optimize 优化吞吐量,打印时不发回车<br />paragraphs= (para=) IPLPPPQPPLIbp 设置{ &amp; }的分界符<br />prompt prompt 命令模式下的输入给出:的提示符<br />readonly (ro) noro 除非用!号否则不准保存文件<br />redraw noredraw 当编辑的时候重绘屏幕<br />remap remap 允许宏指向其他的宏<br />report= 5 如果影响的行数&gt;这个数的话就报告<br />scroll 1/2 window 下卷屏幕时滚动屏幕的数目,<br />同样这也是z命令输出的行数(z 输出2倍滚屏的大小)<br />sections= SHNHH HU 定义节的末尾(当使用命令[[ 和 ]] 时)<br />shell= (sh=) /bin/sh 缺省的SHELL,如果设置了环境变量SHELL的话,就使用变量<br />shiftwidth= (sw=) 8 当使用移动(shift)命令时移动的字符数<br />showmatch (sm) nosm 显示{, }, (, ), [, 或者 ] 的匹配情况<br />showmode noshowmode 显示你处在什么模式下面<br />slowopen (slow) 插入之后不要立刻更新显示<br />tabstop= (ts=) 8 设置制表停止位(tabstop)的长度<br />taglength= (tl=) 0 重要标记的字符个数(0表示所有的字符)<br />tags= tag, /usr/lib/tags 定义包含标记的文件路径<br />term= 设置终端类型<br />terse noterse 显示简短的错误信息<br />timeout (to) timeout 一秒钟后键盘映射超时<br />ttytype= 设置终端类型<br />warn warn 显示"No write since last change"信息<br />window= (w=) 可视模式下窗口的行数<br />wrapmargin= (wm=) 0 右边距,大于0的话最右边的单词将折行,留出n个空白位置<br />wrapscan (ws) ws 查找到文件尾后再重头开始<br />writeany (wa) nowa 可以保存到任意一个文件去<br /><br />(译注--这些选项在各种vi版本中都基本上大同小异,以SunOS带的vi为例,它没有这里列出来的open选项,<br />scroll的参数值也不同,还多出来一些选项,如flash,modelines,novice,tagstack等等)<br /><br />7.0 - 建立 .exrc文件<br />所有命令输入模式下的命令(即 :命令)都可以在.exrc文件中使用,在.exrc中的命令在启动vi的时候自动<br />加载.尤其是源命令(so),缩写(ab)和宏定义都可以用.在.exrc中不允许有空行.以"开头的一行vi将把它当成<br />注释.<br /><br />7.1 - .exrc文件的样本<br />以下的.exrc文件是一个实际的例子, 我自己的. 因此,它就没有有些人想象的那样设置很多的选项.即便<br />如此,它还是给出一些基本的概念,而且它也相当易懂.<br /><br />首先,记住你无须在命令前面加:号,因为它是缺省就添加了的.<br /><br />"译注--以下是.exrc文件中的内容,为真实起见,而且事实上也相当浅显,我没有翻译其中的注释<br />" set wordwrap 9 characters from the right<br />set wm=9<br />" show matching parenthesis. When },), or ] is hit, show the opening<br />" {,(, or [ that matches it.<br />set sm<br />" set the shell to be /usr/local/bin/tcsh<br />set sh=/usr/local/bin/tcsh<br />" a few abbreviations<br />" this makes -l automatically become -Larry, and zidlle to be my<br />" name and email address.<br />ab zidlle E. Larry Lidz - <a href="mailto:ellidz@midway.uchicago.edu"><font color="#333333">ellidz@midway.uchicago.edu</font></a><br />ab -l -Larry<br />" uppercase V will run ispell -x (-x tells it not to save backups) on current<br />" file<br />map V :w<br />" K will center the line... (this doesn't work on SunOS -- ??)<br />map K :s/^[ ]*//<br />" v will reformat the current paragraph<br />map v {0!}fmt<br />" q runs a program to lock my terminal<br />map q :!lock2<br />" Splits a line in two at current cursor location, puts a &gt; at the<br />"beginning of the line - useful for Usenet/email<br />map g may0O`ay$:s/./ /g<br /><br />8.0 - vi的bug<br />我很想说vi中没有bug,但很不幸,它不是这样的. 这些bug都是初始版本vi中的,<br />它其他的一些变种就不一定有.<br />例如 _宏有时就运行的有问题.<br /><br />9.0 - 术语表<br />如果有人提议说某个术语他不明白,我们将更新这个术语表.如果你有什么建议,<br />请一定要告诉我.<br /><br />命令模式 command mode<br /><br />命令模式是说我们在此模式下面可以向vi发命令(包括光标移动,编辑命令等等)<br /><br />ed<br />UNIX里面一个非可视化的编辑器<br /><br />&lt;Esc&gt;<br />escape键. 键盘上标记为escape(ESC)的一个键.有时候^[可以起到相同的作用.<br />如果没有escape键,你可以试试Meta键<br />ex<br />UNIX下的一个编辑器.所有vi中的:命令都是送给它处理的<br /><br />插入模式 insert mode<br />插入模式是指我们可以在此模式下面键入文本.<br /><br />宏 macro<br />宏是一些键的组合起来的快捷方式.例如,某个宏允许我们只敲一个键就可以执行<br />好几个不同的命令.<br /><br />开放模式 open mode<br />开始模式是说vi启动的时候不能确定你的终端类型,或者它肯定你的是一个硬的或<br />电子管的终端<br /><br />正规表达式 regular expressions (RegEx)<br />正规表达式,通常缩写为"RegEx",是一些关键字的集合,它允许用户在查找的时候有更大的<br />控制力度. RegEx是在UNIX下面用的,但是在很多程序中也用到了它.<br /><br />sed<br />流-行式的编辑器.它没有界面,所有命令都是通过命令行的形式给出的.<br /><br />vi<br />就是这个FAQ讨论的编辑器</font> </p>
		http://www.sci.muni.cz/docs/Unix/vi.html<br />http://www.roxanne.org/vi.html<br /><img src ="http://www.cnitblog.com/charester/aggbug/20938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 20:36 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>建站技术之（六）-所有碰过“端口”这类问题的朋友，进来了解一下（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20936.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 12:11:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20936.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20936.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20936.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20936.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20936.html</trackback:ping><description><![CDATA[
		<font size="2">
				<font face="Arial">
						<span class="smalltxt">
								<span class="bold">◢◣所有碰过“端口”这类问题的朋友，进来了解一下◢◣</span>
						</span>
						<br />
						<br />
				</font>
		</font>
		<span style="FONT-SIZE: 12px">
				<font color="red">       很多很多很多很多的朋友打电话问我“为什么ftp登陆不了”“外面无法访问”“怎么映射端口”“内网如何映射”。<br />       而关于这类“射来射去”的问题，我已经回答很多次了，感谢你们的询问，我自己也提高不少。</font>
				<br />
				<br />
				<img src="http://forum.oray.net/images/smilies%20/redface.gif" align="absMiddle" border="0" />
				<br />
				<br />　　<b><font color="blue">到底什么是端口</font></b><br /><br />　　在网络技术中，端口的英文是Port，它有有两种解释：<br />        一是物理意义上的端口，比如，ADSL Modem、集线器、交换机、路由器用于连接其他网络设备的接口，如RJ-45端口、SC端口等等。<br />        二是逻辑意义上的端口，一般是指TCP/IP协议中的端口，端口号的范围从0到65535，比如用于浏览网页服务的80端口，用于FTP服务的21端口等等。我们这里将要介绍的就是逻辑意义上的端口。<br /><br />　　<font color="blue"><b>端口的分类</b></font><br /><br />　　逻辑意义上的端口有多种分类标准，下面将介绍两种常见的分类：<br /><br />　　1. 按端口号分布划分<br /><br />　　（1）知名端口（Well-Known Ports）<br /><br />　　知名端口即众所周知的端口号，范围从0到1023，这些端口号一般固定分配给一些服务。比如21端口分配给FTP服务，25端口分配给SMTP（简单邮件传输协议）服务，80端口分配给HTTP服务，135端口分配给RPC（远程过程调用）服务等等。<br /><br />　　（2）动态端口（Dynamic Ports）<br /><br />　　动态端口的范围从1024到65535，这些端口号一般不固定分配给某个服务，也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请，那么系统就可以从这些端口号中分配一个供该程序使用。比如1024端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后，就会释放所占用的端口号。<br /><br />　　不过，动态端口也常常被病毒木马程序所利用，如冰河默认连接端口是7626、WAY 2.4是8011、Netspy 3.0是7306、YAI病毒是1024等等。<br /><br />　　2. 按协议类型划分<br /><br />　　按协议类型划分，可以分为TCP、UDP、IP和ICMP（Internet控制消息协议）等端口。下面主要介绍TCP和UDP端口：<br /><br />　　（1）TCP端口<br /><br />　　TCP端口，即传输控制协议端口，需要在客户端和服务器之间建立连接，这样可以提供可靠的数据传输。常见的包括FTP服务的21端口，Telnet服务的23端口，SMTP服务的25端口，以及HTTP服务的80端口等等。<br /><br />　　（2）UDP端口<br /><br />　　UDP端口，即用户数据包协议端口，无需在客户端和服务器之间建立连接，安全性得不到保障。常见的有DNS服务的53端口，SNMP（简单网络管理协议）服务的161端口，QQ使用的8000和4000端口等等<br /><br />         <b><font color="blue">怎样去查看（找）端口呢？</font></b><br /><br />        <font color="red">提示：本人对Windows系统熟悉点，所以不阐述其它系统了！见谅！</font><br /><br />　　在Windows 2000/XP/Server 2003中要查看端口，可以使用Netstat命令：<br /><br />　　依次点击“开始→运行”，键入“cmd”并回车，打开命令提示符窗口。在命令提示符状态下键入“netstat -a -n”，按下回车键后就可以看到以数字形式显示的TCP和UDP连接的端口号及状态（如图）。<br /><br /><div class="smalltxt" style="FONT-WEIGHT: bold; MARGIN-LEFT: 2em">QUOTE:</div><div class="altbg2" style="BORDER-RIGHT: #ffffff 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #ffffff 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #ffffff 1px solid; WORD-BREAK: break-all; PADDING-TOP: 10px; BORDER-BOTTOM: #ffffff 1px solid">Microsoft Windows [版本 5.2.3790]<br />(C) 版权所有 1985-2003 Microsoft Corp.<br /><br />C:\Documents and Settings\Administrator&gt;netstat -a -n<br /><br />Active Connections<br /><br />  Proto  Local Address          Foreign Address        State<br />  TCP    0.0.0.0:21             0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:25             0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:110            0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:143            0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:366            0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:1025           0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:1026           0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:1027           0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:1040           0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:1045           0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:1863           0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:3000           0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:3004           0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:3389           0.0.0.0:0              LISTENING<br />  TCP    0.0.0.0:4449           0.0.0.0:0              LISTENING<br />  TCP    127.0.0.1:3001         0.0.0.0:0              LISTENING<br />  TCP    127.0.0.1:3002         0.0.0.0:0              LISTENING<br />  TCP    127.0.0.1:3003         0.0.0.0:0              LISTENING<br />  TCP    127.0.0.1:3009         127.0.0.1:3306         ESTABLISHED<br />  TCP    127.0.0.1:3306         127.0.0.1:3009         ESTABLISHED<br />  TCP    127.0.0.1:9189         0.0.0.0:0              LISTENING<br />  TCP    127.0.0.1:23883        0.0.0.0:0              LISTENING<br />  TCP    192.168.1.100:80       59.49.233.34:31456     ESTABLISHED<br />  TCP    192.168.1.100:80       61.141.167.189:1177    ESTABLISHED<br />  TCP    192.168.1.100:80       218.56.136.208:5285    ESTABLISHED<br />  TCP    192.168.1.100:80       221.237.165.17:1213    ESTABLISHED<br />  TCP    192.168.1.100:80       222.168.11.186:4422    ESTABLISHED<br />  TCP    192.168.1.100:139      0.0.0.0:0              LISTENING<br />  TCP    192.168.1.100:1038     222.47.205.27:5050     ESTABLISHED<br />  TCP    192.168.1.100:4079     219.136.252.79:80      ESTABLISHED<br />  TCP    192.168.1.100:4604     83.149.119.17:80       CLOSE_WAIT<br />  TCP    192.168.1.100:4605     83.149.119.17:80       CLOSE_WAIT<br />  TCP    192.168.1.100:4691     165.21.32.111:80       FIN_WAIT_1<br />  TCP    192.168.1.100:4694     165.21.32.104:80       FIN_WAIT_1<br />  UDP    0.0.0.0:161            *:*<br />  UDP    0.0.0.0:500            *:*<br />  UDP    0.0.0.0:1028           *:*<br />  UDP    0.0.0.0:1044           *:*<br />  UDP    0.0.0.0:3005           *:*<br />  UDP    0.0.0.0:3010           *:*<br />  UDP    0.0.0.0:3348           *:*<br />  UDP    0.0.0.0:3581           *:*<br />  UDP    0.0.0.0:3956           *:*<br />  UDP    0.0.0.0:3958           *:*<br />  UDP    0.0.0.0:4500           *:*<br />  UDP    0.0.0.0:4714           *:*<br />  UDP    0.0.0.0:27099          *:*<br />  UDP    0.0.0.0:29367          *:*<br />  UDP    0.0.0.0:29368          *:*<br />  UDP    127.0.0.1:123          *:*<br />  UDP    127.0.0.1:1037         *:*<br />  UDP    127.0.0.1:3006         *:*<br />  UDP    127.0.0.1:3363         *:*<br />  UDP    127.0.0.1:3551         *:*<br />  UDP    127.0.0.1:3600         *:*<br />  UDP    127.0.0.1:4321         *:*<br />  UDP    192.168.1.100:123      *:*<br />  UDP    192.168.1.100:137      *:*<br />  UDP    192.168.1.100:138      *:*<br />  UDP    192.168.1.100:17985    *:*<br />  UDP    192.168.1.100:17987    *:*<br /><br />C:\Documents and Settings\Administrator&gt;</div>这些，就是你的机器开放和正在使用的端口了！<br /><font color="green">（上面的具体参数是什么意思，我们后面再讲，这里不讲那么多，免得新手一下接受不了）</font><br /><br /><br /><font color="blue"><b><font size="4">不过这个操作命令我还是要解释一下，因为我自己也经常忘记</font></b></font><br /><font color="red"><b>Netstat命令</b></font><br /><br /><u>命令格式：Netstat -a -e -n -o -s<br /><br />　　－a 表示显示所有活动的TCP连接以及计算机监听的TCP和UDP端口。<br /><br />　　－e 表示显示以太网发送和接收的字节数、数据包数等。<br /><br />　　－n 表示只以数字形式显示所有活动的TCP连接的地址和端口号。<br /><br />　　－o 表示显示活动的TCP连接并包括每个连接的进程ID（PID）。<br /><br />　　－s 表示按协议显示各种连接的统计信息，包括端口号<br /><br /><br />netstat命令详解<br /><br /><br />Displays protocol statistics and current TCP/IP network connections.<br /><br />NETSTAT [-a] [-e] [-n] [-o] [-s] [-p proto] [-r] [interval]<br /><br />  nbsp;-a nbsp;           Displays all connections and listening ports.<br />  -e            Displays Ethernet statistics. This may be combined with the -s<br />                option.<br />  -n            Displays addresses and port numbers in numerical form.<br />  -o            Displays the owning process ID associated with each connection.<br />  -p proto      Shows connections for the protocol specified by proto; proto<br />                may be any of: TCP, UDP, TCPv6, or UDPv6.  If used with the -s<br />                option to display per-protocol statistics, proto may be any of:<br />                IP, IPv6, ICMP, ICMPv6, TCP, TCPv6, UDP, or UDPv6.<br />  -r            Displays the routing table.<br />  -s            Displays per-protocol statistics.  By default, statistics are<br />                shown for IP, IPv6, ICMP, ICMPv6, TCP, TCPv6, UDP, and UDPv6;<br />                the -p option may be used to specify a subset of the default.<br />  interval      Redisplays selected statistics, pausing interval seconds<br />                between each display.  Press CTRL+C to stop redisplaying<br />                statistics.  If omitted, netstat will print the current<br />                configuration information once.</u><br /><br />基本是这样了。<br /><br />    <font color="purple"><font size="4"><b>好了，基本上，你应该有些端口的概念了！接下来，让我们再来了解，什么叫《端口映射》</b></font></font><br /><br />          <b><font color="blue">1-为什么要映射：</font></b>如果你是ADSL、CABLE MODEM或光纤等宽带接入用户，想在网吧或公司内部建一个游戏服务器或WEB服务器，并且能够让互联网上的用户访问你的服务器，那么你就会遇到端口映射问题。 （举个简单例子：你爸上学校找你，来到学校大门却不知道你在哪个教室，这时候值班老师就带你爸爸来到你的教室----&gt;这个过程就如同“端口映射”）<br /><br />          <b><font color="red">2-怎样去映射：</font></b>通常情况下，路由器都有防火墙功能，互联网用户只能访问到你的路由器WAN口(接ADSL线口)，而访问不到内部服务器。要想让外面用户访问到服务器，那么你就要在路由器上做一个转发设置，也就是端口映射设置，让用户的请求到了路由器后，并能够到达游戏服务器或WEB服务器。这就是端口映射。<br />目前，所有的宽带路由器都有端口映射功能，只是各个路由器厂商所取功能名称不一样，有的叫虚拟服务器，有的叫NAT设置。。。<br />端口映射设置很简单，例如要映射一台IP地址为192.168.1.254的WEB服务器，只需把服务器的IP地址192.168.1.254和TCP端口80填入到路由器的端口映射表中就OK了，当然不同的服务有不同的端口，新手切勿乱改端口，避免造成冲突，这样的冲突故障一般情况下你是找不到原因的！<br /><br />         <b><font color="green">3-射完后，如何检测：</font></b>举个例子：WEB服务器应该是80端口映射，这时候，先放一个名为index.htm的静态页面，然后用你的ip或者域名输入到地址栏，回车，看看是否能正常访问！<br /><br /><span style="FONT-SIZE: 12px"><font face="黑体"><font size="4"><font color="blue">新手进阶：</font></font></font><br /><br />        <b><font color="blue">关闭/开启端口</font></b><br /><br />　　在介绍各种端口的作用前，这里先介绍一下在Windows中如何关闭/打开端口，因为默认的情况下，有很多不安全的或没有什么用的端口是开启的，比如Telnet服务的23端口、FTP服务的21端口、SMTP服务的25端口、RPC服务的135端口等等。为了保证系统的安全性，我们可以通过下面的方法来关闭/开启端口。<br /><br />　　<font color="red">关闭端口</font><br /><br />　　比如在Windows 2000/XP中关闭SMTP服务的25端口，可以这样做：首先打开“控制面板”，双击“管理工具”，再双击“服务”。接着在打开的服务窗口中找到并双击“Simple Mail Transfer Protocol （SMTP）”服务，单击“停止”按钮来停止该服务，然后在“启动类型”中选择“已禁用”，最后单击“确定”按钮即可。这样，关闭了SMTP服务就相当于关闭了对应的端口。<br /><br />　　<font color="red">开启端口</font><br /><br /><img src="http://forum.oray.net/images/smilies%20/wink.gif" align="absMiddle" border="0" /><br /><br />　　如果要开启该端口只要先在“启动类型”选择“自动”，单击“确定”按钮，再打开该服务，在“服务状态”中单击“启动”按钮即可启用该端口，最后，单击“确定”按钮即可。<br /><br />　　提示：在Windows 98中没有“服务”选项，你可以使用防火墙的规则设置功能来关闭/开启端口。<br /><br />　　<font color="red">21端口</font><br /><br />　　端口说明：21端口主要用于FTP（File Transfer Protocol，文件传输协议）服务，FTP服务主要是为了在两台计算机之间实现文件的上传与下载，一台计算机作为FTP客户端，另一台计算机作为FTP服务器，可以采用匿名（anonymous）登录和授权用户名与密码登录两种方式登录FTP服务器。目前，通过FTP服务来实现文件的传输是互联网上上传、下载文件最主要的方法。另外，还有一个20端口是用于FTP数据传输的默认端口号。<br /><br />　　在Windows中可以通过Internet信息服务（IIS）来提供FTP连接和管理，也可以单独安装FTP服务器软件来实现FTP功能，比如常见的FTP Serv-U。<br /><br />　　操作建议：因为有的FTP服务器可以通过匿名登录，所以常常会被黑客利用。另外，21端口还会被一些木马利用，比如Blade Runner、FTP Trojan、Doly Trojan、WebEx等等。如果不架设FTP服务器，建议关闭21端口。<br /><br />　　<font color="red">23端口</font><br /><br />　　端口说明：23端口主要用于Telnet（远程登录）服务，是Internet上普遍采用的登录和仿真程序。同样需要设置客户端和服务器端，开启Telnet服务的客户端就可以登录远程Telnet服务器，采用授权用户名和密码登录。登录之后，允许用户使用命令提示符窗口进行相应的操作。在Windows中可以在命令提示符窗口中，键入“Telnet”命令来使用Telnet远程登录。<br /><br />　　操作建议：利用Telnet服务，黑客可以搜索远程登录Unix的服务，扫描操作系统的类型。而且在Windows 2000中Telnet服务存在多个严重的漏洞，比如提升权限、拒绝服务等，可以让远程服务器崩溃。Telnet服务的23端口也是TTS（Tiny Telnet Server）木马的缺省端口。所以，建议关闭23端口。<br /><br />　　<font color="red">25端口</font><br /><br />　　端口说明：25端口为SMTP（Simple Mail Transfer Protocol，简单邮件传输协议）服务器所开放，主要用于发送邮件，如今绝大多数邮件服务器都使用该协议。比如我们在使用电子邮件客户端程序的时候，在创建账户时会要求输入SMTP服务器地址，该服务器地址默认情况下使用的就是25端口。<br /><br />        <b><font color="blue">端口漏洞：</font></b><br /><br />　　<font color="red">1. 利用25端口</font>，黑客可以寻找SMTP服务器，用来转发垃圾邮件。<br /><br />　　2. 25端口被很多木马程序所开放，比如Ajan、Antigen、Email Password Sender、ProMail、trojan、Tapiras、Terminator、WinPC、WinSpy等等。拿WinSpy来说，通过开放25端口，可以监视计算机正在运行的所有窗口和模块。<br /><br />　　操作建议：如果不是要架设SMTP邮件服务器，可以将该端口关闭。<br /><br />　　<font color="red">53端口</font><br /><br />　　端口说明：53端口为DNS（Domain Name Server，域名服务器）服务器所开放，主要用于域名解析，DNS服务在NT系统中使用的最为广泛。通过DNS服务器可以实现域名与IP地址之间的转换，只要记住域名就可以快速访问网站。<br /><br />　　<font color="red">端口漏洞</font>：如果开放DNS服务，黑客可以通过分析DNS服务器而直接获取Web服务器等主机的IP地址，再利用53端口突破某些不稳定的防火墙，从而实施攻击。近日，美国一家公司也公布了10个最易遭黑客攻击的漏洞，其中第一位的就是DNS服务器的BIND漏洞。 <br /><br />　　操作建议：如果当前的计算机不是用于提供域名解析服务，建议关闭该端口。<br /><br />　　<font color="red">67与68端口</font><br /><br />　　端口说明：67、68端口分别是为Bootp服务的Bootstrap Protocol Server（引导程序协议服务端）和Bootstrap Protocol Client（引导程序协议客户端）开放的端口。Bootp服务是一种产生于早期Unix的远程启动协议，我们现在经常用到的DHCP服务就是从Bootp服务扩展而来的。通过Bootp服务可以为局域网中的计算机动态分配IP地址，而不需要每个用户去设置静态IP地址。<br /><br />　　端口漏洞：如果开放Bootp服务，常常会被黑客利用分配的一个IP地址作为局部路由器通过“中间人”（man-in-middle）方式进行攻击。<br /><br />　　操作建议：建议关闭该端口。<br /><br />　　<font color="red">69端口</font><br />　　端口说明：69端口是为TFTP（Trival File Tranfer Protocol，次要文件传输协议）服务开放的，TFTP是Cisco公司开发的一个简单文件传输协议，类似于FTP。不过与FTP相比，TFTP不具有复杂的交互存取接口和认证控制，该服务适用于不需要复杂交换环境的客户端和服务器之间进行数据传输。<br /><br />　　端口漏洞：很多服务器和Bootp服务一起提供TFTP服务，主要用于从系统下载启动代码。可是，因为TFTP服务可以在系统中写入文件，而且黑客还可以利用TFTP的错误配置来从系统获取任何文件。<br /><br />　　操作建议：建议关闭该端口。<br /><br />　　<font color="red">79端口</font><br /><br />　　端口说明：79端口是为Finger服务开放的，主要用于查询远程主机在线用户、操作系统类型以及是否缓冲区溢出等用户的详细信息。比如要显示远程计算机<a href="http://www.abc.com/" target="_blank"><font color="#505050">www.abc.com</font></a>上的user01用户的信息，可以在命令行中键入“finger user01@<a href="http://www.abc.com/" target="_blank"><font color="#505050">www.abc.com</font></a>”即可。<br /><br />　　端口漏洞：一般黑客要攻击对方的计算机，都是通过相应的端口扫描工具来获得相关信息，比如使用“流光”就可以利用79端口来扫描远程计算机操作系统版本，获得用户信息，还能探测已知的缓冲区溢出错误。这样，就容易遭遇到黑客的攻击。而且，79端口还被Firehotcker木马作为默认的端口。<br /><br />　　操作建议：建议关闭该端口。<br /><br />　　<font color="red">80端口</font><br /><br />　　<font color="green">端口说明：80端口是为HTTP（HyperText Transport Protocol，超文本传输协议）开放的，这是上网冲浪使用最多的协议，主要用于在WWW（World Wide Web，万维网）服务上传输信息的协议。我们可以通过HTTP地址加“:80”（即常说的“网址”）来访问网站的，比如<a href="http://www.0755ok.com/" target="_blank"><font color="#505050">http://www.0755oK.Com:80</font></a>，因为浏览网页服务默认的端口号是80，所以只要输入网址，不用输入“:80”。<br /><br />　　端口漏洞：有些木马程序可以利用80端口来攻击计算机的，比如Executor、RingZero等。</font><br />　　操作建议：为了能正常上网冲浪，我们必须开启80端口。<br /><br />       <font color="red">99端口</font><br /><br />　　端口说明：99端口是用于一个名为“Metagram Relay”（亚对策延时）的服务，该服务比较少见，一般是用不到的。<br /><br />　　端口漏洞：虽然“Metagram Relay”服务不常用，可是Hidden Port、NCx99等木马程序会利用该端口，比如在Windows 2000中，NCx99可以把cmd．exe程序绑定到99端口，这样用Telnet就可以连接到服务器，随意添加用户、更改权限。<br /><br />　　操作建议：建议关闭该端口。<br /><br />　　<font color="red">109与110端口</font><br /><br />　　端口说明：109端口是为POP2（Post Office Protocol Version 2，邮局协议2）服务开放的，110端口是为POP3（邮件协议3）服务开放的，POP2、POP3都是主要用于接收邮件的，目前POP3使用的比较多，许多服务器都同时支持POP2和POP3。客户端可以使用POP3协议来访问服务端的邮件服务，如今ISP的绝大多数邮件服务器都是使用该协议。在使用电子邮件客户端程序的时候，会要求输入POP3服务器地址，默认情况下使用的就是110端口。<br /><br />       　　端口漏洞：POP2、POP3在提供邮件接收服务的同时，也出现了不少的漏洞。单单POP3服务在用户名和密码交换缓冲区溢出的漏洞就不少于20个，比如WebEasyMail POP3 Server合法用户名信息泄露漏洞，通过该漏洞远程攻击者可以验证用户账户的存在。另外，110端口也被ProMail trojan等木马程序所利用，通过110端口可以窃取POP账号用户名和密码。<br /><br />　　操作建议：如果是执行邮件服务器，可以打开该端口。<br /><br />　　<font color="red">111端口</font><br /><br />　　端口说明：111端口是SUN公司的RPC（Remote Procedure Call，远程过程调用）服务所开放的端口，主要用于分布式系统中不同计算机的内部进程通信，RPC在多种网络服务中都是很重要的组件。常见的RPC服务有rpc．mountd、NFS、rpc．statd、rpc．csmd、rpc．ttybd、amd等等。在Microsoft的Windows中，同样也有RPC服务。<br /><br />　　端口漏洞：SUN RPC有一个比较大漏洞，就是在多个RPC服务时xdr＿array函数存在远程缓冲溢出漏洞，通过该漏洞允许攻击者远程或本地获取root权限。<br /><br />　　<font color="red">113端口</font><br /><br />　　端口说明：113端口主要用于Windows的“Authentication Service”（验证服务），一般与网络连接的计算机都运行该服务，主要用于验证TCP连接的用户，通过该服务可以获得连接计算机的信息。在Windows 2000/2003 Server中，还有专门的IAS组件，通过该组件可以方便远程访问中进行身份验证以及策略管理。<br /><br />　　端口漏洞：113端口虽然可以方便身份验证，但是也常常被作为FTP、POP、SMTP、IMAP以及IRC等网络服务的记录器，这样会被相应的木马程序所利用，比如基于IRC聊天室控制的木马。另外，113端口还是Invisible Identd Deamon、Kazimas等木马默认开放的端口。<br /><br />　　操作建议：建议关闭该端口。<br /><br />　　<font color="red">119端口</font><br /><br />　　端口说明：119端口是为“Network News Transfer Protocol”（网络新闻组传输协议，简称NNTP）开放的，主要用于新闻组的传输，当查找USENET服务器的时候会使用该端口。<br /><br />　　端口漏洞：著名的Happy99蠕虫病毒默认开放的就是119端口，如果中了该病毒会不断发送电子邮件进行传播，并造成网络的堵塞。<br /><br />　　操作建议：如果是经常使用USENET新闻组，就要注意不定期关闭该端口。<br /><table style="TABLE-LAYOUT: fixed; WORD-WRAP: break-word" height="100%" cellspacing="0" cellpadding="0" width="100%" border="0"><tbody><tr><td valign="top"><a href="http://forum.oray.net/misc.php?action=viewratings&amp;tid=2991&amp;pid=12135" name="pid12135" alt="查看评分记录"></a><span class="smalltxt"><font size="2"><font face="Arial"><span class="bold">[广</span></font></font></span><hr style="COLOR: #acacac; HEIGHT: 1px" width="100%" /><span style="FONT-SIZE: 12px"><font color="red">135端口</font><br /><br />　　端口说明：135端口主要用于使用RPC（Remote Procedure Call，远程过程调用）协议并提供DCOM（分布式组件对象模型）服务，通过RPC可以保证在一台计算机上运行的程序可以顺利地执行远程计算机上的代码；使用DCOM可以通过网络直接进行通信，能够跨包括HTTP协议在内的多种网络传输。<br /><br />　　端口漏洞：相信去年很多Windows 2000和Windows XP用户都中了“冲击波”病毒，该病毒就是利用RPC漏洞来攻击计算机的。RPC本身在处理通过TCP/IP的消息交换部分有一个漏洞，该漏洞是由于错误地处理格式不正确的消息造成的。该漏洞会影响到RPC与DCOM之间的一个接口，该接口侦听的端口就是135。<br /><br />　　操作建议：为了避免“冲击波”病毒的攻击，建议关闭该端口。<br /><br />　　<font color="red">137端口</font><br /><br />　　端口说明：137端口主要用于“NetBIOS Name Service”（NetBIOS名称服务），属于UDP端口，使用者只需要向局域网或互联网上的某台计算机的137端口发送一个请求，就可以获取该计算机的名称、注册用户名，以及是否安装主域控制器、IIS是否正在运行等信息。<br /><br />　　端口漏洞：因为是UDP端口，对于攻击者来说，通过发送请求很容易就获取目标计算机的相关信息，有些信息是直接可以被利用，并分析漏洞的，比如IIS服务。另外，通过捕获正在利用137端口进行通信的信息包，还可能得到目标计算机的启动和关闭的时间，这样就可以利用专门的工具来攻击。<br /><br />　　操作建议：建议关闭该端口。<br /><br />　　<font color="red">139端口</font><br /><br />　　端口说明：139端口是为“NetBIOS Session Service”提供的，主要用于提供Windows文件和打印机共享以及Unix中的Samba服务。在Windows中要在局域网中进行文件的共享，必须使用该服务。比如在Windows 98中，可以打开“控制面板”，双击“网络”图标，在“配置”选项卡中单击“文件及打印共享”按钮选中相应的设置就可以安装启用该服务；在Windows 2000/XP中，可以打开“控制面板”，双击“网络连接”图标，打开本地连接属性；接着，在属性窗口的“常规”选项卡中选择“Internet协议（TCP/IP）”，单击“属性”按钮；然后在打开的窗口中，单击“高级”按钮；在“高级TCP/IP设置”窗口中选择“WINS”选项卡，在“NetBIOS设置”区域中启用TCP/IP上的NetBIOS。<br /><br />　　端口漏洞：开启139端口虽然可以提供共享服务，但是常常被攻击者所利用进行攻击，比如使用流光、SuperScan等端口扫描工具，可以扫描目标计算机的139端口，如果发现有漏洞，可以试图获取用户名和密码，这是非常危险的。<br /><br />　　操作建议：如果不需要提供文件和打印机共享，建议关闭该端口。<br /><br />　　<font color="red">143端口</font><br /><br />　　端口说明：143端口主要是用于“Internet Message Access Protocol”v2（Internet消息访问协议，简称IMAP），和POP3一样，是用于电子邮件的接收的协议。通过IMAP协议我们可以在不接收邮件的情况下，知道信件的内容，方便管理服务器中的电子邮件。不过，相对于POP3协议要负责一些。如今，大部分主流的电子邮件客户端软件都支持该协议。<br /><br />　　端口漏洞：同POP3协议的110端口一样，IMAP使用的143端口也存在缓冲区溢出漏洞，通过该漏洞可以获取用户名和密码。另外，还有一种名为“admv0rm”的Linux蠕虫病毒会利用该端口进行繁殖。<br /><br />　　操作建议：如果不是使用IMAP服务器操作，应该将该端口关闭。<br /><br />　　<font color="red">161端口</font><br /><br />　　端口说明：161端口是用于“Simple Network Management Protocol”（简单网络管理协议，简称SNMP），该协议主要用于管理TCP/IP网络中的网络协议，在Windows中通过SNMP服务可以提供关于TCP/IP网络上主机以及各种网络设备的状态信息。目前，几乎所有的网络设备厂商都实现对SNMP的支持。 <br /><br />　　在Windows 2000/XP中要安装SNMP服务，我们首先可以打开“Windows组件向导”，在“组件”中选择“管理和监视工具”，单击“详细信息”按钮就可以看到“简单网络管理协议（SNMP）”，选中该组件；然后，单击“下一步”就可以进行安装。<br /><br />　　端口漏洞：因为通过SNMP可以获得网络中各种设备的状态信息，还能用于对网络设备的控制，所以黑客可以通过SNMP漏洞来完全控制网络。<br /><br />　　操作建议：建议关闭该端口。<br /><br />　　<font color="red">443端口</font><br /><br />　　端口说明：443端口即网页浏览端口，主要是用于HTTPS服务，是提供加密和通过安全端口传输的另一种HTTP。在一些对安全性要求较高的网站，比如银行、证券、购物等，都采用HTTPS服务，这样在这些网站上的交换信息其他人都无法看到，保证了交易的安全性。网页的地址以https://开始，而不是常见的http://。<br /><br />　　端口漏洞：HTTPS服务一般是通过SSL（安全套接字层）来保证安全性的，但是SSL漏洞可能会受到黑客的攻击，比如可以黑掉在线银行系统，盗取信用卡账号等。<br /><br />　　操作建议：建议开启该端口，用于安全性网页的访问。另外，为了防止黑客的攻击，应该及时安装微软针对SSL漏洞发布的最新安全补丁。<br /><br />　　<font color="red">554端口</font><br /><br />　　端口说明：554端口默认情况下用于“Real Time Streaming Protocol”（实时流协议，简称RTSP），该协议是由RealNetworks和Netscape共同提出的，通过RTSP协议可以借助于Internet将流媒体文件传送到RealPlayer中播放，并能有效地、最大限度地利用有限的网络带宽，传输的流媒体文件一般是Real服务器发布的，包括有.rm、.ram。如今，很多的下载软件都支持RTSP协议，比如FlashGet、影音传送带等等。 <br /><br />　　端口漏洞：目前，RTSP协议所发现的漏洞主要就是RealNetworks早期发布的Helix Universal Server存在缓冲区溢出漏洞，相对来说，使用的554端口是安全的。<br /><br />　　操作建议：为了能欣赏并下载到RTSP协议的流媒体文件，建议开启554端口。<br /><br />　　<font color="red">1024端口</font><br />　　端口说明：1024端口一般不固定分配给某个服务，在英文中的解释是“Reserved”（保留）。之前，我们曾经提到过动态端口的范围是从1024～65535，而1024正是动态端口的开始。该端口一般分配给第一个向系统发出申请的服务，在关闭服务的时候，就会释放1024端口，等待其他服务的调用。<br /><br />　　端口漏洞：著名的YAI木马病毒默认使用的就是1024端口，通过该木马可以远程控制目标计算机，获取计算机的屏幕图像、记录键盘事件、获取密码等，后果是比较严重的。<br /><br />　　操作建议：一般的杀毒软件都可以方便地进行YAI病毒的查杀，所以在确认无YAI病毒的情况下建议开启该端口。<br /><br />　　<font color="red">1080端口</font><br /><br />　　端口说明：1080端口是Socks代理服务使用的端口，大家平时上网使用的WWW服务使用的是HTTP协议的代理服务。而Socks代理服务不同于HTTP代理服务，它是以通道方式穿越防火墙，可以让防火墙后面的用户通过一个IP地址访问Internet。Socks代理服务经常被使用在局域网中，比如限制了QQ，那么就可以打开QQ参数设置窗口，选择“网络设置”，在其中设置Socks代理服务。另外，还可以通过安装Socks代理软件来使用QQ，比如Socks2HTTP、SocksCap32等。<br /><br />　　端口漏洞：著名的代理服务器软件WinGate默认的端口就是1080，通过该端口来实现局域网内计算机的共享上网。不过，如Worm.Bugbear.B（怪物II）、Worm.Novarg.B（SCO炸弹变种B）等蠕虫病毒也会在本地系统监听1080端口，给计算机的安全带来不利。<br /><br />　　操作建议：除了经常使用WinGate来共享上网外，那么其他的建议关闭该端口。<br /><br />　　<font color="red">1755端口</font><br /><br />　　端口说明：1755端口默认情况下用于“Microsoft Media Server”（微软媒体服务器，简称MMS），该协议是由微软发布的流媒体协议，通过MMS协议可以在Internet上实现Windows Media服务器中流媒体文件的传送与播放。这些文件包括.asf、.wmv等，可以使用Windows Media Player等媒体播放软件来实时播放。其中，具体来讲，1755端口又可以分为TCP和UDP的MMS协议，分别是MMST和MMSU，一般采用TCP的MMS协议，即MMST。目前，流媒体和普通下载软件大部分都支持MMS协议。<br /><br />　　端口漏洞：目前从微软官方和用户使用MMS协议传输、播放流媒体文件来看，并没有什么特别明显的漏洞，主要一个就是MMS协议与防火墙和NAT（网络地址转换）之间存在的兼容性问题。<br /><br />　　操作建议：为了能实时播放、下载到MMS协议的流媒体文件，建议开启该端口。<br /><br />　　<font color="red">4000端口</font><br />　　端口说明：4000端口是用于大家经常使用的QQ聊天工具的，再细说就是为QQ客户端开放的端口，QQ服务端使用的端口是8000。通过4000端口，QQ客户端程序可以向QQ服务器发送信息，实现身份验证、消息转发等，QQ用户之间发送的消息默认情况下都是通过该端口传输的。4000和8000端口都不属于TCP协议，而是属于UDP协议。<br /><br />　　端口漏洞：因为4000端口属于UDP端口，虽然可以直接传送消息，但是也存在着各种漏洞，比如Worm_Witty.A（维迪）蠕虫病毒就是利用4000端口向随机IP发送病毒，并且伪装成ICQ数据包，造成的后果就是向硬盘中写入随机数据。另外，Trojan.SkyDance特洛伊木马病毒也是利用该端口的。<br /><br />　　操作建议：为了用QQ聊天，4000大门敞开也无妨。<br /><br />　　<font color="red">5554端口</font><br /><br />　　端口说明：在今年4月30日就报道出现了一种针对微软lsass服务的新蠕虫病毒——震荡波（Worm.Sasser），该病毒可以利用TCP 5554端口开启一个FTP服务，主要被用于病毒的传播。<br /><br />　　端口漏洞：在感染“震荡波”病毒后会通过5554端口向其他感染的计算机传送蠕虫病毒，并尝试连接TCP 445端口并发送攻击，中毒的计算机会出现系统反复重启、运行缓慢、无法正常上网等现象，甚至会被黑客利用夺取系统的控制权限。<br /><br />　　操作建议：为了防止感染“震荡波”病毒，建议关闭5554端口。<br /><br />　　<font color="red">5632端口</font><br /><br />　　端口说明：5632端口是被大家所熟悉的远程控制软件pcAnywhere所开启的端口，分TCP和UDP两种，通过该端口可以实现在本地计算机上控制远程计算机，查看远程计算机屏幕，进行文件传输，实现文件同步传输。在安装了pcAnwhere被控端计算机启动后，pcAnywhere主控端程序会自动扫描该端口。<br /><br />　　端口漏洞：通过5632端口主控端计算机可以控制远程计算机，进行各种操作，可能会被不法分子所利用盗取账号，盗取重要数据，进行各种破坏。<br /><br />　　操作建议：为了避免通过5632端口进行扫描并远程控制计算机，建议关闭该端口。<br /><br />　　<font color="red">8080端口</font><br /><br />　　端口说明：8080端口同80端口，是被用于WWW代理服务的，可以实现网页浏览，经常在访问某个网站或使用代理服务器的时候，会加上“:8080”端口号，比如<a href="http://www.0755ok.com:8080/" target="_blank"><font color="#505050">http://www.0755oK.Com:8080</font></a>。<br /><br />　　端口漏洞：8080端口可以被各种病毒程序所利用，比如Brown Orifice（BrO）特洛伊木马病毒可以利用8080端口完全遥控被感染的计算机。另外，RemoConChubo，RingZero木马也可以利用该端口进行攻击。 <br /><br />　　操作建议：一般我们是使用80端口进行网页浏览的，为了避免病毒的攻击，我们可以关闭该端口。<br /></span></td></tr></tbody></table></span></span>
<img src ="http://www.cnitblog.com/charester/aggbug/20936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 20:11 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>建站技术之（五）-路由器设置（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20934.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 12:05:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20934.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20934.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20934.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20934.html</trackback:ping><description><![CDATA[1、登陆路由器设置截面。方法：在IE里面输入路由器IP（相关默认IP请查询说明书），然后就会得到一个登陆窗口，并输入相关的用户名和密码便可登陆（默认的用户名和密码请查询相关说明书），<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank" pop="查看积分策略说明"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=606" target="_blank"><font color="#505050">1.jpg</font></a> (2005-10-15 12:15, 36.46 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/1_vyjmTlGkoAdj.jpg');}" src="http://forum.oray.net/attachments/1_vyjmTlGkoAdj.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br />成功登陆以后会出现以下画面<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=611" target="_blank"><font color="#505050">2.jpg</font></a> (2005-10-15 12:17, 181.03 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/2_KbvsSA4WzzEx.jpg');}" src="http://forum.oray.net/attachments/2_KbvsSA4WzzEx.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br />2、点击&lt;进阶设定&gt; -- &lt;虚拟服务器&gt;<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=608" target="_blank"><font color="#505050">3.jpg</font></a> (2005-10-15 12:15, 93.09 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/3_Vl1Q1339SH1W.jpg');}" src="http://forum.oray.net/attachments/3_Vl1Q1339SH1W.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br />3、然后点击 "Virtual Server FTP" 后面 &lt;编辑&gt;的图标<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=609" target="_blank"><font color="#505050">4.jpg</font></a> (2005-10-15 12:15, 43.85 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/4_QGGCiTt7Ib8g.jpg');}" src="http://forum.oray.net/attachments/4_QGGCiTt7Ib8g.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br />点击以后会在上面出现该选项的相关设置<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=610" target="_blank"><font color="#505050">5.jpg</font></a> (2005-10-15 12:15, 82.35 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/5_KA9you7Iu7Uk.jpg');}" src="http://forum.oray.net/attachments/5_KA9you7Iu7Uk.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br />4、  选择&lt;激活&gt;，然后填写相关设置。<br /><br />       名称：只是一个识别，可以进行个人爱好进行修改，也可不修改；<br /><br />      个人IP地址：填入您的内网IP最后一位，如192.168.82.10那么只需要输入10就可以了。<br /><br />      协议模式：可以选择TCP，UDP，BOTH，BOTH的意思就是包含TCP和UDP。<br /><br />      个人服务埠：服务器提供该服务的端口，如FTP默认的是21，WEB：80。<br /><br />     公用服务端口：外网访问该服务的端口。<br /><br />确认以后点击&lt;执行&gt;。<br /><br />同理可设置另外其他服务的端口。<br /><br />当整个端口影射设置完成以后，可以在外网（不同一个局域网内，可以叫朋友帮忙进行测试）使用Telnet ???.com 端口号进行测试，如对<a href="http://www.root.net/" target="_blank"><font color="#505050">www.Root.net</font></a>的WEB服务80端口检测，格式如下：<br />Telnet <a href="http://www.root.net/" target="_blank"><font color="#505050">www.Root.net</font></a> 80。<br /><br />注意：您的公用服务端口和个人服务埠可以设置为不一样，如有些地方的80端口被封，如果通过8080端口进行访问，那么在这里的个人服务埠仍然可以填写80， 公用服务端口填写8080，那么别人访问您公网IP8080端口的时候，就会自动转发到该内网IP服务器的80端口上。<br /><img src ="http://www.cnitblog.com/charester/aggbug/20934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 20:05 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>建站技术之（四）-如何在WIN2003 SERVER 防火墙中打开相关服务的端口（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20933.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 12:03:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20933.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20933.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20933.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20933.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20933.html</trackback:ping><description><![CDATA[如何在WIN2003 SERVER 防火墙中打开相关服务的端口<br /><br />1、打开&lt;控制面板&gt; -- &lt;网络连接&gt;<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank" pop="查看积分策略说明"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=612" target="_blank"><font color="#505050">1.jpg</font></a> (2005-10-15 13:53, 53.91 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/1_SOq2xzgTI1kA.jpg');}" src="http://forum.oray.net/attachments/1_SOq2xzgTI1kA.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br />2、双击打开&lt;本地连接&gt;，再打开&lt;属性&gt;<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=613" target="_blank"><font color="#505050">2.jpg</font></a> (2005-10-15 13:53, 50.24 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/2_dD24U0fZWm4O.jpg');}" src="http://forum.oray.net/attachments/2_dD24U0fZWm4O.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br />点击&lt;高级&gt;<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=614" target="_blank"><font color="#505050">3.jpg</font></a> (2005-10-15 13:53, 74.61 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/3_Iol8MeNQ9glt.jpg');}" src="http://forum.oray.net/attachments/3_Iol8MeNQ9glt.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br />点击&lt;设置&gt;<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=615" target="_blank"><font color="#505050">4.jpg</font></a> (2005-10-15 13:53, 62.21 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/4_GprCtyVGj9jg.jpg');}" src="http://forum.oray.net/attachments/4_GprCtyVGj9jg.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br />这样便进入了设置防火墙的界面。<br /><br />3、选择&lt;启动&gt;，在&lt;不允许例外&gt;上不要打勾。<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=616" target="_blank"><font color="#505050">5.jpg</font></a> (2005-10-15 13:53, 88.79 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/5_wxFwqaS9EDy1.jpg');}" src="http://forum.oray.net/attachments/5_wxFwqaS9EDy1.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br />4、选择&lt;例外&gt;，在这里便可以看到所有例外（可以通过防火墙进行访问）的服务。<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=620" target="_blank"><font color="#505050">6.jpg</font></a> (2005-10-15 14:04, 65.49 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/6_1jhUZ582Fd7q.jpg');}" src="http://forum.oray.net/attachments/6_1jhUZ582Fd7q.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br />5、点击&lt;添加端口&gt;，然后输入一个名称、端口、协议，&lt;确定&gt;就可以了。<br />如需要做WEB对外开放，使用的是80端口。<br />则输入名称WEB（用户可以随意填写，只作一个识别），端口填入80。<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=618" target="_blank"><font color="#505050">7.jpg</font></a> (2005-10-15 13:53, 42.88 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/7_7tP6st0iExzj.jpg');}" src="http://forum.oray.net/attachments/7_7tP6st0iExzj.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br />6、添加成功以后，就会在列表里面显示出来，并在前面自动打上勾，说明该策略目前是有效的。（如果把勾去掉，说明该策略目前无效。）<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=621" target="_blank"><font color="#505050">8.jpg</font></a> (2005-10-15 14:04, 65.84 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/8_c7HjJX4a9l1g.jpg');}" src="http://forum.oray.net/attachments/8_c7HjJX4a9l1g.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br /><br />注：如果是使用直接虚拟拨号的用户，请在该拨号连接上设置防火墙策略。<br /><img src ="http://www.cnitblog.com/charester/aggbug/20933.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 20:03 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20933.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>建站技术之（三）－Serv-U FTP文件服务器组建攻略（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20932.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 12:01:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20932.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20932.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20932.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20932.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20932.html</trackback:ping><description><![CDATA[
		<font size="2">
				<font face="Arial">
						<span class="smalltxt">
								<span class="bold">建站技术－Serv-U FTP文件服务器组建攻略</span>
						</span>
						<br />
						<br />
				</font>
		</font>
		<span style="FONT-SIZE: 12px">在所有的FTP服务器端软件中，ServU除了拥有其他同类软件所具备的大部分功能外，还支持断点续传、支持带宽限制、支持远程管理、支持远程打印、支持虚拟主机等，再加上良好的安全机制、友好的管理界面及稳定的性能，使它赢得了很高的赞誉，并被非常广泛地使用着。本文将从ServU的安装和设置方面入手，向你介绍这种优秀软件的最基本使用方法 。<br /><br />    一、ServU的基本情况<br /><br />    软件名称：ServU (共享软件，30天使用限制)<br />    运行环境：除Windows3.x之外的全系列版本Windows<br />    下载地址：<a href="http://www.servu.com/susetup1.exe(2.8M)" target="_blank"><font color="#505050">www.servu.com/susetup1.exe(2.8M)</font></a><br /><br />    二、ServU的安装和卸载<br /><br />    1.ServU的安装<br />    直接双击下载所得到的susetup1.exe文件即可开始安装工作。除了在出现使用协议那一步中需要先勾选中Ihavereadandaccepttheabovelicenseagreement(我已经阅读并接受以上协议)再按Next(下一步)按钮之外，其他均使用其默认选项即可。<br />    当安装完成后，系统将自动进入ServUAdministrator(以下简称“管理器”)的窗口，同时出现SetupWizard(安装向导)，此时就可以根据这个向导开始建立你的第一个FTP服务器了。<br /><br />    2.ServU的卸载<br />    选“开始→程序→ServUFTPServer”下的RemoveServU(卸载)，再根据需要按提示操作即可。<br /><br />    三、建立第一个FTP服务器<br /><br />    为了说明方便起见，笔者在这里假设你的本机IP地址是192.168.0.1，本机计算机名为WY，你想在自己的局域网中建立一个只允许匿名访问(Anonymous)的FTP服务器，匿名用户登录后进入的将是D:＼wy目录。<br />    在安装向导中，一般建议除了以下几个需要修改的地方之外，对于初学者来说，其他部分一律选其默认选项(直接按Next按钮)即可。<br />    1.当进行到有Anonymoushomedirectory(匿名用户的主目录)提示的一步时，单击其右侧的箱子图标选择好目标目录D:＼wy后再按Next(下一步)按钮继续。<br />    2.当进行到有Createnamedaccount(建立名字账户)提示的一步时，选中No(不)一项后再按Next(下一步)按钮继续。<br />    当配置完成后，即可以在管理器左边框架的Domains(域名)下看到有个WizardGeneratedDomain项，其下的Users(用户)中就包含了一个名为Anonymous的账户，此账户登录后的虚拟根目录(主目录)即为D:＼wy目录。<br />    此FTP服务器地址为192.168.0.1(或用此服务器的计算机名WY也可)，默认端口号为21，只允许用匿名账号Anonymous登录。<br /><br />    ServU安装向导主要内容详解<br />    1.IPaddress,leaveblankfordynamicorunknownIP(IP地址，如果是动态IP或不知道IP则保持为空)：此项需要填入你欲为此FTP服务器绑定的IP地址。除非你的计算机有多个固定的IP地址，并且你只想其中一个被FTP服务器所使用时，才需要在此地输入那个相应的IP地址；否则一般建议，不管你是否有固定的IP地址，都请保留此项为空。<br />    2.Domainname(域名)：此处填入你FTP服务器的域名。但域名是由DNS解析而不是由这里决定的，因此实际上你可以填入任意内容，比如像“我的第一个FTP服务器”这种对此FTP进行说明的文字。<br />    3.Installassystemservice(作为系统服务安装吗)：此项对于操作系统是WindowsNT/2000/XP的服务器有效。选择了Yes(是)，则ServU的FTP服务就会被添加到系统服务中(在“管理工具”下的“服务”中可以查看到)；选择了No(否)，则不会作为系统服务存在。如果你的FTP服务器是常年运行的，则建议选Yes(是)；如果只是需要时才运行，则建议选No(否)。<br />    4.Allowanonymousaccess(接受匿名登录吗)：如果你想让此FTP服务器接受匿名登录，则此处必须选择Yes(是)；否则选No(否)。<br />    5.Anonymoushomedirectory(匿名用户的主目录)：此处可设定匿名用户登录后其虚拟根目录在FTP服务器上的真实位置。<br />    6.Lockanonymoususersintotheirhomedirectory(将匿名用户锁定到其主目录吗)：如果选择Yes(是)，则匿名用户只能访问其主目录及以下的目录树；如果选择No(否)，则它还可以访问其主目录的同级或更高级的目录树。从安全角度考虑，一般建议选Yes(是)。<br />    7.Createnamedaccount(建立命名账户吗)：这里询问是否直接建立普通用户(相对匿名用户而言)账号。<br /><br />    四、常见基本操作<br /><br />    在根据安装向导建立好你的第一个FTP服务器后，只能实现ServU赋予的默认功能和权限，要真正让这个服务器能被你自己随心所欲地控制，则还需要经过以下后续操作。<br /><br />    1.客户端的连接<br />    在IE浏览器(InternetExplorer)中，客户端的访问格式为<a href="ftp://127.0.0.1/" target="_blank"><font color="#505050">ftp://127.0.0.1</font></a>，不需要输入用户名和密码；在DOS(或命令提示符)状态下，客户端的访问格式为ftpA127.0.0.1，也不需要输入用户名和密码；在专业的FTP客户端软件设置中，以CuteFTPVersion4.2中文版为例，在“站点管理器”的“FTP主机地址”处输入127.0.0.1，再选中“登录类型”下的“匿名连接”项即可，同样不需要输入用户名和密码。<br />    说明<br />    1.在以上客户端的连接中，IP地址127.0.0.1也可以用计算机名WY来代替。<br />    2.除了在ftpA127.0.0.1中的“A”一定要大写外，其他地方均不区分大小写。<br />    3.如果在DOS下用ftp127.0.0.1的格式进行登录，则需要输入匿名登录的用户名Anonymous，此时密码为空(直接回车)或为其他任意值。<br /><br />    2.对FTP用户的管理<br />    欲增加一个新用户(包括增加Anonymous用户)，则在管理器的左边框架中选中Users(用户)，然后单击右键，进入NewUser(新用户)，依次根据提示为它设置好UserName(用户名)、Password(密码)、Homedirectory(主目录)等即可完成。<br />    欲删除一个用户，则在此用户上单击右键，选DeleteUser(删除用户)即可。<br />    欲复制一个用户，则在此用户上单击右键，选CopyUser(复制用户)，则会多出一个名字如Copyofxxx格式的新用户，它除了用户名和原来的用户不同外，其他部分(包括密码、主目录、目录权限等等)均与之完全一致。<br />    欲暂时禁止一个用户的登录权限，只需先在左边框架中选中此用户，然后在右边框架中进入Account(账户)窗口，勾选中Disableaccount(禁止账户)即可。<br /><br />    3.对目录权限的管理<br />    在管理器左边框架中选中用户名，再在右边框架中进入DirAccess(目录存取)窗口，然后在列表中选中相应目录后，就可以在窗口的右侧更改当前用户对它的访问权限了。<br />    说明<br />    1.Read(读)：对文件进行读操作(复制、下载，不含查看)的权力。<br />    2.Write(写)：对文件进行写操作(上传)的权力。<br />    3.Append(附加)：对文件进行写操作和附加操作的权力。<br />    4.Delete(删除)：对文件进行删除(上传、更名、删除、移动)操作的权力。<br />    5.Execute(执行)：直接运行可执行文件的权力。<br />    6.List(列表)：对文件和目录的查看权力。<br />    7.Create(建立)：建立目录的权力。<br />    8.Remove(移动)：对目录进行移动、删除和更名的权力。<br />    9.Inherit(继承)：如勾选中此项，则以上设置的属性将对当前Path(目录)及其下的整个目录树起作用；否则就只对其当前Path(目录)有效。<br /><br />    4.增加虚拟目录<br />    比如匿名用户(Anonymous)的主目录为D:＼wy，想要能通过<a href="ftp://192.168.0.1/test" target="_blank"><font color="#505050">ftp://192.168.0.1/test</font></a>的格式能访问到在E:＼all＼nodisk中的内容，则需要为它添加虚拟目录。操作步骤如下：<br />    (1)在管理器左边框架中，选择Domains(域名)下的Settings(设置)，再在右边框架中转到General(常用)窗口。<br />    (2)单击Virtualpathmappings(虚拟目录映射)下的Add(增加)按钮，之后根据提示在Physicalpath(物理路径)下选择E:＼all＼nodisk，在MapPhysicalpathto(映射物理路径到)下选择D:＼wy，在mappedpathname(映射路径名)处输入test，即可添加此虚拟目录的映射记录。<br />    (3)最后在管理器的左边框架中选中Anonymous用户，再在右边框架中转到DirAccess(目录存取)窗口，按Add(添加)按钮将目录E:＼all＼nodisk增加到列表中去。</span>
		<br />
<img src ="http://www.cnitblog.com/charester/aggbug/20932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 20:01 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>建站技术之（二）- IIS服务器组建攻略</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20931.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 11:59:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20931.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20931.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20931.html#Feedback</comments><slash:comments>26</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20931.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20931.html</trackback:ping><description><![CDATA[
		<font size="2">
				<font face="Arial">
						<span class="smalltxt">
								<span class="bold">建站技术－ IIS服务器组建攻略</span>
						</span>
						<br />
						<br />
				</font>
		</font>
		<span style="FONT-SIZE: 12px">IIS（Internet Information Server，互联网信息服务）是一种Web（网页）服务组件，其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器，分别用于网页浏览、文件传输、新闻服务和邮件发送等方面，它使得在网络（包括互联网和局域网）上发布信息成了一件很容易的事。本文将向你讲述Windows 2000高级服务器版中自带的IIS 5.0的配置和管理方法。<br /><br />准备篇 IIS的添加和运行<br /><br />一、IIS的添加<br /><br />请进入“控制面板”，依次选“添加/删除程序→添加/删除Windows组件”，将“Internet信息服务（IIS）”前的小钩去掉（如有），重新勾选中后按提示操作即可完成IIS组件的添加。用这种方法添加的IIS组件中将包括Web、FTP、NNTP和SMTP等全部四项服务。<br /><br />二、IIS的运行<br /><br />当IIS添加成功之后，再进入“开始→程序→管理工具→Internet服务管理器”以打开IIS管理器，对于有“已停止”字样的服务，均在其上单击右键，选“启动”来开启。<br /><br /><br /><br />第一篇 IIS之Web服务器<br /><br />一、建立第一个Web站点<br /><br />比如本机的IP地址为192.168.0.1，自己的网页放在D:\Wy目录下，网页的首页文件名为Index.htm，现在想根据这些建立好自己的Web服务器。<br /><br />对于此Web站点，我们可以用现有的“默认Web站点”来做相应的修改后，就可以轻松实现。请先在“默认Web站点”上单击右键，选“属性”，以进入名为“默认Web站点属性”设置界面。<br /><br />1．修改绑定的IP地址：转到“Web站点”窗口，再在“IP地址”后的下拉菜单中选择所需用到的本机IP地址“192.168.0.1”。<br /><br />2．修改主目录：转到“主目录”窗口，再在“本地路径”输入（或用“浏览”按钮选择）好自己网页所在的“D:\Wy”目录。<br /><br />3．添加首页文件名：转到“文档”窗口，再按“添加”按钮，根据提示在“默认文档名”后输入自己网页的首页文件名“Index.htm”。<br /><br />4．添加虚拟目录：比如你的主目录在“D:\Wy”下，而你想输入“192.168.0.1/test”的格式就可调出“E:\All”中的网页文件，这里面的“test”就是虚拟目录。请在“默认Web站点”上单击右键，选“新建→虚拟目录”，依次在“别名”处输入“test”，在“目录”处输入“E:\All”后再按提示操作即可添加成功。<br /><br />南山5．效果的测试：打开IE浏览器，在地址栏输入“192.168.0.1”之后再按回车键，此时就能够调出你自己网页的首页，则说明设置成功！<br /><br /><br /><br />二、添加更多的Web站点<br /><br />1．多个IP对应多个Web站点<br /><br />如果本机已绑定了多个IP地址，想利用不同的IP地址得出不同的Web页面，则只需在“默认Web站点”处单击右键，选“新建→站点”，然后根据提示在“说明”处输入任意用于说明它的内容（比如为“我的第二个Web站点”）、在“输入Web站点使用的IP地址”的下拉菜单处选中需给它绑定的IP地址即可（如图1）；当建立好此Web站点之后，再按上步的方法进行相应设置。<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=181" target="_blank"><font color="#505050">1.gif</font></a> (2005-9-23 10:43, 22.41 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/1_O0DlcobyGqZN.gif');}" src="http://forum.oray.net/attachments/1_O0DlcobyGqZN.gif" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br /><br />2．一个IP地址对应多个Web站点<br /><br />当按上步的方法建立好所有的Web站点后，对于做虚拟主机，可以通过给各Web站点设不同的端口号来实现，比如给一个Web站点设为80，一个设为81，一个设为82……（如图2），则对于端口号是80的Web站点，访问格式仍然直接是IP地址就可以了，而对于绑定其他端口号的Web站点，访问时必须在IP地址后面加上相应的端口号，也即使用如“<a href="http://192.168.0.1:81/" target="_blank"><font color="#505050">http://192.168.0.1:81</font></a>”的格式。<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=182" target="_blank"><font color="#505050">2.gif</font></a> (2005-9-23 10:43, 34.07 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/2_knn7zC3nY6Sw.gif');}" src="http://forum.oray.net/attachments/2_knn7zC3nY6Sw.gif" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br /><br />很显然，改了端口号之后使用起来就麻烦些。如果你已在DNS服务器中将所有你需要的域名都已经映射到了此惟一的IP地址，则用设不同“主机头名”的方法，可以让你直接用域名来完成对不同Web站点的访问。<br />比如你本机只有一个IP地址为192.168.0.1，你已经建立（或设置）好了两个Web站点，一个是“默认Web站点”，一个是“我的第二个Web站点”，现在你想输入“<a href="http://www.enanshan.com/" target="_blank"><font color="#505050">www.enanshan.com</font></a>”可直接访问前者，输入“<a href="http://www.popunet.com/" target="_blank"><font color="#505050">www.popunet.com</font></a>”可直接访问后者。其操作步骤如下：<br /><br />（1）请确保已先在DNS服务器中将你这两个域名都已映射到了那个IP地址上；并确保所有的Web站点的端口号均保持为80这个默认值。<br /><br />（2）再依次选“默认Web站点→右键→属性→Web站点”，单击“IP地址”右侧的“高级”按钮，在“此站点有多个标识下”双击已有的那个IP地址（或单击选中它后再按“编辑”按钮），然后在“主机头名”下输入“<a href="http://www.enanshan.com/" target="_blank"><font color="#505050">www.enanshan.com</font></a>”再按“确定”按钮保存退出<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=183" target="_blank"><font color="#505050">3.gif</font></a> (2005-9-23 10:43, 43.94 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/3_RfjcUDUC0m8K.gif');}" src="http://forum.oray.net/attachments/3_RfjcUDUC0m8K.gif" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br /><br />（3）接着按上步同样的方法为“我的第二个Web站点”设好新的主机头名为“<a href="http://www.xxxx.com/" target="_blank"><font color="#505050">www.xxxx.com</font></a>”即可。<br /><br />（4）最后，打开你的IE浏览器，在地址栏输入不同的网址，就可以调出不同Web站点的内容了。<br /><br />3．多个域名对应同个Web站点<br /><br />你只需先将某个IP地址绑定到Web站点上，再在DNS服务器中，将所需域名全部映射向你的这个IP地址上，则你在浏览器中输入任何一个域名，都会直接得到所设置好的那个网站的内容。<br /><br /><br />三、对IIS服务的远程管理<br /><br />1．在“管理Web站点”上单击右键，选“属性”，再进入“Web站点”窗口，选择好“IP地址”。<br /><br />2．转到“目录安全性”窗口，单击“IP地址及域名限制”下的“编辑”按钮，点选中“授权访问”以能接受客户端从本机之外的地方对IIS进行管理；最后单击“确定”按钮。<br /><br />3．则在任意计算机的浏览器中输入如“<a href="http://192.168.0.1:3598/" target="_blank"><font color="#505050">http://192.168.0.1:3598</font></a>”（3598为其端口号）的格式后，将会出现一个密码询问窗口，输入管理员帐号名（Administrator）和相应密码之后就可登录成功，现在就可以在浏览器中对IIS进行远程管理了！在这里可以管理的范围主要包括对Web站点和FTP站点进行的新建、修改、启动、停止和删除等操作。<br /><br />四、本部分常见问题解答<br /><br />Q：在上文中所涉及到的网址中，有的加了“http://”，有的没加，这意味着什么呢？<br /><br />A：没有加“http://”部分的网址，说明其可加可不加；而加了“http://”部分的，则说明它必不可少！对于带端口号的网址则必须加；否则可省略。<br /><br />Q：对于上文中涉及到IP地址的网址，可否用比较“友好”的名称来代替呢？<br /><br />A：可以！它除了能够用IIS服务器所在的计算机名来代替之外，还可在DNS服务器中新建域名和相应IP地址的映射表，就也可以用域名来进行访问了！<br /><br />Q：我设置好了一个Web服务器，但是当我访问网页时，却出现密码提示窗口。这是为什么？<br /><br />A：访问Web站点时，出现密码提示窗口，一般来说有以下原因，请逐个去进行检查：<br /><br />1．所访问的网页文件本身加了密。比如“默认Web站点”原主目录“E:\Inetpub\wwwroot”下的首页文件“iisstart.asp”访问时就需要密码。<br /><br />2．没有设置允许匿名访问或作了不应该的改动。如图4所示，首先应确保已勾选中了“匿名访问”这一项；并且其下“编辑”中“匿名用户帐号”中“用户名”一项应为“IUSR_NODISK”（其中“NODISK”为计算机名）的格式；另外，还需要已勾选中“允许IIS控制密码”一项。<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=184" target="_blank"><font color="#505050">4.gif</font></a> (2005-9-23 10:43, 42.78 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/4_Q8cqZS41jDOl.gif');}" src="http://forum.oray.net/attachments/4_Q8cqZS41jDOl.gif" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><br /><br />3．你的目标目录被限制了访问权限。此项仅当该目录位于NTFS格式分区中时才可能出现。请在其上单击右键，选“属性”，再进入“安全”窗口，看列表中是不是默认的允许“Everyone”组完全控制的状态，如不是，请改回<br /><br /><br /><br /><img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" /><a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank"><font color="#505050">图片附件</font></a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=185" target="_blank"><font color="#505050">5.gif</font></a> (2005-9-23 10:43, 22.76 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/5_0vr8wMJmis7N.gif');}" src="http://forum.oray.net/attachments/5_0vr8wMJmis7N.gif" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /></span>
<img src ="http://www.cnitblog.com/charester/aggbug/20931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 19:59 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>建站技术之（一）- 通过D-LINK604路由器向互联网提供服务之一(ZT)</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20927.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 11:45:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20927.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20927.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20927.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20927.html</trackback:ping><description><![CDATA[
		<span style="FONT-SIZE: 12px">为了节省成本，不少企业和个人都采用多台内网计算机通过代理和网关路由共用一个公网IP上INTERNET的方法，这样就限制了在自己计算机上架设个人网站，要实现在这些用户端架设网站，最关键的一点是，怎样把多计算机的内网IP和一个他们唯一共享上网的IP进行映射！就象在局域网或网吧内一样，虽然你可以架设多台服务器和网站，但是对外网来说，你还是只有一个外部的IP地址，怎么样把外网的IP映射成相应的内网IP地址，这应该是内网的那台代理服务器或网关路由器该做的事。 <br /><br /><br />网络环境：通过D-LINK 604路由器进行拨号上网（ADSL），<br />系统平台：WINDOWS 2003CN SERVER + SP1<br /><br />一、建立WEB服务。<br /><br />二、建立FTP服务。<br /><br />三、设置防火墙。<br /><br />四、通过在D-LINK 604路由器上设置端口影射，向互联网提供服务。<br /><br />[<i> 本帖最后由 oray-LS 于 2005-10-16 11:31 编辑 </i>]</span>
		<br />
		<br />
		<img src="http://forum.oray.net/images/attachicons/image.gif" align="absMiddle" border="0" />
		<a title="查看积分策略说明" href="http://forum.oray.net/member.php?action=credits&amp;view=getattach" target="_blank">
				<font color="#505050">图片附件</font>
		</a>: <a class="bold" href="http://forum.oray.net/attachment.php?aid=638" target="_blank"><font color="#505050">Lan.jpg</font></a> (2005-10-16 11:08, 51.38 K)<br /><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.resized) this.style.cursor='hand';" onclick="if(!this.resized) {return false;} else {window.open('attachments/Lan_bAdz1aC2ZZSv.jpg');}" src="http://forum.oray.net/attachments/Lan_bAdz1aC2ZZSv.jpg" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='点击在新窗口查看全图\nCTRL+鼠标滚轮放大或缩小';}" border="0" /><br /><img src ="http://www.cnitblog.com/charester/aggbug/20927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 19:45 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关‘内网建站’的问题和原理 (路由器后建站、Web服务出现用户名密码提示)(ZT)</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20926.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 11:42:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20926.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20926.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20926.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20926.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20926.html</trackback:ping><description><![CDATA[
		<font size="2">
				<font face="Arial">
						<span class="smalltxt">
								<span class="bold">有关‘内网建站’的问题和原理 (路由器后建站、Web服务出现用户名密码提示)</span>
						</span>
						<br />
						<br />
				</font>
		</font>
		<span style="FONT-SIZE: 12px">近期许多的网友问，为什么按照ORAY.NET的示范流程设置WEB站点服务，然后运行花生壳使其状态为在线后，通过自己的域名访问出现登陆提示，或自己能访问而别人不能访问。导致这种现象的有多种的可能，在此将其原因简单的阐述一下，敬请遇到问题的网友细读以解决问题。<br /><br /><br />问题一，自己能通过域名访问网站，而别人无法通过域名来访问网站？<br />解释：此现象大多因在网络模块设置错误引起的。排错首先应从网络模块着手。<br />检查：<br /><br />1、系统防火墙（XP、2003等系统自动启用了网络防火墙，您需要将其关闭或设置相应的服务通讯规则）<br /><br />2、硬件防火墙。有条件的企业用户一般都会为网络增添硬件网络防火墙，单独的防火墙模块可为公司网络减少网络安全风险，而一般防火墙在没有设置规则时是禁止任何外网连接到防火墙内部的计算机，所以应当为其添加服务访问规则。<br /><br />客观问题解决：<br /><br />1、城域网。在我们过去的技术支持当中，曾经出现过城市内可以访问服务，而非本城市不可以访问服务的现象。此情况是城域网的网关设置了访问规则导致的，也就是说所搭建的服务只允许属于该城市的IP段或同一个ISP访问。上网用户没有办法向其他城市提供电子信息服务。<br /><br />2、ISP规则拦截。在广东的多个城市里面，大部分的ISP将访问方向为IN到用户的80端口拦截，但拦截的端口对象仅仅为WEB默认端口。如果遇到这种情况，那么您可以考虑在ORAY注册顶级域名，使用专业服务扩展功能，URL跳转功能能把访问域名默认的80端口自动跳转到其他服务端口。用户只需要把WEB服务的端口改成其他的，加上URL跳转功能即可解决问题。<br /><br /><br />问题二，自己或别人通过域名访问网站时出现用户名和密码？<br /><br />解释：由两种情况导致该情况发生<br /><br />1、        WEB服务根本没有搭建起来，其中导致的可能原因有WEB服务程序运行权限不足，或WEB站点目录权限不足。（WEB文件目录必须可以让WEB服务站点运行用户或WEB站点匿名用户进行访问，根据某些程序特点，还需要为目录或文件设置可写入或执行权限。在调试阶段建议把目录设置为EVERYONE全权控制，在服务建立后在把权限缩小）<br /><br />2、        提供服务的计算机通过没有做端口转发策略的路由上网。这是一个最多人遇到的问题，如果当前你通过路由器上网，由路由器获取公网IP地址，那么可能意味着路由器内的计算机不具有公网IP地址。当你的花生壳程序安装完成并在线、WEB服务也搭建好、网络防火墙也设置了相应的访问规则时，首先你要明白花生壳会获取你的公网IP地址绑定到所申请的固定域名，而INTERNET访问你公布的域名时首先会进行一个解析过程，也就是反过来把域名转换为IP地址，最终也是通过你上网的公网IP地址来进行服务的连接。既然INTERNET是访问公网IP，那么作为网管的你要准确地知道公网IP地址所在的设备在哪里，如果你不知道获得公网IP地址的设备在哪里，可以在CMD下敲入 IPCONFIG /ALL，其中DEFAULT GATEWAY（网关）极有可能是获得公网IP地址的设备（多层网络环境除外）。网关可能是一台路由器，也有可那是一台计算机。此时需要登陆到获得公网IP地址的设备上进行端口转发规则设置，赶快把公网所访问的服务端口（具体看你做什么服务了）转发到设备后面的计算机去，例如WEB服务使用的是80端口，那么把80端口设置规则映射到内网计算机的IP（例如192.168.1.2或10.0.1.2）。不同的路由软件有不同的设置方法，详细请移步到网络通讯区寻找答案。<br />设置完成后，赶快让你的朋友访问你的网站吧。但这里有一点需要注意，通过路由上网的服务器（服务器为内网IP地址）是无法通过域名或公网IP地址来访问自身的服务，因为在访问域名时，路由接收到来源为内网IP地址的数据包，它只认为这是一个公网有效的IP地址对其进行访问，所以路由会把应答请求回复到互联网的‘内网IP’去了，但一些路由会把其丢弃，或将其转发到内网去。在我们测试公司所销售的众多产品中只有寥寥几款路由器具此功能。<br /><br />如果你现在遇到上述的环境，而你的领导要求内网也必须通过域名来访问到网站，不成问题，给你三套方案：<br /><br />A．        赶快致电我们购买具有此功能的路由器，一劳永逸解决问题，呵呵。<br /><br />B．         在每个客户端中修改HOSTS文件指向，把对应域名的IP地址强制解析为指定的服  <br />务器内网IP地址。例如用记事本打开 c:\winnt\system32\drviers\ect\hosts，添加<a href="http://www.xxx..com/" target="_blank"><font color="#505050">www.xxx..com</font></a>  192.168.1.2 . （<a href="http://www.xxx.com/" target="_blank"><font color="#505050">WWW.XXX.COM</font></a>是在ORAY所申请的的域名，192.168.1.2是服务器内网IP地址，请根据实际情况修改）。<br />C．        在服务器上建立DNS服务器，增加主区域XXX.COM（在ORAY所申请的域名），添加A记录到内网服务器IP地址，然后通知所有的内网用户在上网网卡的TCP / IP属性中修改主DNS为内网服务器的IP地址。此方法有点劳师动众的感觉，不过也算是实际，第一可以解决掉内网访问域名的问题，第二不影响客户端上网。<br /><br /><br /><br />问题三，自己和别人都无法通过域名访问网站？<br /><br />解释：此现象在没有数据提供之前不好判断问题发生在网络模块或系统模块上，以下把多种的情况以及检查过程列出。<br /><br />检查：<br /><br />1、        首先判断系统是否存在问题，使用排除法查探当前的WEB端口是否有被打开。在CMD窗口下敲入telnet 127.0.0.1 80。如果端口有被打开，那么在输入命令后的窗口会跳转到另外一个没有任何返回的屏幕。如果无法打开，那么你需要阅读建站相关的文章重新建立服务。<br /><br />2、        第一步先解决了本地的80端口有被打开，那么我们继续测试外网是否访问服务器的80端口。换一种方式测试，从外网测试本地的80端口是否能被访问。从网卡的属性或花生壳3.0窗口中获得当前上网的公网IP地址。例如IP地址是 61.145.112.1，那么找一个其他地区正在上网的朋友，让他在CMD窗口下敲入telnet 61.145.112.1 80 ，同样结果和第一步一样，马上可以看到你的端口是否有被打开了。<br /><br />在本文中使用WEBS服务进行距离，实际上使用花生壳应用的不单单是WEBS，或者你可以利用花生壳搭建一个远程管理服务，若果你经常使用聊天工具，是否一直在忧心因经常异地登陆而导致聊天记录不全，或资料文件不统一，用花生壳搭建一个远程终端服务，无论在任何的地方只需要用服务指定客户端输入花生壳域名、登陆用户名、密码等，马上连接到现实的桌面工作。当你出差为客户安装一套软件进行示范，而客户没有所需要的系统以及相关资源时，使用‘远程桌面’连回单位的‘示范主机’马上让客户观摩你的精彩示范。当然，你也可以做一个FTP让朋友一起共享你收藏已久的精彩内容，或做一个REAL电台让自己当上主播？呵呵…</span>
		<br />
<img src ="http://www.cnitblog.com/charester/aggbug/20926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 19:42 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NAT外网访问内网方法,内网端口映射外网ip(ZT)</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20925.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Thu, 21 Dec 2006 10:44:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20925.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20925.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20925.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20925.html</trackback:ping><description><![CDATA[
		<h4>NAT外网访问内网方法,内网端口映射外网ip</h4>
		<p> </p>
		<p>由于公网IP地址有限，不少ISP都采用多个内网用户通过代理和网关路由共用一个公网IP上INTERNET的方法，这样就限制了这些用户在自己计算机上架设个人网站，要实现在这些用户端架设网站，最关键的一点是，怎样把多用户的内网IP和一个他们唯一共享上网的IP进行映射！就象在局域网或网吧内一样，虽然你可以架设多台服务器和网站，但是对外网来说，你还是只有一个外部的IP地址，怎么样把外网的IP映射成相应的内网IP地址，这应该是内网的那台代理服务器或网关路由器该做的事，对我们用私有IP地址的用户也就是说这是我们的接入ISP服务商（中国<font color="#3366cc">电信</font>、联通、网通、铁通等）应该提供的服务，因为这种技术的实现对他们来说是举手之劳，而对我们来说是比较困难的，首先得得到系统管理员的支持才能够实现。因为这一切的设置必须在代理服务器上做的。 <br /><br />要实现这一点，可以用Windows 2000 Server 的端口映射功能，除此之外Winroute Pro也具有这样的功能，还有各种<font color="#3366cc">企业</font>级的防火墙。而对于我们这些普通用户，恐怕还是用Windows 2000 Server最为方便。<br /><br />先来介绍一下NAT，NAT（网络地址转换）是一种将一个IP地址域映射到另一个IP地址域技术，从而为终端主机提供透明路由。NAT包括静态网络地址转换、动态网络地址转换、网络地址及端口转换、动态网络地址及端口转换、端口映射等。NAT常用于私有地址域与公用地址域的转换以解决IP地址匮乏问题。在防火墙上实现NAT后，可以隐藏受保护网络的内部拓扑结构，在一定程度上提高网络的安全性。如果反向NAT提供动态网络地址及端口转换功能，还可以实现负载均衡等功能。<br /><br />端口映射功能可以让内部网络中某台机器对外部提供WWW服务，这不是将真IP地址直接转到内部提供WWW服务的主机，如果这样的话，有二个蔽端，一是内部机器不安全，因为除了WWW之外，外部网络可以通过地址转换功能访问到这台机器的所有功能；二是当有多台机器需要提供这种服务时，必须有同样多的IP地址进行转换，从而达不到节省IP地址的目的。端口映射功能是将一台主机的假IP地址映射成一个真IP地址，当用户访问提供映射端口主机的某个端口时，服务器将请求转到内部一主机的提供这种特定服务的主机；利用端口映射功能还可以将一台真IP地址机器的多个端口映射成内部不同机器上的不同端口。 端口映射功能还可以完成一些特定代理功能，比如代理POP，SMTP，TELNET等协议。理论上可以提供六万多个端口的映射，恐怕我们永远都用不完的。<br /><br />一、下面来介绍一下通过NAT共享上网和利用NAT来实现端口映射。<font color="#f7f7f7">中国<font color="#3366cc">公务网</font> 2004-5-31 16:05:58</font><br />1、在Windows 2000 Server上，从管理工具中进入“路由和远程访问”（Routing and Remote Access）服务，在服务器上鼠标右击，－》“配置并启用路由和远程访问”<br /><br />2、点“下一步”<br /><br />3、选“Internet连接服务器”，让内网主机可以通过这台服务器访问Internet.<br /><br />（最好先配置好NAT共享，让内网主机可以正常上网，不然的话，配好端口映射后再来配置NAT共享就有点麻烦了，弄的不好NAT还共享不了。）<br />4、选“设置有网络地址转换（NAT）路由协议的路由器”，不要选“设置Internet连接共享(ICS)”.(ICS与NAT的区别在于使用的容易程度上，为了启用ICS，只需要选择一个复选框就可以了，而为了启用NAT，则需要更多的配置任务，此外，ICS用于小型网络上的原因还在于：针对内部主机，它需要有一个固定的IP地址范围；针对与外部网络的通信，它被限制在单个公共IP地址上；它只允许单个内部网络接口。)<br />5、先在此说一下我的网络情况：<br />Internet连接 192.200.200.3(也是个内部地址，没办法，铁通的网络不太好，网速不快，价钱又贵，我的命真苦啊)<br />宿舍内连接 192.168.0.1（宿舍里连有局域网，共4台电脑，其中一台上装了Sambar 5.1b5做的Web服务器，Web端口是80，待会就从外网（用192.200.200.55来替代）来访问这个192.168.0.2:80上的网页）<br /><br />这台NAT主机上开通了IIS 5.0，端口是80，用端口映射的办法把8081端口映射到内部主机192.168.0.2的80端口上。<br /><br />6、在“路由和远程访问服务器安装向导”中选“Internet连接”（就是连向Internet的那个连接），点“下一步”。<br /><br />7、选“完成”<br /><br />到此为止，NAT共享设置也就完成了，内部的主机也能上网了。内部主机的网络设置如下：<br /><br /><br />IP地址范围是912.168.0.2~192.168.0.254，子网掩码为255.255.255.0，网关为192.168.0.1，DNS为ISP给的地址，我们的是211.98.xxx.xxx<br /><br /><br /><br /><br />二、利用NAT来映射端口<br />1、添加NAT协议。右击“常规”，－》“新路由选择协议”<br /><br />2、在“新路由选择协议”中选择“网络地址转换（NAT）”，点击“确定”<br /><br />3、这样在“IP路由选择”中就多了一项“网络地址转换（NAT）”<br />4、右击“网络地址转换（NAT）”,添加“新接口”<br /><br />5、在“网络地址转换（NAT）的新接口”中选择“Internet连接”（也就是连向Internet的那个连接，可不要选错咯）<br /><br />6、在“网络地址转换-Internet连接属性”中选中“公用接口连接到Internet”，复选“转换TCP/UDP头（推荐）”<br /><br />7、在"地址池"选项表里添加你需要提供端口重定向的起始地址与结束地址.（也<br /><br />7、<br />就是你要拿出来搞端口映射的所有IP地址，一般情况下我们就一个IP地址，所以可以不用“地址池”不同之处后面再讲。这里假设有8个地址，设置如下：<br /><br />添好后是这样的：<br /><br />8、在"特殊端口"选项表里提供了你需要定向的<font color="#3366cc">数据</font>连接协议（是TCP还是UDP协议，如Web和FTP就是TCP协议的），选准后“添加”<br /><br />9、“添加特殊端口”，这里就是设置端口映射的核心了，把NAT主机的哪个端口映射到内网主机的哪个端口就在这里设置，由于设有“地址池”，所以可以在“公网地址”中添上“地址池”中的任一地址，这里添的是“192.200.200.3”，也就<br /><br />是我的地址，如果你在前面没有设置“地址池”，那么在这个选项页中“在此地址池项”为灰色不可选，你只能选“在此接口”，<br /><br />也就是你只有一个公网IP地址，这比较适合只有一个IP的朋友，可以不用“地址池”，何必做多余的设置呢？假如有问题的话，还不是自找麻烦。<br />“传入端口”就是别人从网外访问有公网IP的NAT服务器的端口，这里设的为8080。<br />“专用地址和传出地址”就是内部主机的IP地址和提供特殊服务的端口，这里是把192.200.200.3上的8080端口映射到192.168.0.2上的80端口。<br />这就是TCP协议端口的重定向，至于UDP的定向页差不多，下图就是添加端口映射后的情况。<br /><br /><br />四、测试结果<br />在192.200.200.55出测试了一下NAT主机上的Web服务器和内网中192.168.0.2上建的Web服务器，得出结果如下：（不好意思，中间改过一下端口号，192.200.200.3上的8081端口映射到192.168.0.2的80端口）</p>
<img src ="http://www.cnitblog.com/charester/aggbug/20925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-21 18:44 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>这个公司的制度比较牛—— 软媒电子科技开发（深圳）有限公司 (ZT)</title><link>http://www.cnitblog.com/charester/archive/2006/12/20/20867.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Wed, 20 Dec 2006 09:44:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/20/20867.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20867.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/20/20867.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20867.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20867.html</trackback:ping><description><![CDATA[
		<div class="postbody">可能大家都听说了吧？没听说不要紧自己看看，我用蓝字标出来重点了~~ <br /><br /><p class="MsoNormal" style="LINE-HEIGHT: 21pt; TEXT-ALIGN: center; mso-pagination: widow-orphan" align="center"><b><span style="FONT-SIZE: 18pt; FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt">行政人事</span></b><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><?xml:namespace prefix = o /?><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> </span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一、</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">查看办公室环境</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="TEXT-INDENT: 18.8pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="COLOR: black; FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">注意保持办公室的安静</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">，严格按照行政管理制度办理。</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> </span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">二、</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">查看考核人员前一天的考勤情况，这个工作最好在不是<span style="COLOR: black">交接班的时间</span>段里完成</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">,</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">在<span style="COLOR: black">“考核期工作报告表”</span>填写：</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="COLOR: #0000ff"><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">白班<span style="COLOR: #0000ff"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">时间：</span><span lang="EN-US" style="COLOR: black; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="COLOR: #0000ff"><span lang="EN-US" style="COLOR: black; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">8</span><span style="COLOR: black; FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">：</span><span lang="EN-US" style="COLOR: black; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">00 </span><span style="COLOR: black; FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">——</span><span lang="EN-US" style="COLOR: black; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">20</span><span style="COLOR: black; FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">：</span><span lang="EN-US" style="COLOR: black; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">00</span></span></span></span></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">晚班时间：</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">20</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">：</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">00</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">——</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">8</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">：</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">00</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">（第二天）</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p></span></span><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">迟到时间不超过</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">30</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">分钟为正常（用五号默认字），请假的填“请假”（红色字体），上下班没打卡的用填“上班没打卡”或“下班没打卡”（用粉紫色）</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> </span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">三、</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">办理考核期（接待报到人员）</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">1</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">报到人员来办理考核期手续，首先登记<span style="COLOR: black">报到人员姓名</span>和报到日期。在试卷文件夹中找出报到人员的试卷核对<span style="COLOR: black">报到人员姓名</span>和<span style="COLOR: black">职位</span>。</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">2</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">找出合同</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">, </span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">人事部与报到人员签订<span style="COLOR: black">考核合同</span>（一式两份，公司保留一份，该员工保留一份）、<span style="COLOR: black">签订中、英文保证书</span>（各一份，公司保留），从即日起开始</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">7</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">个工作日的考核。（<span style="COLOR: red">注：</span>小心不要把合同的原件拿给报到人员作答，以备没合同时复印用）</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">3</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">在合同书上“招聘方”和“甲方”填“软媒电子科技开发（深圳）有限公司”</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">,</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">“代表人”填写接待人员姓名，填上报到人员的职位</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">,</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">和每天上班</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">8</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">小时</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">,</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">“乙方”及“代表人”填写报到人员姓名，保证书上填报到人员姓名和身份证号码，然后请报到人员签名并核对。</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">4</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">登记报到人员资料后给<span style="COLOR: black">其安排考核期工作时间</span>，并将报<span style="COLOR: black">到人员资料</span>交给<span style="COLOR: black">网管</span>安排机位。</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">6、给每位报到考核人员发<span style="COLOR: black">打卡纸</span>，教会考核人员<span style="COLOR: black">打卡</span>，并提醒考核人员<span style="COLOR: black">每天上下班一定要打卡</span>。</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">6</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">在试卷上写明公司分配给报到人员的<span style="COLOR: black">邮箱地址</span>，注明<span style="COLOR: black">所属部门，<?xml:namespace prefix = st1 /?><st1:personname>网管部</st1:personname></span>网管部（网络维护）或软件设计，然后交给吕工。</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">7、考核人员安排好后，行政人员根据考核人员所选的部门给其发考核作业，并要求考核人员将每天完成的试题用公司公配的邮箱发Email到</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><a href="mailto:要求考核人员要将每天完成的试题用Email发到kaohe@duosoft.cn"><b><span style="COLOR: windowtext; LETTER-SPACING: 1pt; TEXT-DECORATION: none; text-underline: none">kaohe@duosoft.c</span></b><span style="COLOR: windowtext; LETTER-SPACING: 1pt; TEXT-DECORATION: none; text-underline: none">n</span></a><u><span style="COLOR: black"><span style="LETTER-SPACING: 1pt"> </span></span></u><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">7</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">考核期人员的管理按照考核期管理制度，每天查阅<span style="COLOR: black">考核期人员的打卡纸</span>，按照工作时间在<span style="COLOR: black">考核期人员工作表</span>里做好记录。每天都上传到中心文档。</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> </span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">四、</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">及时更新公司人员表</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">1</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">每天在行政部门“<span style="COLOR: black">公司人员表”里</span>登记当天来公司报到人员<span style="COLOR: black">的姓名</span>、<span style="COLOR: black">部门、电子邮箱、联系电话</span>、<span style="COLOR: black">报到日期。</span></span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">2</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">根据报到日期算出七个工作日结束，第八个工作日正式入职的日期用深蓝色字体填写；在网页上及时将请假人员的排班更改为红色字体。<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">3</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">每天到</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">192.168.8.8</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">的行政人事部里在“<span style="COLOR: black">员工档案</span>”文件查询当天的入职和离职情况，把入职人员的入职日期填到<span style="COLOR: black">“公司人员表”</span>表的入职时间一栏，把离职人员的离职时间填到<span style="COLOR: black">“公司人员表”</span>离职时间一栏<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> <o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">五、外出登记</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">凡是因公事而出门的员工都要到行政部填写外<span style="COLOR: black">“外出登记”</span>表。</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">1</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">、“日期”栏填办事当天日期，“出入时间”栏填办事当天的详细时间，如因其他原因而未及时填写的，可过后再补填，否则按缺勤处理。</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">2</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">、“姓名”和“签名”栏填写<span style="COLOR: black">办事人的姓名</span>。</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">3</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">、“外出地点及事由”栏填写<span style="COLOR: black">到了哪里办什么事。</span></span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> 六.停电说明</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">    凡是因创维物业通知停电.公司所有人员的上班考勤如下:</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">  1. <span style="COLOR: red">停电时间小于 3个小时</span>, 则公司人员照常上班.</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">  2. <span style="COLOR: red">停电时间大于 3个小时, </span>则全体人员休息,(另找一天补班).</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 12.5pt; TEXT-INDENT: -12.5pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: -1.0; mso-char-indent-size: 12.5pt"><span lang="EN-US" style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">  注:这里所说的公司人员只包括:<st1:personname>设计部</st1:personname>、<st1:personname>运营部</st1:personname>与<st1:personname>开发部</st1:personname>的人员,不包括网管部的人员.网管部在停电期间照常上班,等候来电.来电后使公司的所有服务器重新运转.</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">  七.购物说明</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 38.25pt; TEXT-INDENT: -20.25pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan; tab-stops: list 38.25pt; mso-list: l0 level1 lfo2"><span lang="EN-US" style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">1.<span style="FONT: 7pt 'Times New Roman'">    </span></span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">凡是在都都文具店购买办公用品，都先记帐，在对方记帐簿上签上购买人的姓名，回来后再在收入与支出登记簿上记录购物名称、日期、单价、数量、总额和购买人的姓名。到月底再与都都文具店结帐。结帐都是直接开支票拿到都都文具店。<span lang="EN-US"><o:p></o:p></span></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> <o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 37.5pt; TEXT-INDENT: -37.5pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: -3.0; mso-char-indent-size: 12.5pt"><span lang="EN-US" style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">   2. 在都都文具店以外购买或维修物品时，要求对方开发票，以备会计记帐，公司受理人员要填写一张“软媒公司物品购买（维修）验收单”。在付维修费或是付购买除都都文具店之外的东西时都得经吕工或是</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">Frank</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">同意后才能付。</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 37.5pt; TEXT-INDENT: -37.5pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: -3.0; mso-char-indent-size: 12.5pt"><span lang="EN-US" style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">   3. 在维修电脑的主板，CPU等部件时，应在指定的公司维修（一般是购买的那家公司：金世通电脑科技）.如果是属于保修期间内，则不需要付费.如果超出保修期，则根据实际情况定费用。</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">   </span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">八</span><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">.</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">邮件与快递</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 18.75pt; TEXT-INDENT: -18.75pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: -1.5; mso-char-indent-size: 12.5pt"><span lang="EN-US" style="LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">    <span style="mso-spacerun: yes">  </span></span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">信件要求每隔一天到一楼邮箱去取。</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">如果 是有关费用的，整理出来放到专有的文件袋里，到时一起交给会计作账。其它的由人事人员根据信件内容适当处理。</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN-LEFT: 18.75pt; TEXT-INDENT: -18.75pt; LINE-HEIGHT: 21pt; mso-pagination: widow-orphan; mso-char-indent-count: -1.5; mso-char-indent-size: 12.5pt"><span lang="EN-US" style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">   送快递可以直接打电话到最近的邮局（科技园邮局）要求其工作人员到公司来拿快递。</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span lang="EN-US" style="FONT-FAMILY: 宋体; LETTER-SPACING: 1pt; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">   邮局电话为：26504633</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="COLOR: #0000ff"><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">九．每天早</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">10</span><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">点前及下班前，各上传</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">1</span><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">次当日考勤记录。每天早</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">9</span><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">点前及下班前，各在</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">csdn</span><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">网站上</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">vc/MFC</span><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下基础类上发布招聘信息，然后再在非技术类里第</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">1</span><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页的所有帖子发完。依次类推，最后一直把</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">VC++</span><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">资源的第</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">1</span><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">页所有帖子发完.每天下班前都要把公司网站备份一次。</span></span></span></p><p class="MsoNormal" style="LINE-HEIGHT: 21pt; mso-pagination: widow-orphan"><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">十．每周未统计网络部，运营部积分记录</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">, </span><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">并及时刷新新各部门人员列表，包括为新加入该部门建立扣份记录的连接。每月</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">27</span><span style="FONT-FAMILY: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">日增加下个月的积分表</span><span lang="EN-US" style="mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p><p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">十一</span><span lang="EN-US">. </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">每天</span><span lang="EN-US">9</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">点以前使用</span><span lang="EN-US">RemoteAdmin</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">检查四个分区内，可连接的电脑数量是否足够。</span></p><p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">十二</span><span lang="EN-US">.</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">排班</span></p><p class="MsoNormal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">　　周一到周日的休息比例是如下：</span></p><p class="MsoNormal"><span lang="EN-US">30:20:15:15:10:5:5</span></p><p class="MsoNormal"><span style="COLOR: #0000ff; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">周六和周日普通员工都不休息，转正的人员及行政人员休息。</span></p>---------------------- <br />除了这个，还有呢~~ <br /><br /><br />运营部淘汰记录  　 　 <br />　 　 　 姓名 时间 淘汰原因 <br />郭利芳  9月10日 考核邮箱出现问题时,未及时向网络技术部报告,造成公司运营中断8小时,严重影响公司运营. <br />刘云  9月10日 考核邮箱出现问题时,未及时向网络技术部报告,造成公司运营中断8小时,严重影响公司运营. <br />谷小燕  9月10日 伪造审核开始结束时间，产品审核记录表中严重掺水。 <br />舒晨 9月24日 考核期人员作品没有打包上传的时间超过8小时，凡是涉及考核期人员工作问题都给予严重处理。 <br />陈小红 11月29日 不服从公司排班制度。 <br />李钢 12月3日 不服从公司工作安排 <br />赵佳佳 12月31日 假借发工资理由私自外出，与出纳在办公室以外集结交谈。 <br />于艳芝 元月3日 不填写外出登记表，私自外出。 <br /><span style="COLOR: #0000ff">邱占辉 元月6日 所有发送的面试结果通知,都没有保存到发件箱里。 </span><br />韩乐梅 元月12日 工作计划完成情况敷衍，不按时完成工作计划。 <br />彭灵丽 元月16日 周日值班1天内没有做任何事，包括考核期人员发来的考核结果检查。 <br /><span style="COLOR: #0000ff">余松 元月18日 几乎1整天都在研究asp，没有做公司的工作任务。 </span><br />欧阳立 3月14日 多次委托他人打卡并旷工，性质十分恶劣。 <br />朱春梅 3月14日 替他人打卡，违反了公司劳动纪律。 <br />吴志 3月20日 在试用期间工作不积极，不服从工作安排。 <br />[淘汰后多次来公司闹事而被保安赶走] <br />  <br />邓新文 3月22日 在试用期间工作不积极，不服从工作安排。 <br />吴日理 3月27日 入职时间较长，一直不能胜任数据设计工作。 <br />王林秀 3月31日 反抗公司的排班制度。 <br /><span style="COLOR: #0000ff">王灿 3月31日 3个人一起吃饭，有对抗公司的倾向。 <br />夏伟芳 3月31日 3个人一起吃饭，有对抗公司的倾向。 </span><br />[后来查出在负责财务工作期间，有包括擅自使用公章等多种越权行为] <br />  <br />李桂花 4月1日 与公司对抗，不服从公司管理。 <br />罗金秀 4月1日 与公司对抗，不服从公司管理。 <br />李庆风 4月1日 与公司对抗，不服从公司管理。 <br />王燕 4月1日 与公司对抗，不服从公司管理。[缓期执行1个月] <br />别翠 4月1日 与公司对抗，不服从公司管理。 <br />徐启祥 4月3日 企图格式化[FORMAT/Q]公司网站被当场发现。 <br />[目前此案已交高新园派出所处理] <br />  <br />韦兰凤 4月4日 旷工 <br /><span style="COLOR: #0000ff">曾琴 4月11日 对公司的赞美不合格。[缓期执行1个月] <br /></span><br /><br />还有呢~~不说了，自己上网查吧~~~林子真的大了，就是什么鸟都有~~~~ <br />放首页几小时，扩大一下影响力~~~下班回家撤到非技术区去~~~ </div>
<img src ="http://www.cnitblog.com/charester/aggbug/20867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-20 17:44 <a href="http://www.cnitblog.com/charester/archive/2006/12/20/20867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>按部就班——图解配置IIS5的SSL安全访问(ZT)</title><link>http://www.cnitblog.com/charester/archive/2006/12/20/20866.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Wed, 20 Dec 2006 09:23:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/20/20866.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20866.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/20/20866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20866.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20866.html</trackback:ping><description><![CDATA[
		<div class="postbody">
				<h1>
						<a name="_Toc91493867">
								<font color="#1d58d1">按部就班——图解配置IIS5的SSL安全访问</font>
						</a>
				</h1>
				<div>作者：mikespook</div>
				<div>版本：1.0</div>
				<div>最后更新：2004-12-22 16:04 </div>
				<div>按部就班——图解配置IIS5的SSL安全访问... 1 </div>
				<div>写在前面的... 1 </div>
				<div>第一步：       准备工作... 1 </div>
				<div>第二步：       IIS创建证书... 3 </div>
				<div>第三步：       向“证书颁发机构”申请证书... 8 </div>
				<div>第四步：       颁发证书... 10 </div>
				<div>第五步：       安装证书，配置SSL. 12 </div>
				<div>第六步：       完成... 14 </div>
				<div> </div>
				<h2>
						<a name="_Toc91493821">
						</a>
						<a name="_Toc91493868">
								<font color="#1d58d1">写在前面的</font>
						</a>
				</h2>
				<div>这几天自己的商城写完了，准备搞搞IIS5的SSL访问。查了一圈资料，发现多数文章都如出一辙。虽然写得很详细，但是东一榔头，西一棒槌，让我摸不着头脑。罢！罢！罢！直接看帮助，学着配吧。没想到顺利得很，一遍搞掂。就此写文一篇，以帮助跟我有一样困惑的朋友。</div>
				<div>在看本文之前我先和读者做一个约定。我假设你会使用鼠标和键盘，并且能够对Windows 2000 Server进行基本的操作（我只想在本文里说明如何配置IIS5的SSL安全访问，对于如何双击图标我不想涉及。）。同时你的计算机上也正确安装有IIS和浏览器（这个是Windows 2000 Server的标准配置，如果你使用的是Windows 2000 Professional版本就不用阅读本文了，因为这个版本不支持IIS的SSL访问。）。</div>
				<h3>
						<a name="_Toc91493822">
						</a>
						<a name="_Toc91493869">
								<font color="#1d58d1">第一步：    准备工作</font>
						</a>
				</h3>
				<div>首先你应该有一台你自己的计算机，而且需要有鼠标、键盘或者你能够从其他具有鼠标键盘的计算机访问它。不要拿东西扔我，多数服务器是没有鼠标和键盘的^_^。这台计算机应该安装有Windows 2000 Server或者Windows 2000 Advance Server。其他版本的Windows要么不支持IIS的SSL访问，要么就是跟本文讨论的配置方法有出入，比如Windows 2003的IIS6。</div>
				<div>然后就是需要检查你的计算机有没有安装“证书服务”，如果已经安装了该组件，你可以跳过本步骤。</div>
				<div>在“控制面板”à“添加/删除程序”中点击“添加/删除Windows组件”，找到“证书服务”，在其前面打钩。如图1。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-1.jpg" />图1 </div>
				<div>注意，这个服务有两个子选项“证书服务Web注册支持”和“证书服务颁发机构(CA)”。为了方便期间，这两个功能都需要安装。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-2.jpg" />图2。 </div>
				<div> </div>
				<div>点击下一步，“Windows组件向导”会引导你完成该服务的安装。在安装过程中会出现“证书颁发机构类型”的选择，这里务必要选择独立根（图3）。当然，如果你是在域中的话，请不要继续阅读。因为那需要创建的是企业根或者企业从属根。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-33.jpg" />图3 </div>
				<div>当完成了“证书服务” 的安装后，你的“控制面板”à“管理工具”中就会多出一个“证书颁发机构”这样一个图标。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-3.jpg" />图4 </div>
				<div>准备工作到此结束。</div>
				<h3>
						<a name="_Toc91493823">
						</a>
						<a name="_Toc91493870">
								<font color="#1d58d1">第二步：    IIS创建证书</font>
						</a>
				</h3>
				<div>完成了上面的准备，现在就可以让IIS来申请证书了。在“控制面板”à“管理工具”中进入“Internet 服务管理器”。鼠标右键点击你需要配置的站点，在弹出的菜单中选择“属性”（如果你跟我一样是左手使用鼠标，那就点击鼠标左键。）。这时就会打开如图5的“属性”对话框。在“目录安全性”中点击“服务器证书”按钮（图6）。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-4.jpg" />图5 </div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-5.jpg" />图6 </div>
				<div>这时就会有“IIS证书向导”来一步一步提示你完成证书的申请（图7）。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-6.jpg" />图7 </div>
				<div>点击“下一步”选择“创建一个新证书”并继续（图8）。需要说名的是另外两种方式“分配一个已存在的证书”和“从密钥管理器备份文件导入一个证书”也可以正确的配置IIS的SSL访问，但是和本问所讲顺序有所不同，这里不再赘述。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-7.jpg" />图8 </div>
				<div>继续创建证书，“选择现在准备请求，但稍后发送”。实际上你也只能选择这个选项，另外一个选项“立即发送请求到一个在线证书颁发机构”多数情况下不可用（图9）。我也没有查到在什么时候可用，什么时候不可用的资料。个人猜测大概是在安装“证书服务”的时候如果选择了XXXXXXXXXXXXX或XXXXXXXXXX，这里可能就可以直接申请。如果真是我猜测的这样，那后面那些麻烦的过程都可以略过不谈了。^_^</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-8.jpg" />图9 </div>
				<div>继续“下一步”，会要求你输入一个容易记忆的名称来标识你的证书。同时会要求你选择“位长”，实际上就是加密强度。“位长”越大，越安全。当然这是以牺牲性能为代价的（图10）。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-9.jpg" />图10 </div>
				<div>接下来是输入组织和部门，这个将会出现在你的证书中，并且当他人查看你的证书的时候会显示出来（图11）。最好还是使用合法的名称，别伪造别人的证书哦。比如我输入的组织是“mikespook &amp; swill”，部门因为是为我的商城申请的，所以我输入“XYShop”。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-10.jpg" />图11 </div>
				<div>在输入站点公用名称时要注意，最好是使用你将绑定的域名。否则在别人访问你的站点，弹出证书确认对话框时，会有一个名称不匹配的提示（图12）。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-11.jpg" />图12 </div>
				<div>接着是输入地理信息（图13）。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-12.jpg" />图13 </div>
				<div>最后一步就是将生成的证书保存下来，以备后用（图14、图15、图16）。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-13.jpg" />图14 </div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-14.jpg" />图15 </div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-15.jpg" />图16 </div>
				<div>这时在C盘根目录下就保存了一个由BASE64编码的证书文件certreq.txt。当然，如果你在保存证书（图14）的时候选择了其他路径，则有所不同了。</div>
				<h3>
						<a name="_Toc91493824">
						</a>
						<a name="_Toc91493871">
								<font color="#1d58d1">第三步：    向“证书颁发机构”申请证书</font>
						</a>
				</h3>
				<div>看到“证书颁发机构”不用紧张，我们不是要跟什么权威部门打交道，更不需要准备什么申请公文之类的烦琐文档。因为在第一步安装的“证书服务”就是我们的“证书颁发机构”。</div>
				<div>在浏览器中输入地址<a href="http://localhost/CertSrv/"><font color="#1d58d1">http://localhost/CertSrv/</font></a>会打开“Microsoft 证书服务”页面（图17）。选择申请证书，点击按钮“下一步”。 </div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-16.jpg" />图17 </div>
				<div>在“选择申请类型”的时候应该选择“高级申请”，以便导入在第二步时生成的IIS证书（图18）。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-17.jpg" />图18 </div>
				<div>因为在第二步保存的那个证书文件是BASE64编码的，所以我们应该选择“使用BASE64编码的PKCS #10文件提交一个证书申请，或使用BASE64编码的PKCS #7文件更新证书申请”（图19）。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-18.jpg" />图19 </div>
				<div>“CTRL+A”、“CTRL+C”、“CTRL+V”这是每个使用MS操作系统的人都该熟记于心的“宝典”。用此“宝典”将第二步中生成的那个文件的内容复制于图20所示文本框中。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-19.jpg" />图20 </div>
				<div>这时你就会收到“证书挂起”的通知，这就意味着你的证书已经被提交了（图21）。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-20.jpg" />图21 </div>
				<h3>
						<a name="_Toc91493825">
						</a>
						<a name="_Toc91493872">
								<font color="#1d58d1">第四步：    颁发证书</font>
						</a>
				</h3>
				<div>完成了申请证书，证书就被提交到了“证书颁发机构”。呵呵，赶紧自己给自己办法一个证书吧。</div>
				<div>进入“控制面板”à“管理工具”打开图3所示的“证书颁发机构”，打开左边的“证书颁发机构（本地）”那棵树，并找到“待定申请”（图22）。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-21.jpg" />图22 <br />查看右边的列表，刚才提交的证书申请赫然在目（图23）。还等什么？还不赶紧通过？ </div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-22.jpg" />图23 </div>
				<div>在待申请的证书上单击鼠标右键，弹出菜单中有“所有任务”一项，选择子项“颁发”。这时这个“待定申请”就会转移到“颁发的证书”下面。</div>
				<div>在“颁发的证书”下找到刚才那个证书，双击打开。并在“证书”à“详细信息”中选择“复制到文件”（图24）。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-24.jpg" />图24 </div>
				<div>在“证书导出向导”中，任意选择一种CER格式导出，比如“DER 编码二进制”（图25）。并保存成文件。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-25.jpg" />图25 </div>
				<div>OK，到此，我们又完成一个里程碑。^_^</div>
				<h3>
						<a name="_Toc91493826">
						</a>
						<a name="_Toc91493873">
								<font color="#1d58d1">第五步：    安装证书，配置SSL</font>
						</a>
				</h3>
				<div>现在回到IIS属性下面的那个“IIS证书向导”那里（忘了？看看图7）。这时的“下一步”已经变成了“挂起的证书请求”（图26）。自然是选择“处理挂起的请求，并安装证书”了。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-23.jpg" />图26 </div>
				<div>选择刚才在图22中导出的CER文件（图27）。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-26.jpg" />图27 <br />一路“下一步”完成证书的安装。这时证书就安装好了。 </div>
				<div>安装好证书之后原先不可以使用的“编辑”按钮被激活（图28），点击“编辑”按钮打开“安全通信”对话框。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-28.jpg" />图28 </div>
				<div>在“安全通信”对话框中将“申请安全通信（SSL）”前面的勾选中（图29）并确定。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-29.jpg" />图29 </div>
				<div>在IIS的属性对话框的“Web站点”下找到“SSL端口”，你会发现原先不可使用的文本框现在可以录入了。将文本框内容设置为433后“确定”（图30）。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-27.jpg" />图30 </div>
				<h3>
						<a name="_Toc91493827">
						</a>
						<a name="_Toc91493874">
								<font color="#1d58d1">第六步：    完成</font>
						</a>
				</h3>
				<div>现在你分别用http（图30）和https（图31）方式去访问你刚才配置过的站点，看看有什么不同。</div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-30.jpg" />图30 </div>
				<div>
						<img src="http://www.cnblogs.com/images/cnblogs_com/mikespook/未命名-31.jpg" />图31 </div>
				<div>恩，OK，完成了。只要你按部就班的如此操作，配置IIS的SSL访问易如反掌。呵呵~^_^</div>
		</div>
		<p class="postfoot"> </p>
<img src ="http://www.cnitblog.com/charester/aggbug/20866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-20 17:23 <a href="http://www.cnitblog.com/charester/archive/2006/12/20/20866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IIS使用指南之六 ：在IIS中部署HTTPS服务 (ZT)</title><link>http://www.cnitblog.com/charester/archive/2006/12/20/20842.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Wed, 20 Dec 2006 05:11:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/20/20842.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20842.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/20/20842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20842.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20842.html</trackback:ping><description><![CDATA[
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">在IIS中部署HTTPS服务非常简单，所需要的就是在Web服务器上具有服务器身份验证证书，并将证书绑定在Web站点。如果Web服务器属于活动目录并且活动目录中具有在线的企业证书颁发机构，则可以在配置过程中在线申请并自动安装Web服务器证书，否则你需要离线申请Web服务器证书。</font>
				<font face="Verdana">
						<p style="LINE-HEIGHT: 200%">申请Web服务器证书的步骤如下： 
</p>
						<p style="LINE-HEIGHT: 200%">在Web服务器上运行<b>管理工具</b>下的<b>Internet信息服务管理</b>控制台，在左面板展开<b>Web站点</b>节点，然后右击需要部署HTTPS服务的网站，在此我右击<b>默认网站</b>，选择<b>属性</b>； 
</p>
						<p style="LINE-HEIGHT: 200%">在<b>默认网站属性</b>对话框，点击<b>目录安全性</b>标签，然后点击<b>服务器证书</b>按钮； 
</p>
						<p style="LINE-HEIGHT: 200%" align="center">
								<img height="451" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl01.jpg" width="470" border="0" />
						</p>
						<p style="LINE-HEIGHT: 200%">在<b>欢迎使用Web服务器证书向导</b>页，点击<b>下一步</b>； 
</p>
						<p style="LINE-HEIGHT: 200%">在<b>服务器证书</b>页，选择<b>新建证书</b>，点击<b>下一步</b>；如果已经具有其他的服务器身份验证证书，则可以选择<b>分配现有证书</b>来将现有证书分配给此Web站点； 
</p>
						<p style="LINE-HEIGHT: 200%" align="center">
								<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl03.jpg" width="561" border="0" />
						</p>
						<p style="LINE-HEIGHT: 200%">　 
</p>
						<p style="LINE-HEIGHT: 200%">接下来的操作步骤我根据证书申请方式的不同，分别进行介绍： 
</p>
						<p style="LINE-HEIGHT: 200%">
								<b>
										<font color="#006699" size="4">在线申请证书</font>
								</b>
						</p>
						<p style="LINE-HEIGHT: 200%">在<b>延迟或立即请求</b>页，选择<b>立即将证书请求发送到联机证书颁发机构</b>，然后点击<b>下一步</b>； 
</p>
						<p style="LINE-HEIGHT: 200%" align="center">
								<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl04.jpg" width="561" border="0" />
						</p>
						<p style="LINE-HEIGHT: 200%">在<b>名字和安全性设置</b>页，在名称栏为新证书输入一个容易分辨的名字，然后点击<b>下一步</b>； 
</p>
						<p style="LINE-HEIGHT: 200%" align="center">
								<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl05.jpg" width="561" border="0" />
						</p>
						<p style="LINE-HEIGHT: 200%">在<b>单位信息</b>页，在<b>单位</b>和<b>部门</b>栏中分别输入相关信息，然后点击<b>下一步</b>； 
</p>
						<p style="LINE-HEIGHT: 200%" align="center">
								<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl06.jpg" width="561" border="0" />
						</p>
						<p style="LINE-HEIGHT: 200%">在<b>站点公用名称</b>页，输入Web站点的FQDN，这个名称将被用户用于访问这个站点，如果你输入的FQDN和用户访问所输入的FQDN不一致，那么在通过HTTPS连接此Web站点时会发生错误，在此我输入Web站点的FQDN <b>munich.winsvr.org</b>，然后点击<b>下一步</b>； 
</p>
						<p style="LINE-HEIGHT: 200%" align="center">
								<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl07.jpg" width="561" border="0" />
						</p>
						<p style="LINE-HEIGHT: 200%">在<b>地理信息</b>页，输入你的相关信息，然后点击<b>下一步</b>； 
</p>
						<p style="LINE-HEIGHT: 200%" align="center">
								<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl08.jpg" width="561" border="0" />
						</p>
						<p style="LINE-HEIGHT: 200%">在<b>SSL端口</b>页，输入你需要让客户用于访问此Web站点的HTTPS服务端口，建议你总是使用默认的<b>443</b>，点击<b>下一步</b>； 
</p>
						<p style="LINE-HEIGHT: 200%" align="center">
								<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl09.jpg" width="561" border="0" />
						</p>
						<p style="LINE-HEIGHT: 200%">在<b>选择证书颁发机构</b>页，如果你具有多个联机的证书颁发机构，在此可以选择向哪个发起证书申请。在此我接受默认的选择，然后点击<b>下一步</b>； 
</p>
						<p style="LINE-HEIGHT: 200%" align="center">
								<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl10.jpg" width="561" border="0" />
						</p>
						<p style="LINE-HEIGHT: 200%">在<b>证书请求提交</b>页回顾你的设置，然后点击<b>下一步</b>； 
</p>
						<p style="LINE-HEIGHT: 200%" align="center">
								<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl11.jpg" width="561" border="0" />
						</p>
						<p style="LINE-HEIGHT: 200%">最后，在<b>完成Web服务器证书向导</b>页，点击<b>完成</b>。此时，证书向导已经从联机证书颁发机构申请了一个Web服务器证书，你可以在<b>目录安全性</b>标签点击<b>查看证书</b>按钮来查看证书状态。 
</p>
						<p style="LINE-HEIGHT: 200%" align="center">
								<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl12.jpg" width="561" border="0" />
						</p>
						<p style="LINE-HEIGHT: 200%">
						</p>
				</font>
				<br />
		</p>
		<p style="LINE-HEIGHT: 200%">
				<b>
						<font color="#006699" size="4">离线申请证书</font>
				</b>
		</p>
		<p style="LINE-HEIGHT: 200%">如果活动目录中没有在线的企业证书颁发机构或者Web服务器并不位于活动目录环境中，那么你必须离线申请Web服务器证书。 
</p>
		<p style="LINE-HEIGHT: 200%">在<b>延迟或立即请求</b>页，选择<b>现在准备证书请求，但稍后发送</b>，然后点击<b>下一步</b>； 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl14.jpg" width="559" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">在<b>名字和安全性设置</b>页，在名称栏为新证书输入一个容易分辨的名字，然后点击<b>下一步</b>； 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl05.jpg" width="561" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">在<b>单位信息</b>页，在<b>单位</b>和<b>部门</b>栏中分别输入相关信息，然后点击<b>下一步</b>； 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl06.jpg" width="561" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">在<b>站点公用名称</b>页，输入Web站点的FQDN <b>munich.winsvr.org</b>，然后点击<b>下一步</b>； 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl07.jpg" width="561" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">在<b>地理信息</b>页，输入你的相关信息，然后点击<b>下一步</b>； 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl08.jpg" width="561" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">在<b>证书请求文件名</b>页，输入证书申请请求保存到的文件名，在此我接受默认设置c:\certreq.txt，点击<b>下一步</b>； 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="404" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl15.jpg" width="559" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">在<b>请求文件摘要</b>页回顾你的设置，然后点击<b>下一步</b>； 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="402" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl16.jpg" width="558" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">在<b>完成Web服务器证书向导</b>页，点击<b>完成</b>，此时，证书请求信息保存到了c:\certreq.txt文件中。 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="402" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl17.jpg" width="558" border="0" />
				<br />
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font size="2">
						<font face="Verdana">现在我们访问证书颁发机沟腤eb注册登录页面，如下图所示，</font>
						<font id="Zoom6" face="Verdana">点击<b>申请一个证书</b>链接；</font>
				</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="448" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl18.jpg" width="396" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font id="Zoom7" face="Verdana" size="2">然后点击<b>高级证书申请</b>链接；</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="326" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl19.jpg" width="372" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">然后再点击<b>使用 base64编码的CMC 或PKCS #10文件提高一个证书申请，或使用base64编码的PKCS#7文件续订证书申请</b>， 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="287" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl20.jpg" width="775" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">在<b>提交一个证书申请或续订申请</b>页，你可以点击<b>浏览要插入的文件</b>来插入前面保存的证书申请信息文件的内容，不过有时IE的安全设置会阻止这一行为，你可以打开证书申请信息文件，然后将所有内容复制到<b>保存的申请</b>文本框中，如下图所示，然后在<b>证书模板</b>栏选择<b>Web服务器</b>，再点击<b>提交</b>； 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="481" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl21.jpg" width="491" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">在此我的证书颁发机构设置为自动颁发证书，因此此时已经颁发了证书，如果证书颁发机构设置为手动颁发证书，那么你还需要在证书颁发机构管理控制台中手动颁发证书。点击<b>下载证书</b>链接，然后将证书保存在本地目录中。 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="344" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl22.jpg" width="414" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">　 
</p>
		<p style="LINE-HEIGHT: 200%">再次回到<b>Internet信息服务管理</b>控制台，右击<b>默认网站</b>，选择<b>属性</b>；在<b>默认网站属性</b>对话框，点击<b>目录安全性</b>标签，然后点击<b>服务器证书</b>按钮； 
</p>
		<p style="LINE-HEIGHT: 200%">在<b>欢迎使用Web服务器证书向导</b>页，点击<b>下一步</b>； 
</p>
		<p style="LINE-HEIGHT: 200%">在<b>挂起的证书请求</b>页，选择<b>处理挂起的请求并安装证书</b>，点击<b>下一步</b>； 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="401" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl23.jpg" width="560" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">在<b>处理挂起的请求</b>页，点击浏览选择刚才保存的证书文件，点击<b>下一步</b>； 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="401" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl24.jpg" width="560" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">在<b>SSL端口</b>页，接受默认的<b>443</b>，点击<b>下一步</b>； 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="403" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl09.jpg" width="561" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">在<b>证书摘要</b>页回顾你的设置，然后点击<b>下一步</b>； 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="404" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl26.jpg" width="558" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">在<b>完成Web服务器证书向导</b>页，点击<b>完成</b>。此时，证书已经安装完毕，另外在离线申请Web服务器证书时需要特别注意：<b>你必须将颁发证书的证书颁发机构的CA证书导入到本地计算机所信任的根证书颁发结构中，否则此证书无法使用</b>。在此由于我已经导入，所以不再进行这个操作。 
</p>
		<p style="LINE-HEIGHT: 200%">
				<br />
		</p>
		<p style="LINE-HEIGHT: 200%">
				<b>
						<font color="#006699" size="4">配置Web站点强制使用HTTPS服务</font>
				</b>
		</p>
		<p style="LINE-HEIGHT: 200%">当Web站点绑定服务器身份验证证书之后，已经可以通过HTTPS服务访问Web站点了。只是此时还允许通过未加密的HTTP服务访问Web站点，如果需要强制Web站点使用HTTPS服务，则进行以下配置： 
</p>
		<p style="LINE-HEIGHT: 200%">在网站属性的<b>目录安全性</b>标签中点击<b>安全通讯</b>框架中的<b>编辑</b>按钮； 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="453" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl27.jpg" width="471" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">在弹出的<b>安全通信</b>对话框上，勾选<b>要求安全通道（SSL）</b>，此时将强制只能使用HTTPS服务访问此Web站点；默认加密强度只有40位，如果你需要更高的加密强度则勾选<b>要求128位加密</b>，不过这也要求客户端浏览器支持128位加密； 
</p>
		<p style="LINE-HEIGHT: 200%">默认情况下<b>忽略客户端证书</b>，这允许用户不必提供用户证书就可以通过HTTPS连接到此Web站点，如果要让用户提供证书，请使用<b>接受客户证书</b>或<b>要求客户端证书</b>，其中后者要求客户必须具有用户证书才能通过HTTPS连接到此Web站点。 
</p>
		<p style="LINE-HEIGHT: 200%">另外你还可以<b>启用客户端证书映射</b>功能，它可以将用户证书映射到活动目录中的用户，从而根据用户访问网站时提供的证书自动识别用户。 
</p>
		<p style="LINE-HEIGHT: 200%">在此我仅强制用户只能使用HTTPS来访问此Web站点，因此只是勾选<b>要求安全通道（SSL）</b>和<b>要求128位加密</b>，然后点击两次<b>确定</b>回到<b>Internet信息服务</b>管理控制台。 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="384" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl28.jpg" width="409" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">我们首先通过<b>HTTP</b>来访问此Web站点试试，访问失败，提示要求必须通过安全通道查看， 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="319" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl29.jpg" width="518" border="0" />
		</p>
		<p style="LINE-HEIGHT: 200%">于是使用<b>HTTPS</b>来进行访问，访问成功，如下图所示，右下角的小锁标志代表是通过HTTPS进行的访问，将鼠标移动到它上面，可以看到现在的加密强度为<b>128</b>位。 
</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<img height="431" src="http://winsvr.org/pic/iis_enablessl/iis_enablessl30.jpg" width="599" border="0" />
		</p>
<img src ="http://www.cnitblog.com/charester/aggbug/20842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-20 13:11 <a href="http://www.cnitblog.com/charester/archive/2006/12/20/20842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IIS使用指南之五 ：深入理解Socket Pooling（套接字池） (ZT)</title><link>http://www.cnitblog.com/charester/archive/2006/12/20/20841.html</link><dc:creator>天空</dc:creator><author>天空</author><pubDate>Wed, 20 Dec 2006 05:09:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/20/20841.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20841.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/20/20841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20841.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20841.html</trackback:ping><description><![CDATA[
		<p style="LINE-HEIGHT: 200%" align="center">
				<b>
						<font face="Verdana" color="#003366" size="5">IIS使用指南之五 ：深入理解Socket Pooling（套接字池）</font>
				</b>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">可能很多朋友都遇到过这个现象：在启动IIS时，你会发现IIS会将Web站点中配置的服务端口（例如TCP 80）绑定在计算机的所有IP地址上，而不仅仅是分配给Web站点的IP地址，这是为什么呢？</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">这个特性称为<b>Socket Pooling（套接字池）</b>。<b>套接字（Socket ）</b>是IP地址和端口的组合，用于进行网络通讯，任何应用程序需要和网络上的其他应用程序进行通许时，必须具有相应的套接字，例如Web站点侦听客户的HTTP请求，那么它就绑定在相应的套接字（IP地址和端口，例如端口为标准的TCP 80）上。在IIS 4.0中，微软发现当多个Web站点分别通过不同的套接字绑定在不同的IP地址时，会占用较多的系统资源，于是在IIS 5.0中引入了<b>Socket Pool（套接字池）</b>这个概念，它的工作原理是这样的：IIS启动时会将所有Web站点配置的服务端口绑定在计算机的所有IP地址上（运行Netstat -ano可以看到，这些Web服务端口侦听的IP地址是代表所有IP地址的“<b>0.0.0.0</b>”），而不管这些IP地址是否分配给了这些Web站点，IIS把绑定的这些套接字称为<b>套接字池</b>；然后IIS再将套接字池中的套接字根据Web站点的配置分配到相应的Web站点，这样避免了不同Web站点占用不同IP地址的相同Web服务端口时需要不同的套接字，从而减少了系统资源的占用，提高了IIS的性能。</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">需要注意的是，<b>Web站点所分配的IP地址是从IIS的套接字池中进行再分配的</b>，因此你不能分配套接字池中不具有的IP地址给Web站点，这会导致Web站点无法工作。</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">IIS的所有组件均具有<b>Socket Pooling</b>特性。虽然这样提高了IIS的性能，但是也导致了其他应用程序不能再绑定端口到这些IP地址上。例如Web站点侦听TCP 80端口，那么IIS启动时会侦听所有IP地址上的TCP 80端口，此时如果在ISA防火墙中做Web服务发布，需要侦听相应的IP地址（例如外部接口的IP地址）上的TCP 80端口，那么ISA防火墙的端口绑定就会失败，因为IIS已经占用了这些端口。</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">在这篇文章中，我主要给大家介绍如何处理IIS 6中Web服务的Socket Pooling（套接字池）现象。注意我在此使用的是“<b>现象</b>”这个词，因为我觉得<b>Socket Pooling</b>并不是问题，虽然很多人都这样认为。如果你并没有其他应用程序需要占用IIS套接字池中的端口，你根本就不需要对Socket Pooling进行任何处理。</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">还记得在<a href="http://www.winsvr.org/info/info.php?sessid=&amp;infoid=37" target="_blank">IIS使用指南之一 ：IIS 6 新特性</a>一文中所描述的IIS 6的新架构吗？在IIS 5中，Socket Pooling是作为Metabase的一个可配置属性出现；而在IIS 6中是由HTTP.sys来侦听客户发送的HTTP请求，因此也是由它来处理<b>Socket Pool</b>。HTTP.sys使用一个<b>IP地址包含列表</b>来决定自己侦听HTTP请求的IP地址，在每次启动时读取此列表并依照此列表进行配置。默认情况下，此IP地址包含列表并不包含任何IP地址，因此HTTP.sys侦听本地计算机的所有IP地址。此IP地址包含列表不能通过IIS管理控制台或者修改Metabase.xml来进行配置，你必须通过微软提供的Windows支持工具<b>httpcfg</b>来配置。</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">httpcfg工具专用于HTTP.sys的配置，它作为Windows支持工具，附带在Windows Server 2003的安装光盘中。我们首先需要安装Windows支持工具，放入Windows Server 2003安装光盘，双击运行“光盘根目录\Support\Tools\”下的Support.msi文件，跟随提示进行安装。</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">
						<img height="286" src="http://winsvr.org/pic/iis_socketpooling/iis_socketpooling01.jpg" width="216" border="0" />
				</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">安装完成后点击<b>开始</b>、<b>所有程序</b>，指向<b>Windows Support Tools</b>，然后选择<b>Command Prompt</b>，此时即可运行httpcfg。</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">我在一台绑定了两个IP地址的Web服务器上给大家进行演示，如下图所示，Web服务器绑定了<b>10.1.1.9</b>、<b>10.1.1.10</b>这两个IP地址，IIS中的默认网站的Web服务端口是TCP 80，因此HTTP.sys侦听所有IP地址的80端口。</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">
						<img height="336" src="http://winsvr.org/pic/iis_socketpooling/iis_socketpooling02.jpg" width="627" border="0" />
				</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">现在我先查询一下HTTP.sys的IP地址包含列表，运行以下命令：</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">httpcfg query iplisten</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">如下图所示，返回的错误代码1168的含义是找不到匹配元素，这代表IP地址包含列表目前没有任何元素，因此HTTP.sys侦听本地计算机的所有IP地址。</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">
						<img height="105" src="http://winsvr.org/pic/iis_socketpooling/iis_socketpooling03.jpg" width="492" border="0" />
				</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">现在我们为IP地址包含列表添加一个IP地址，例如，我想让HTTP.sys只是侦听10.1.1.9这个IP地址，则运行以下命令：</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">httpcfg set iplisten -i 10.1.1.9</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">如下图所示，返回的错误代码0代表成功完成。因为HTTP.sys只是在启动时读取此IP地址包含列表，所以此时我们需要重启HTTP.sys。</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">
						<img height="118" src="http://winsvr.org/pic/iis_socketpooling/iis_socketpooling04.jpg" width="531" border="0" />
				</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">运行以下命令重启HTTP.sys：</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">net stop http /y</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">net start w3svc</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">如下图所示，HTTP.sys成功重启。</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">
						<img height="380" src="http://winsvr.org/pic/iis_socketpooling/iis_socketpooling05.jpg" width="426" border="0" />
				</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">再查询一下IP地址包含列表和HTTP.sys侦听Web服务的端口，如下图所示，已经修改为<b>10.1.1.9</b>了。</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">
						<img height="225" src="http://winsvr.org/pic/iis_socketpooling/iis_socketpooling06.jpg" width="667" border="0" />
				</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">
				</font>
				<br />
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">我们试着在IIS中为Web站点分配一个并未包含在HTTP.sys IP地址包含列表中的IP地址，例如<b>10.1.1.10</b>，</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">
						<img height="451" src="http://winsvr.org/pic/iis_socketpooling/iis_socketpooling07.jpg" width="471" border="0" />
				</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">此时，你会发现，此Web站点已经停止服务了，当你试着启动它时，错误提示<b>不能访问网络位置</b>。</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">
						<img height="304" src="http://winsvr.org/pic/iis_socketpooling/iis_socketpooling08.jpg" width="535" border="0" />
				</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">另外需要注意的是，如果你需要通过localhost来访问Web站点，那么你需要将环回IP地址127.0.0.1加入到IP地址包含列表中，如下图所示：</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">
						<img height="204" src="http://winsvr.org/pic/iis_socketpooling/iis_socketpooling09.jpg" width="553" border="0" />
				</font>
		</p>
		<p style="LINE-HEIGHT: 200%">　 
</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">最后，如果你想还原Socket Pool，则删除IP地址包含列表中的所有IP地址即可，运行以下命令：</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">httpcfg delete iplisten -i 127.0.0.1</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">httpcfg delete iplisten -i 10.1.1.9</font>
		</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">结果如下图所示，</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">
						<img height="350" src="http://winsvr.org/pic/iis_socketpooling/iis_socketpooling10.jpg" width="640" border="0" />
				</font>
		</p>
		<p style="LINE-HEIGHT: 200%">　 
</p>
		<p style="LINE-HEIGHT: 200%">
				<font face="Verdana">然后重启HTTP.sys即可。</font>
		</p>
		<p style="LINE-HEIGHT: 200%" align="center">
				<font face="Verdana">
						<img height="401" src="http://winsvr.org/pic/iis_socketpooling/iis_socketpooling11.jpg" width="624" border="0" />
				</font>
				<br />
				<br />
		</p>
<img src ="http://www.cnitblog.com/charester/aggbug/20841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">天空</a> 2006-12-20 13:09 <a href="http://www.cnitblog.com/charester/archive/2006/12/20/20841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>