<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Welcome to Radish Blog</title>
    <description></description>
    <link>http://lwg2001s.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>给控件做数字签名</title>
        <author>lwg2001s</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lwg2001s.javaeye.com">lwg2001s</a>&nbsp;
          链接：<a href="http://lwg2001s.javaeye.com/blog/205121" style="color:red;">http://lwg2001s.javaeye.com/blog/205121</a>&nbsp;
          发表时间: 2008年06月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我做了一个WebRtf的控件，主要是封装了RichtextBox控件，增加一些方法，如打印等，用来实现在Web上显示RTF文档的功能。 编译成WebRtf.ocx，在VB中测试成功，为了能在Web上使用，我们需要做两个工作：<br /><br />一是将其打包成Internet发布包 <br />二是将这个包进行数字签名 <br /><br />我一步一步抓图进行讲解，如果对于第一个部分你已经熟悉，可以直接略过进入第二部分，图上已经相当清楚，我只在必要的地方加一点描述。 <br /><br /><strong>一、将控件打包为Web发布包</strong><br /><br /><a href="http://www.mzwu.com/newpic/20071006/002.jpg" title="在新窗口打开图片" target="_blank"><img src="http://www.mzwu.com/newpic/20071006/002.jpg" border="0" alt="" width="550" /></a><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/003.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/004.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/005.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/006.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/007.jpg" border="0" alt="" /><br /><br />为了包文件的完整性，建议将所有的文件设置为"Include in this cab"，就是这个包里包含所有的依存文件，防止文件丢失导致控件不能正常运行 <br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/008.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/009.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/010.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/011.jpg" border="0" alt="" /><br /><br />OK,第一部分完成了，注意这个打包文件旁边还有个htm文件，这个可以用来参考作具体的WEB应用的 <br /></p>
<div class="UBBPanel">
<div class="UBBTitle"><img src="http://lwg2001s.javaeye.com/admin/blogs/images/code.gif" alt="程序代码" style="margin: 0px 2px -3px 0px;" /> 程序代码</div>
<div class="UBBContent">&lt;OBJECT ID="myDoc" <br />CLASSID="CLSID:753C5D11-7E87-4C54-B4E7-548F1251D7BA" <br />CODEBASE="WebRTF.CAB#version=1,0,0,7"&gt; <br />&lt;/OBJECT&gt;</div>
</div>
<p><br /><strong>二、生成证书文件</strong><br /><br />准备好工具包，微软的IE SDK里包含这些工具, <br />但是那个开发包太过庞大，而且操作起来也稍微得繁琐了一些，你只需要下载这么几个文件就可以了 <br />文中提到的数字签名工具包，请在此处下载<br /><a href="http://www.mzwu.com/newpic/20071006/SignTool.rar" target="_blank">http://www.mzwu.com/newpic/20071006/SignTool.rar</a> <br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/012.jpg" border="0" alt="" /><br /><br />进入DOS模式下该目录 <br />为了便于操作，建议你将这个工具包放在磁盘根目录下，目录名称起得简单些 <br />输入以下命令，生成一个名为babyt.cer的证书<br /></p>
<div class="UBBPanel">
<div class="UBBTitle"><img src="http://lwg2001s.javaeye.com/admin/blogs/images/code.gif" alt="程序代码" style="margin: 0px 2px -3px 0px;" /> 程序代码</div>
<div class="UBBContent">makecert /sv "BabytOk.PVK" /n "CN=Facesun.cn,E=Babyt-163-com,O=阿泰" babyt.cer</div>
</div>
<p><br />其中各参数的含义，使用 <br />makecert -? <br />makecert -! <br />可以获得详尽的帮助，在这里就不说了 <br /><br />在弹出的窗口输入密码保护你的证书，这个密码要在后面反复使用多次，所以要记住了<br /><br /><a href="http://www.mzwu.com/newpic/20071006/013.jpg" title="在新窗口打开图片" target="_blank"><img src="http://www.mzwu.com/newpic/20071006/013.jpg" border="0" alt="" width="550" /></a><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/014.jpg" border="0" alt="" /><br /><br />输入完成后界面上会提示Succeeded，在当前的目录下也生成了babyt.cer和babytOK.pvk两个文件<br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/015.jpg" border="0" alt="" /><br /><br /><strong>三、进行数字签名</strong><br /><br /><a href="http://www.mzwu.com/newpic/20071006/016.jpg" title="在新窗口打开图片" target="_blank"><img src="http://www.mzwu.com/newpic/20071006/016.jpg" border="0" alt="" width="550" /></a><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/017.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/018.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/019.jpg" border="0" alt="" /><br /><br /><a href="http://www.mzwu.com/newpic/20071006/020.jpg" title="在新窗口打开图片" target="_blank"><img src="http://www.mzwu.com/newpic/20071006/020.jpg" border="0" alt="" width="550" /></a><br /><br /><a href="http://www.mzwu.com/newpic/20071006/021.jpg" title="在新窗口打开图片" target="_blank"><img src="http://www.mzwu.com/newpic/20071006/021.jpg" border="0" alt="" width="550" /></a><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/022.jpg" border="0" alt="" /><br /><br /><a href="http://www.mzwu.com/newpic/20071006/023.jpg" title="在新窗口打开图片" target="_blank"><img src="http://www.mzwu.com/newpic/20071006/023.jpg" border="0" alt="" width="550" /></a><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/024.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/025.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/026.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/027.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/028.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/029.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/030.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/031.jpg" border="0" alt="" /><br /><br />至此，数字签名完成 <br />在DOS窗口下，输入<br /></p>
<div class="UBBPanel">
<div class="UBBTitle"><img src="http://lwg2001s.javaeye.com/admin/blogs/images/code.gif" alt="程序代码" style="margin: 0px 2px -3px 0px;" /> 程序代码</div>
<div class="UBBContent">chktrust.exe E:\myTest\08\Package\WebRTF.CAB </div>
</div>
<p><br />对我们的成果进行检验<br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/032.jpg" border="0" alt="" /><br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/033.jpg" border="0" alt="" /><br /><br />此时成功，对了，这个&ldquo;恭喜&rdquo;的红字是我做上去的，可别到时候这俩字出不来还觉得奇怪 <br />最后就是发布了 <br />将这两个文件拷贝到WEB目录下进行测试，出现证书安装提示后按是安装即可<br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/034.jpg" border="0" alt="" /><br /><br /><a href="http://www.mzwu.com/newpic/20071006/035.jpg" title="在新窗口打开图片" target="_blank"><img src="http://www.mzwu.com/newpic/20071006/035.jpg" border="0" alt="" width="550" /></a><br /><br />下面就是我的控件在WEB上正常显示的结果.<br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/036.jpg" border="0" alt="" /><br /><br />怎么样了,会了吗? <br /><br /><strong>Dnawo 2007-10-07补充：</strong><br /><br />1.MakeCert.exe生成的是测试证书，仅做测试用，使用时必须开启浏览器"对没有标记为安全的ActiveX控件进行初始化和脚本运行"和"下载未签名的ActiveX控件"，否则浏览器将阻止ActiveX的下载，并显示"windows 已经阻止此软件因为无法验证发行者"，点击开发商信息你会看到提示"由于当前的策略设置，该测试根不受信任；证书路径因此而终止&ldquo;。<br /><br /><img src="http://lwg2001s.javaeye.com/admin/blogs/newpic/20071006/037.gif" border="0" alt="" /><br /><br />需要CA证书的朋友可到<a href="http://www.ca365.com/" target="_blank">http://www.ca365.com/</a>申请，是免费的、使用期限为一年，申请后立刻得到证书。需要注意的是申请时要选择正确的电子证书用途，这边我们应选择"代码签名证书"！还要注意安装好证书后17步中应选择典型，就不会像22步中提示你要私钥文件！！<br /><br />使用不同的证书都需要安装相应的根证书，对于根证书没有集成在浏览器的证书须手动安装根证书！自动安装ca365根证书的方法见：<a href="http://www.ca365.com/handbook14.asp" target="_blank">http://www.ca365.com/handbook14.asp</a><br /><br />2.第14步后可以使用Cert2Spc.exe生成.spc文件，然后在第18步中使用它，生成命令为：Cert2Spc babyt.cer babyt.spc<br /><br />3.可以的话尽量加时间戳，它非常重要，添加时间戳后，即使您的代码签名证书已经过期，但由于您的代码是在证书有效期内签名的，则时间戳服务保证了此代码仍然可信，最终用户仍然可以放心下载，使得即使代码签名证书已经过期，您也无需重签和重新发布已经签名的代码。 <br /></p>
          <br/>
          <span style="color:red;">
            <a href="http://lwg2001s.javaeye.com/blog/205121#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 18 Jun 2008 14:17:56 +0800</pubDate>
        <link>http://lwg2001s.javaeye.com/blog/205121</link>
        <guid>http://lwg2001s.javaeye.com/blog/205121</guid>
      </item>
      <item>
        <title>关于Active控件的电子签名</title>
        <author>lwg2001s</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lwg2001s.javaeye.com">lwg2001s</a>&nbsp;
          链接：<a href="http://lwg2001s.javaeye.com/blog/203976" style="color:red;">http://lwg2001s.javaeye.com/blog/203976</a>&nbsp;
          发表时间: 2008年06月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;"><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 自己制作证书，客户端安装证书后就可以识别该控件。安装一遍后以后就不用安装了，所有的 </span></span><span style="font-size: 9pt; font-family: Verdana;">active </span><span style="font-size: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;"><span style="font-family: 宋体;">控件均可以使用此证书。证书的效果如图：</span></span>&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.evget.com/images/article/Snap2.jpg" height="316" alt="" width="502" /></p>
<p><span style="font-size: 9pt; font-family: Verdana;"></span></p>
<p><span style="font-family: 宋体;"><span style="font-size: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">证书的安装位置：</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.evget.com/images/article/Snap3.jpg" height="589" alt="" width="510" /></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;"><span style="font-size: 9pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">证书的制作以及控件打包过程，转载如下：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="font-size: 9pt; font-family: Verdana;">1</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">．</span><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">将 </span><span style="font-size: 9pt; font-family: Verdana;">ocx </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件以及第三方 </span><span style="font-size: 9pt; font-family: Verdana;">dll </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件打包成 </span><span style="font-size: 9pt; font-family: Verdana;">cab </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件：</span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: 9pt; font-family: Verdana;">Internet </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">软件分发单位是</span><span style="font-size: 9pt; font-family: Verdana;">&ldquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">软件包</span><span style="font-size: 9pt; font-family: Verdana;">&rdquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，它由包含</span><span style="font-size: 9pt; font-family: Verdana;">.INF </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件或软件分发</span><span style="font-size: 9pt; font-family: Verdana;">.OSD </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件（或两者都包括）的</span><span style="font-size: 9pt; font-family: Verdana;">.CAB </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件所组成。一个分发单位也可以包含软件组件，如</span><span style="font-size: 9pt; font-family: Verdana;">&nbsp; ActiveX &nbsp;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">控件</span><span style="font-size: 9pt; font-family: Verdana;">(.OCX)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">、</span><span style="font-size: 9pt; font-family: Verdana;">.DLL </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件、</span><span style="font-size: 9pt; font-family: Verdana;">.EXE </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件、</span><span style="font-size: 9pt; font-family: Verdana;">Java </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">类文件或小程序。当 </span><span style="font-size: 9pt; font-family: Verdana;">Web </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">页上 </span><span style="font-size: 9pt; font-family: Verdana;">OBJECT </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">元素的 </span><span style="font-size: 9pt; font-family: Verdana;">CODEBASE </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">特性引用包含</span><span style="font-size: 9pt; font-family: Verdana;">.INF </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件的</span><span style="font-size: 9pt; font-family: Verdana;">.CAB </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件时，</span><span style="font-size: 9pt; font-family: Verdana;">Internet Explorer </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">将自动把</span><span style="font-size: 9pt; font-family: Verdana;">.CAB </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件作为软件分发单位下载并安装，每次访问时还会自动检测版本并进行更新。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;"><span style="font-size: 9pt; font-family: Verdana;">INF </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件是一个文本文件，指定运行控件所需要下载或者呈交的文件</span><span style="font-size: 9pt; font-family: Verdana;">(</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">比如</span><span style="font-size: 9pt; font-family: Verdana;">.DLL </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">或者其它</span><span style="font-size: 9pt; font-family: Verdana;">.OCX)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">。一个</span><span style="font-size: 9pt; font-family: Verdana;">.INF </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件就捆绑了</span><span style="font-size: 9pt; font-family: Verdana;">.CAB </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">压缩文件所有的必须文件。</span><span style="font-size: 9pt; font-family: Verdana;"> </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">缺省情况下，与现有硬盘中文件版本号相同的文件不被下载。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">先自己写了一个 </span><span style="font-size: 9pt; font-family: Verdana;">inf </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件，其中信息包括将</span><span style="font-size: 9pt; font-family: Verdana;">.ocx </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件，以及相关的</span><span style="font-size: 9pt; font-family: Verdana;">.dll </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件打包，并下载到文件夹：</span><span style="font-size: 9pt; font-family: Verdana;">\WINDOWS\system32</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，详细标注如下：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">[version]&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">signature="$CHICAGO$"</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">AdvancedINF=2.0</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">[DefaultInstall]&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">CopyFiles=install.files</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">RegisterOCXs=RegisterFiles</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">[RInstallApplicationFiles]</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">CopyFiles=install.files</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">RegisterOCXs=RegisterFiles</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">[DestinationDirs]</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">install.files=11&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">[SourceDisksNames]&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">1=%DiskName%,TestCAB.CAB,1&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">[Add.Code]</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">pcpos.ocx=pcpos.ocx</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">Comm.dll=comm.dll</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">pcpos.dll=pcpos.dll</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">TCPCLNT.dll=TCPCLNT.dll</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">[install.files]</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">pcpos.ocx=pcpos.ocx</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">Comm.dll=comm.dll</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">pcpos.dll=pcpos.dll</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">TCPCLNT.dll=TCPCLNT.dll</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">[SourceDisksFiles]</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">pcpos.ocx=1</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">Comm.dll=1</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">pcpos.dll=1</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">TCPCLNT.dll=1</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">[pcpos.ocx]</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">file-win32-x86=thiscab&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">RegisterServer=yes&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">clsid={719A1D6E-7099-4123-9D63-F0118AFF2D61}&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">DestDir=11&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">FileVersion=1,0,0,1</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">[Comm.dll]</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">file-win32-x86=thiscab&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">RegisterServer=yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">DestDir=11&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">FileVersion=1,0,0,1 </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">[pcpos.dll]</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">file-win32-x86=thiscab&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">RegisterServer=yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">DestDir=11&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">FileVersion=1,0,0,1 </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">[TCPCLNT.dll]</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">file-win32-x86=thiscab&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">RegisterServer=yes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">DestDir=11&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">FileVersion=1,0,0,1</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">[RegisterFiles]&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">%11%\pcpos.ocx</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">注释：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">"thiscab" </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">是一个关键字，意指包含该 </span><span style="font-size: 9pt; font-family: Verdana;">INF </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">的 </span><span style="font-size: 9pt; font-family: Verdana;">CAB </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件。也可以从网上下载所需要的 </span><span style="font-size: 9pt; font-family: Verdana;">DLL </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件，只要指定一个 </span><span style="font-size: 9pt; font-family: Verdana;">HTTP&nbsp; </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">网址即可，如：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">关键字</span><span style="font-size: 9pt; font-family: Verdana;">"file-win32-x86" </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">指定平台是</span><span style="font-size: 9pt; font-family: Verdana;">&nbsp; x86</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件版本号可见属性。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">"DestDir"</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">指的是装载目录或者文件的地址</span><span style="font-size: 9pt; font-family: Verdana;">: 11 </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">指定为系统目录 </span><span style="font-size: 9pt; font-family: Verdana;">&nbsp;WINDOWS/ /SYSTEM32;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">"clsid" </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">指的是要安装控件的 </span><span style="font-size: 9pt; font-family: Verdana;">CLSID</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">制作 </span><span style="font-size: 9pt; font-family: Verdana;">cab</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">使用</span><span style="font-size: 9pt; font-family: Verdana;">\WINDOWS\system32\iexpress.exe</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">选择</span><span style="font-size: 9pt; font-family: Verdana;">&ldquo;Create new Self Extraction Directive file&rdquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，点击下一步。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">选择</span><span style="font-size: 9pt; font-family: Verdana;">&ldquo;Create compressed files only(ActiveX Installs)&rdquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，点击下一步。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">点击</span><span style="font-size: 9pt; font-family: Verdana;">Add</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，文件添加（</span><span style="font-size: 9pt; font-family: Verdana;">pcpos.ocx,pcpos.dll,comm.dll,tcpclnt.dll</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">），点击下一步。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">点击</span><span style="font-size: 9pt; font-family: Verdana;">Browse</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，输入</span><span style="font-size: 9pt; font-family: Verdana;">.CAB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件的存放地址（包含所取文件名），这里取 </span><span style="font-size: 9pt; font-family: Verdana;">TestCAB.CAB,</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">并且要选中</span><span style="font-size: 9pt; font-family: Verdana;"> &ldquo;Store files using Long File Name inside Package&rdquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">。点击下一步。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">选择</span><span style="font-size: 9pt; font-family: Verdana;">&ldquo;Don&rsquo;t save&rdquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，一直点击下一步，直到完成。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">注意：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">如果控件已经在客户机注册，并且不是通过</span><span style="font-size: 9pt; font-family: Verdana;">.CAB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">的方式注册，那么通过</span><span style="font-size: 9pt; font-family: Verdana;">.CAB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">自动注册的时候，该控件将无法被更新。必须先手动删除该文件。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21.75pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="font-size: 9pt; font-family: Verdana;">2</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">．</span><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">对</span><span style="font-size: 9pt; font-family: Verdana;">CAB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件进行数字签名</span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;传说中数字签名之后就可以不出现提示而自动下载，所以也试试：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">&nbsp;&nbsp;&nbsp; 在</span><span style="font-size: 9pt; font-family: Verdana;">\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">中间有三个小工具，就用他们来实现数字签名。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp; 1)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">．</span><span style="font-size: 9pt; font-family: Verdana;">Makecert.exe ---</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">证书创建工具</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp; 2)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">．</span><span style="font-size: 9pt; font-family: Verdana;">Cert2Spc.exe ---</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">发行者证书测试工具</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp; 3)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">．</span><span style="font-size: 9pt; font-family: Verdana;">Signcode.exe ---</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件签名工具</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">步骤：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1)makecert -ss name -n "CN=</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">公司名</span><span style="font-size: 9pt; font-family: Verdana;">" -sv d:\pos.pvk -r d:\pos.cer </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">其中</span><span style="font-size: 9pt; font-family: Verdana;">sk-</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">表示主题的密钥容器位置，</span><span style="font-size: 9pt; font-family: Verdana;">ss-</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">主题的证书存储名称，</span><span style="font-size: 9pt; font-family: Verdana;"> n-</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">证书颁发对象，</span><span style="font-size: 9pt; font-family: Verdana;">r-</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">证书存储位置，</span><span style="font-size: 9pt; font-family: Verdana;">-sv </span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">导出私钥文件（为了签名使用）。注意：这个时候会让输入三次密码，三次要完全一致。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">使用</span><span style="font-size: 9pt; font-family: Verdana;">Cert2Spc</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">生成</span><span style="font-size: 9pt; font-family: Verdana;">spc</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">发行者证书（可选）：</span><span style="font-size: 9pt; font-family: Verdana;">cert2spc d:\pos.cer c:\pos.spc</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">双击</span><span style="font-size: 9pt; font-family: Verdana;">signcode</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，不带参数会启动签名向导。先选择要签名文件，下一步，选择</span><span style="font-size: 9pt; font-family: Verdana;">&ldquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">自定义</span><span style="font-size: 9pt; font-family: Verdana;">&rdquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，下一步，选择</span><span style="font-size: 9pt; font-family: Verdana;">&ldquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">从文件选择</span><span style="font-size: 9pt; font-family: Verdana;">&rdquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，添加刚生成的</span><span style="font-size: 9pt; font-family: Verdana;">pos.cer</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">证书，下一步，选择刚生成的私钥</span><span style="font-size: 9pt; font-family: Verdana;">pos.pvk</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，再下一步，可</span><span style="font-size: 9pt; font-family: Verdana;">spc</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">证书，再一直下一步。添加时间戳，在时间戳填入</span><span style="font-size: 9pt; font-family: Verdana;">http: //timestamp.verisign.com/scripts/timstamp.dll TestCAB.CAB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，再下一步完成。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;</span>这样就对</span><span style="font-size: 9pt; font-family: Verdana;">CAB</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">文件进行了签名，但是这个时候点击这个文件会发现证书不可用，原因是证书没有安转。文件属性</span><span style="font-size: 9pt; font-family: Verdana;">-&gt;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">数字证书</span><span style="font-size: 9pt; font-family: Verdana;">-&gt;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">详细信息</span><span style="font-size: 9pt; font-family: Verdana;">-</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">〉查看证书</span><span style="font-size: 9pt; font-family: Verdana;">-</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">〉安装证书，进入安装证书向导，存放区域选择</span><span style="font-size: 9pt; font-family: Verdana;">&ldquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">受信任的根证书颁发机构</span><span style="font-size: 9pt; font-family: Verdana;">&rdquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，点击完成即可。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;</span>在客户端测试：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">加入证书，浏览器</span><span style="font-size: 9pt; font-family: Verdana;">-</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">〉工具</span><span style="font-size: 9pt; font-family: Verdana;">-</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">〉</span><span style="font-size: 9pt; font-family: Verdana;">Internet</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">选项</span><span style="font-size: 9pt; font-family: Verdana;">-</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">〉内容</span><span style="font-size: 9pt; font-family: Verdana;">-</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">〉证书</span><span style="font-size: 9pt; font-family: Verdana;">-</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">〉受信任的颁发机构</span><span style="font-size: 9pt; font-family: Verdana;">-</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">〉导入证书。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">在有证书的情况下，如果服务器没有加入</span><span style="font-size: 9pt; font-family: Verdana;">&ldquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">可信任网址</span><span style="font-size: 9pt; font-family: Verdana;">&rdquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，提示下载的时候会显示证书所签内容，没有证书则提示为</span><span style="font-size: 9pt; font-family: Verdana;">&ldquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">未知</span><span style="font-size: 9pt; font-family: Verdana;">&rdquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3)</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">如果服务器已加入</span><span style="font-size: 9pt; font-family: Verdana;">&ldquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">可信任网址</span><span style="font-size: 9pt; font-family: Verdana;">&rdquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，并且已导入证书，则不提示任何信息，在用户毫无感觉情况下下载。如果没有加入</span><span style="font-size: 9pt; font-family: Verdana;">&ldquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">可信任网址</span><span style="font-size: 9pt; font-family: Verdana;">&ldquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">，控件可以正常下载但仍然不能正常使用，与是否签名无关。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: Verdana;">&nbsp;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">问题：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">１．是否可以不添加</span><span style="font-size: 9pt; font-family: Verdana;">&ldquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">可信任网址</span><span style="font-size: 9pt; font-family: Verdana;">&rdquo;</span><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 9pt; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;">２．数字签名的作用，授权证书与不授权证书的区别。</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://lwg2001s.javaeye.com/blog/203976#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 16 Jun 2008 09:26:22 +0800</pubDate>
        <link>http://lwg2001s.javaeye.com/blog/203976</link>
        <guid>http://lwg2001s.javaeye.com/blog/203976</guid>
      </item>
      <item>
        <title>AJAX上传文件实例(上传图片实例) [源]</title>
        <author>lwg2001s</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lwg2001s.javaeye.com">lwg2001s</a>&nbsp;
          链接：<a href="http://lwg2001s.javaeye.com/blog/202253" style="color:red;">http://lwg2001s.javaeye.com/blog/202253</a>&nbsp;
          发表时间: 2008年06月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small;">将index.html和upload.php文件保存到apache工作目录，例子使用安装目录</span></p>
<p><span style="font-size: small;">D:/Program Files/Apache Software Foundation/Apache2.2/htdocs/</span></p>
<p>&nbsp;</p>
<p>AJAX 客户端页面代码： index.html</p>
<pre name="code" class="html">&lt;html&gt;
&lt;body&gt;
&lt;h1&gt;Ajax file upload sample&lt;/h1&gt;&lt;br/&gt;&lt;input id="uplaod" name="btn_send" type="button" value="上传测试"/&gt;
&lt;div id=result&gt;&lt;/div&gt;
<pre name="code" class="js">&lt;SCRIPT LANGUAGE=JavaScript&gt; 
// 上传函数 
function btn_send.onclick() { 
 data = ""
 spliter = "-------7d8d733180846"
 data = data + spliter + "\r\n"
 data = data + "Content-Disposition: form-data; name=\"photofile\"; filename=\"C:\\a.txt\"\r\n"
 // data = data + "Content-Type: image/pjpeg" + vbCrLf
 data = data + "Content-Type: text/plain" + "\r\n" + "\r\n"
 text = "My name is Wilson Lin."
 postLength = text.length + data.length + 2 + spliter.length + 4
 package = data + text + "\r\n" + spliter + "--\r\n"

 alert(package)
 // 把XML文档发送到Web服务器 
 var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
 xmlhttp.open("POST","./upload.php",false); 
 xmlhttp.setRequestHeader("Content-Type", "multipart/form-data; boundary=-----7d8d733180846");
 xmlhttp.setRequestHeader("Content-Length", postLength);
 xmlhttp.send(package); 
 // 显示服务器返回的信息 
 result.innerHTML=xmlhttp.ResponseText;
} 
&lt;/SCRIPT&gt; 
</pre>
&nbsp;&lt;/body&gt;
&lt;/html&gt;

</pre>
<p>&nbsp;</p>
<p>PHP服务器端代码： upload.php</p>
<pre name="code" class="html">&lt;?php
// $_FILES['photofile']:是获得上传图片的数组
// $uploadfile：存放地址
$uploadfile = "D:/Program Files/Apache Software Foundation/Apache2.2/htdocs/".$_FILES['photofile']['name'];
copy( $_FILES['photofile']['tmp_name'], $uploadfile );
echo "URL: &lt;a href='http://localhost/".$_FILES['photofile']['name']."' target='_blank'&gt;".$_FILES['photofile']['name']."&lt;/a&gt;&lt;br/&gt;";
?&gt;
Upload successed!</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lwg2001s.javaeye.com/blog/202253#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Jun 2008 17:44:48 +0800</pubDate>
        <link>http://lwg2001s.javaeye.com/blog/202253</link>
        <guid>http://lwg2001s.javaeye.com/blog/202253</guid>
      </item>
      <item>
        <title>What are Unix signals?</title>
        <author>lwg2001s</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lwg2001s.javaeye.com">lwg2001s</a>&nbsp;
          链接：<a href="http://lwg2001s.javaeye.com/blog/187508" style="color:red;">http://lwg2001s.javaeye.com/blog/187508</a>&nbsp;
          发表时间: 2008年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>一个<em>信号，</em>是一个信息，可以发送到运行的过程。 </p>
<p><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Signals can be initiated by programs, users, or administrators.</span>信号可启动程式，使用者或管理员。</span> </p>
<p><span onmouseover="_tipon(this)" onmouseout="_tipoff()" style="background-color: #e6ecf9;"><span class="google-src-text" style="direction: ltr; text-align: left;">For example, to the proper method of telling the Internet Daemon (inetd) to re-read its configuration file is to send it a SIGHUP signal.</span>举例来说，以适当的方法告诉互联网守护进程 （ inetd的） ，以重看其配置文件，是发送一个sighup信号。</span> </p>
<p><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">For example, if the current process ID (PID) of inetd is 4140, we would type:</span>举例来说，如果当前的进程ID （ PID控制）的inetd的是4140年，我们会类型：</span> </p>
<pre> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">kill -SIGHUP 4140</span></span> </pre>
<p><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Another common use of signals is to stop a running process.</span>另一种普遍使用的信号是停止一个运行的过程。</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">To stop the inetd process completely, we would use this command:</span>停止inetd的进程完全中，我们会用这个命令：</span> </p>
<pre> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">kill 4140</span></span> </pre>
<p><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">By default, the kill command sends the SIGTERM signal.</span>默认情况下，杀死指挥移送sigterm信号。</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">If SIGTERM fails, we can escalate to using the SIGKILL signal to stop the process:</span>如果sigterm失败的话，我们可以升级使用sigkill信号，以阻止过程：</span> </p>
<pre> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">kill -9 4140</span></span> </pre>
<p><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Because SIGKILL cannot be handled, stopping a process with SIGKILL is generally considered a bad idea.</span>因为sigkill不能处理，制止过程中与sigkill被普遍认为是一个坏主意。</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Using SIGKILL prevents a process from cleaning up after itself and exiting gracefully.</span>用sigkill阻止一个进程，从清理后，本身并退出缓慢下降。</span> </p>
<h2><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Handling Signals</span>信号处理</span> </h2>
<p><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Each Unix signal has a default set of effects on a Unix program.</span>每个Unix信号具有默认设置的效果上的Unix程序。</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Programmers can code their applications to respond in customized ways to most signals.</span>程序员可以码及其应用响应定制的方式，以最信号。</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">These custom pieces of code are called <em>signal handlers</em> .</span>这些习俗件代码是所谓<em>的信号处理</em> 。</span> </p>
<p><span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">Two signals are unable to be redefined by a signal handler.</span>两路信号无法重新定义，由一个信号处理器。</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">SIGKILL always stops a process and SIGSTOP always moves a process from the foreground to the background.</span> sigkill总是站有一个过程， sigstop总是一个过程，从前台到后台。</span> <span onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left;">These two signals cannot be "caught" by a signal handler.</span>这两个信号不能被"捕获"的一个信号处理器。</span> </p>
<h3>FreeBSD Signals</h3>
<p>
<table border="1">
<tbody>
<tr>
<th>Signal Name</th><th>Signal Number</th><th>Signal Description</th>
</tr>
<tr>
<td>SIGHUP</td>
<td>1</td>
<td>Terminal line hangup</td>
</tr>
<tr>
<td>SIGINT</td>
<td>2</td>
<td>Interrupt program</td>
</tr>
<tr>
<td>SIGQUIT</td>
<td>3</td>
<td>Quit program</td>
</tr>
<tr>
<td>SIGILL</td>
<td>4</td>
<td>Illegal instruction</td>
</tr>
<tr>
<td>SIGTRAP</td>
<td>5</td>
<td>Trace trap</td>
</tr>
<tr>
<td>SIGABRT</td>
<td>6</td>
<td>Abort</td>
</tr>
<tr>
<td>SIGEMT</td>
<td>7</td>
<td>Emulate instruction executed</td>
</tr>
<tr>
<td>SIGFPE</td>
<td>8</td>
<td>Floating-point exception</td>
</tr>
<tr>
<td>SIGKILL</td>
<td>9</td>
<td>Kill program</td>
</tr>
<tr>
<td>SIGBUS</td>
<td>10</td>
<td>Bus error</td>
</tr>
<tr>
<td>SIGSEGV</td>
<td>11</td>
<td>Segmentation violation</td>
</tr>
<tr>
<td>SIGSYS</td>
<td>12</td>
<td>Bad argument to system call</td>
</tr>
<tr>
<td>SIGPIPE</td>
<td>13</td>
<td>Write on a pipe with no one to read it</td>
</tr>
<tr>
<td>SIGALRM</td>
<td>14</td>
<td>Real-time timer expired</td>
</tr>
<tr>
<td>SIGTERM</td>
<td>15</td>
<td>Software termination signal</td>
</tr>
<tr>
<td>SIGURG</td>
<td>16</td>
<td>Urgent condition on I/O channel</td>
</tr>
<tr>
<td>SIGSTOP</td>
<td>17</td>
<td>Stop signal not from terminal</td>
</tr>
<tr>
<td>SIGTSTP</td>
<td>18</td>
<td>Stop signal from terminal</td>
</tr>
<tr>
<td>SIGCONT</td>
<td>19</td>
<td>A stopped process is being continued</td>
</tr>
<tr>
<td>SIGCHLD</td>
<td>20</td>
<td>Notification to parent on child stop or exit</td>
</tr>
<tr>
<td>SIGTTIN</td>
<td>21</td>
<td>Read on terminal by background process</td>
</tr>
<tr>
<td>SIGTTOU</td>
<td>22</td>
<td>Write to terminal by background process</td>
</tr>
<tr>
<td>SIGIO</td>
<td>23</td>
<td>I/O possible on a descriptor</td>
</tr>
<tr>
<td>SIGXCPU</td>
<td>24</td>
<td>CPU time limit exceeded</td>
</tr>
<tr>
<td>SIGXFSZ</td>
<td>25</td>
<td>File-size limit exceeded</td>
</tr>
<tr>
<td>SIGVTALRM</td>
<td>26</td>
<td>Virtual timer expired</td>
</tr>
<tr>
<td>SIGPROF</td>
<td>27</td>
<td>Profiling timer expired</td>
</tr>
<tr>
<td>SIGWINCH</td>
<td>28</td>
<td>Window size changed</td>
</tr>
<tr>
<td>SIGINFO</td>
<td>29</td>
<td>Information request</td>
</tr>
<tr>
<td>SIGUSR1</td>
<td>30</td>
<td>User-defined signal 1</td>
</tr>
<tr>
<td>SIGUSR2</td>
<td>31</td>
<td>User-defined signal 2</td>
</tr>
<tr>
<td>SIGTHR</td>
<td>32</td>
<td>Thread interrupt</td>
</tr>
</tbody>
</table>
</p>
<h3>Solaris Signals</h3>
<p>
<table border="1">
<tbody>
<tr>
<th>Signal Name</th><th>Signal Number</th><th>Signal Description</th>
</tr>
<tr>
<td>SIGHUP</td>
<td>1</td>
<td>Hangs up</td>
</tr>
<tr>
<td>SIGINT</td>
<td>2</td>
<td>Interrupts</td>
</tr>
<tr>
<td>SIGQUIT</td>
<td>3</td>
<td>Quits</td>
</tr>
<tr>
<td>SIGILL</td>
<td>4</td>
<td>Illegal instruction</td>
</tr>
<tr>
<td>SIGTRAP</td>
<td>5</td>
<td>Trace trap</td>
</tr>
<tr>
<td>SIGABRT</td>
<td>6</td>
<td>Used by abort</td>
</tr>
<tr>
<td>SIGEMT</td>
<td>7</td>
<td>EMT instruction</td>
</tr>
<tr>
<td>SIGFPE</td>
<td>8</td>
<td>Floating-point exception</td>
</tr>
<tr>
<td>SIGKILL</td>
<td>9</td>
<td>Kill (cannot be caught or ignored)</td>
</tr>
<tr>
<td>SIGBUS</td>
<td>10</td>
<td>Bus error</td>
</tr>
<tr>
<td>SIGSEGV</td>
<td>11</td>
<td>Segmentation violation</td>
</tr>
<tr>
<td>SIGSYS</td>
<td>12</td>
<td>Bad argument to system call</td>
</tr>
<tr>
<td>SIGPIPE</td>
<td>13</td>
<td>Writes on a pipe with no one to read it</td>
</tr>
<tr>
<td>SIGALRM</td>
<td>14</td>
<td>Alarm clock</td>
</tr>
<tr>
<td>SIGTERM</td>
<td>15</td>
<td>Software termination</td>
</tr>
<tr>
<td>SIGUSR1</td>
<td>16</td>
<td>User-defined signal 1</td>
</tr>
<tr>
<td>SIGUSR2</td>
<td>17</td>
<td>User-defined signal 2</td>
</tr>
<tr>
<td>SIGCHLD</td>
<td>18</td>
<td>Child status change alias (POSIX)</td>
</tr>
<tr>
<td>SIGPWR</td>
<td>19</td>
<td>Power-fail restart</td>
</tr>
<tr>
<td>SIGWINCH</td>
<td>20</td>
<td>Window size change</td>
</tr>
<tr>
<td>SIGURG</td>
<td>21</td>
<td>Urgent socket condition</td>
</tr>
<tr>
<td>SIGPOLL /SIGIO</td>
<td>22</td>
<td>Pollable event occurred or Socket I/O possible</td>
</tr>
<tr>
<td>SIGSTOP</td>
<td>23</td>
<td>Stop (cannot be caught or ignored)</td>
</tr>
<tr>
<td>SIGTSTP</td>
<td>24</td>
<td>User stop requested from TTY</td>
</tr>
<tr>
<td>SIGCONT</td>
<td>25</td>
<td>Stopped process has been continued</td>
</tr>
<tr>
<td>SIGTTIN</td>
<td>26</td>
<td>Background TTY read attempted</td>
</tr>
<tr>
<td>SIGTTOU</td>
<td>27</td>
<td>Background TTY write attempted</td>
</tr>
<tr>
<td>SIGVTALRM</td>
<td>28</td>
<td>Virtual timer expired</td>
</tr>
<tr>
<td>SIGPROF</td>
<td>29</td>
<td>Profiling timer expired</td>
</tr>
<tr>
<td>SIGXCPU</td>
<td>30</td>
<td>Exceeded CPU limit</td>
</tr>
<tr>
<td>SIGXFSZ</td>
<td>31</td>
<td>Exceeded file size limit</td>
</tr>
<tr>
<td>SIGWAITING</td>
<td>32</td>
<td>Process' LWPs are blocked</td>
</tr>
<tr>
<td>SIGLWP</td>
<td>33</td>
<td>Special signal used by thread library</td>
</tr>
<tr>
<td>SIGFREEZE</td>
<td>34</td>
<td>Special signal used by CPR</td>
</tr>
<tr>
<td>SIGTHAW</td>
<td>35</td>
<td>Special signal used by CPR</td>
</tr>
<tr>
<td>SIGCANCEL</td>
<td>36</td>
<td>Thread cancellation signal used by libthread</td>
</tr>
<tr>
<td>SIGLOST</td>
<td>37</td>
<td>Resource lost</td>
</tr>
<tr>
<td>SIGRTMIN</td>
<td>38</td>
<td>Highest priority real-time signal</td>
</tr>
<tr>
<td>SIGRTMAX</td>
<td>45</td>
<td>Lowest priority real-time signal</td>
</tr>
</tbody>
</table>
</p>
<!-- google_ad_section_start(weight=ignore) --><br />
<script type="text/javascript"></script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
          <br/>
          <span style="color:red;">
            <a href="http://lwg2001s.javaeye.com/blog/187508#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 Apr 2008 13:02:21 +0800</pubDate>
        <link>http://lwg2001s.javaeye.com/blog/187508</link>
        <guid>http://lwg2001s.javaeye.com/blog/187508</guid>
      </item>
      <item>
        <title>Js中实现拼音和UrlEncode的功能(利用GB和Unicode对照表)</title>
        <author>lwg2001s</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lwg2001s.javaeye.com">lwg2001s</a>&nbsp;
          链接：<a href="http://lwg2001s.javaeye.com/blog/180482" style="color:red;">http://lwg2001s.javaeye.com/blog/180482</a>&nbsp;
          发表时间: 2008年04月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          但由于有些人需要完全用javascript写，而javascript默认是Unicode<br />所以就需要一个Unicode和GB的转换库<br /><br />Unicode和GB的转换库和UrlEncode和getSpell函数，请下载<br />http://www.bizservice.com.cn/lib/string/qswhU2GB.js<br /><br />var qswhU2GB=[];//Unicode和GB的对应表，略<br />var qswhSpell=[];//拼音的对照表，略<br /><br />function UrlEncode(str){<br /> var i,c,ret="",strSpecial="!\"#$%&'()*+,/:;&lt;=>?@[\]^`{|}~%";<br /> for(i=0;i&lt;str.length;i++){<br />  if(str.charCodeAt(i)>=0x4e00){<br />   c=qswhU2GB[str.charCodeAt(i)-0x4e00];<br />   ret+="%"+c.slice(0,2)+"%"+c.slice(-2);<br />  }else{<br />   c=str.charAt(i);<br />   if(c==" ")<br />    ret+="+";<br />   else if(strSpecial.indexOf(c)!=-1)<br />    ret+="%"+str.charCodeAt(i).toString(16);<br />   else<br />    ret+=c;<br />  }<br /> }<br /> return ret;<br />}<br /><br />function getSpell(str,sp){<br /> var i,c,t,ret="";<br /> if(sp==null)sp="";<br /> for(i=0;i&lt;str.length;i++){<br />  if(str.charCodeAt(i)>=0x4e00){<br />   c=parseInt(qswhU2GB[str.charCodeAt(i)-0x4e00],16);<br />   if(c&lt;55290){<br />    for(t=qswhSpell.length-1;t>0;t=t-2)if(qswhSpell[t]&lt;=c)break;<br />    if(t>0)ret+=qswhSpell[t-1]+sp;<br />   }<br />  }<br /> }<br /> return ret.substr(0,ret.length-sp.length);<br />}<br /><br />sp是分隔符，范例如下<br />&lt;script language=javascript src=qswhU2GB.js>&lt;/script><br />&lt;script language=javascript><br />document.write(UrlEncode("中文 &lt;>\"#%{}|^~[]`&?+Abc"),"&lt;br>")<br />document.write(getSpell("中国商服网"),"&lt;br>")<br />document.write(getSpell("秋水无恨","'"),"&lt;br>")<br />&lt;/script>
          <br/>
          <span style="color:red;">
            <a href="http://lwg2001s.javaeye.com/blog/180482#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Apr 2008 15:19:05 +0800</pubDate>
        <link>http://lwg2001s.javaeye.com/blog/180482</link>
        <guid>http://lwg2001s.javaeye.com/blog/180482</guid>
      </item>
      <item>
        <title>Memcached 协议参照译文（转）</title>
        <author>lwg2001s</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lwg2001s.javaeye.com">lwg2001s</a>&nbsp;
          链接：<a href="http://lwg2001s.javaeye.com/blog/174108" style="color:red;">http://lwg2001s.javaeye.com/blog/174108</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table cellspacing="1" border="0" width="100%" cellpadding="4"><tbody><tr><td style="color: #336600" width="50%"><h5>协议</h5></td><td style="color: #336600" width="50%"><h5>Protocol</h5></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">memcached 的客户端使用TCP链接 与 服务器通讯。（UDP接口也同样有效，参考后文的 &ldquo;UDP协议&rdquo; ）一个运行中的memcached服务器监视一些（可设置）端口。客户端连接这些端口，发送命令到服务器，读取回应，最后关闭连接。</td><td valign="top" style="font-size: 13px; line-height: 20px">Clients of memcached communicate with server through TCP connections. (A UDP interface is also available; details are below under &quot;UDP protocol.&quot;) A given running memcached server listens on some (configurable) port; clients connect to that port, send commands to the server, read responses, and eventually close the connection.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">结束会话不需要发送任何命令。当不再需memcached服务时，要客户端可以在任何时候关闭连接。需要注意的是，鼓励客户端缓存这些连接，而不是每次需要存取数据时都重新打开连接。这是因为memcached 被特意设计成及时开启很多连接也能够高效的工作（数百个，上千个如果需要的话）。缓存这些连接，可以消除建立连接所带来的开销（/*/相对而言，在服务器端建立一个新连接的准备工作所带来的开销，可以忽略不计。）。</td><td valign="top" style="font-size: 13px; line-height: 20px">There is no need to send any command to end the session. A client may just close the connection at any moment it no longer needs it. Note, however, that clients are encouraged to cache their connections rather than reopen them every time they need to store or retrieve data. This is because memcached is especially designed to work very efficiently with a very large number (many hundreds, more than a thousand if necessary) of open connections. Caching connections will eliminate the overhead associated with establishing a TCP connection (the overhead of preparing for a new connection on the server side is insignificant compared to this).</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">在memcache协议中发送的数据分两种：文本行 和 自由数据。 文本行被用于来自客户端的命令和服务器的回应。自由数据用于客户端从服务器端存取数据时。同样服务器会以字节流的方式传回自由数据。/*/服务器不用关心自由数据的字节顺序。自由数据的特征没有任何限制；但是通过前文提到的文本行，这项数据的接受者（服务器或客户端），便能够精确地获知所发送的数据库的长度。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">There are two kinds of data sent in the memcache protocol: text lines<br />and unstructured data. Text lines are used for commands from clients<br />and responses from servers. Unstructured data is sent when a client<br />wants to store or retrieve data. The server will transmit back<br />unstructured data in exactly the same way it received it, as a byte<br />stream. The server doesn't care about byte order issues in<br />unstructured data and isn't aware of them. There are no limitations on<br />characters that may appear in unstructured data; however, the reader<br />of such data (either a client or a server) will always know, from a<br />preceding text line, the exact length of the data block being<br />transmitted.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">文本行固定以&ldquo;\r\n&rdquo;(回车符紧跟一个换行符)结束。 自由数据也是同样会以&ldquo;\r\n&rdquo;结束，但是 \r(回车符)、\n(换行符)，以及任何其他8位字符，均可出现在数据中。因此，当客户端从服务器取回数据时，必须使用数据区块的长度来确定数据区块的结束位置，而不要依据数据区块末尾的&ldquo;\r\n&rdquo;，即使它们固定存在于此。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">Text lines are always terminated by \r\n. Unstructured data is _also_<br />terminated by \r\n, even though \r, \n or any other 8-bit characters<br />may also appear inside the data. Therefore, when a client retrieves<br />data from a server, it must use the length of the data block (which it<br />will be provided with) to determine where the data block ends, and not<br />the fact that \r\n follows the end of the data block, even though it<br />does.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td></tr><tr><td valign="top" style="color: #336600"><h5>键值</h5></td><td valign="top" style="color: #336600"><h5>Keys</h5></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">存储在memcached中的数据通过键值来标识。键值是一个文本字符串，对于需要存取这项数据的客户端而言，它必须是唯一的。键值当前的长度限制设定为250字符（当然，客户端通常不会用到这么长的键）；键值中不能使用制表符和其他空白字符（例如空格，换行等）。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">Data stored by memcached is identified with the help of a key. A key<br />is a text string which should uniquely identify the data for clients<br />that are interested in storing and retrieving it. Currently the<br />length limit of a key is set at 250 characters (of course, normally<br />clients wouldn't need to use such long keys); the key must not include<br />control characters or whitespace.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td></tr><tr><td valign="top" style="color: #336600"><h5>命令</h5></td><td valign="top" style="color: #336600"><h5>Commands</h5></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">所有命令分为3种类型</td><td valign="top" style="font-size: 13px; line-height: 20px">There are three types of commands. </td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">存储命令（有3项：&rsquo;set&rsquo;、&rsquo;add&rsquo;、&rsquo;repalce&rsquo;）指示服务器储存一些由键值标识的数据。客户端发送一行命令，后面跟着数据区块；然后，客户端等待接收服务器回传的命令行，指示成功与否。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">Storage commands (there are three: &quot;set&quot;, &quot;add&quot; and &quot;replace&quot;) ask the<br />server to store some data identified by a key. The client sends a<br />command line, and then a data block; after that the client expects one<br />line of response, which will indicate success or faulure.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">取回命令（只有一项：&rsquo;get&rsquo;）指示服务器返回与所给键值相符合的数据（一个请求中右一个或多个键值）。客户端发送一行命令，包括所有请求的键值；服务器每找到一项内容，都会发送回客户端一行关于这项内容的信息，紧跟着是对应的数据区块；直到服务器以一行&ldquo;END&rdquo;回应命令结束。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">Retrieval commands (there is only one: &quot;get&quot;) ask the server to<br />retrieve data corresponding to a set of keys (one or more keys in one<br />request). The client sends a command line, which includes all the<br />requested keys; after that for each item the server finds it sends to<br />the client one response line with information about the item, and one<br />data block with the item's data; this continues until the server<br />finished with the &quot;END&quot; response line.<br /></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">/*?*/其他的命令都不能携带自由数据。在这些命令中，客户端发送一行命令，然后等待（由命令所决定）一行回应，或最终以一行&ldquo;END&rdquo;结束的多行命令。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">All other commands don't involve unstructured data. In all of them,<br />the client sends one command line, and expects (depending on the<br />command) either one line of response, or several lines of response<br />ending with &quot;END&quot; on the last line.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">一行命令固定以命令名称开始，接着是以空格隔开的参数（如果有参数的话）。命令名称大小写敏感，并且必须小写。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">A command line always starts with the name of the command, followed by<br />parameters (if any) delimited by whitespace. Command names are<br />lower-case and are case-sensitive.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">一些客户端发送给服务器的命令会包含一些时限（针对内容或客户端请求的操作）。这时，时限的具体内容既可以是Unix时间戳（从1970年1月1日开始的秒钟数），或当前时间开始的秒钟数。对后者而言，不能超过 60*60*24*30（30天）；如果超出，服务器将会理解为Unix时间戳，而不是从当前时间起的秒偏移。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">Some commands involve a client sending some kind of expiration time<br />(relative to an item or to an operation requested by the client) to<br />the server. In all such cases, the actual value sent may either be<br />Unix time (number of seconds since January 1, 1970, as a 32-bit<br />value), or a number of seconds starting from current time. In the<br />latter case, this number of seconds may not exceed 60*60*24*30 (number<br />of seconds in 30 days); if the number sent by a client is larger than<br />that, the server will consider it to be real Unix time value rather<br />than an offset from current time.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td></tr><tr><td valign="top" style="color: #336600"><h5>错误字串</h5></td><td valign="top" style="color: #336600"><h5>Error strings</h5></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">每一个由客户端发送的命令，都可能收到来自服务器的错误字串回复。这些错误字串会以三种形式出现：</td><td valign="top" style="font-size: 13px; line-height: 20px">Each command sent by a client may be answered with an error string<br />from the server. These error strings come in three types:</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">- &quot;ERROR\r\n&quot; </td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">意味着客户端发送了不存在的命令名称。</td><td valign="top" style="font-size: 13px; line-height: 20px">means the client sent a nonexistent command name.</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">- &quot;CLIENT_ERROR &lt;error&gt;\r\n&quot;</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">意味着输入的命令行里存在一些客户端错误，例如输入未遵循协议。&lt;error&gt;部分是人类易于理解的错误解说&hellip;&hellip;</td><td valign="top" style="font-size: 13px; line-height: 20px">means some sort of client error in the input line, i.e. the input<br />doesn't conform to the protocol in some way. &lt;error&gt; is a<br />human-readable error string.</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">- &quot;SERVER_ERROR &lt;error&gt;\r\n&quot;</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">意味着一些服务器错误，导致命令无法执行。&lt;error&gt;部分是人类易于理解的错误解说。在一些严重的情形下（通常应该不会遇到），服务器将在发送这行错误后关闭连接。这是服务器主动关闭连接的唯一情况。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">means some sort of server error prevents the server from carrying<br />out the command. &lt;error&gt; is a human-readable error string. In cases<br />of severe server errors, which make it impossible to continue<br />serving the client (this shouldn't normally happen), the server will<br />close the connection after sending the error line. This is the only<br />case in which the server closes a connection to a client.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">在后面每项命令的描述中，这些错误行不会再特别提到，但是客户端必须考虑到这些它们存在的可能性。</td><td valign="top" style="font-size: 13px; line-height: 20px">In the descriptions of individual commands below, these error lines<br />are not again specifically mentioned, but clients must allow for their<br />possibility.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td></tr><tr><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">存储命令</span></h5></td><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">Storage commands</span></h5></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">首先，客户端会发送一行像这样的命令：</td><td valign="top" style="font-size: 13px; line-height: 20px">First, the client sends a command line which looks like this:</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">&lt;command name&gt; &lt;key&gt; &lt;flags&gt; &lt;exptime&gt; &lt;bytes&gt;\r\n</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;command name&gt; 是 set, add, 或者 repalce</td><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;command name&gt; is &quot;set&quot;, &quot;add&quot; or &quot;replace&quot;</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px"><ul><li>set 意思是 &ldquo;储存此数据&rdquo; </li><li>add 意思是 &ldquo;储存此数据，只在服务器*未*保留此键值的数据时&rdquo; </li><li>replace意思是 &ldquo;储存此数据，只在服务器*曾*保留此键值的数据时&rdquo;</li></ul></td><td valign="top" style="font-size: 13px; line-height: 20px"><ul><li>&quot;set&quot; means &quot;store this data&quot;. </li><li>&quot;add&quot; means &quot;store this data, but only if the server *doesn't* already<br />hold data for this key&quot;. </li><li>&quot;replace&quot; means &quot;store this data, but only if the server *does*<br />already hold data for this key&quot;.</li></ul></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;key&gt; 是接下来的客户端所要求储存的数据的键值</td><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;key&gt; is the key under which the client asks to store the data</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;flags&gt; 是在取回内容时，与数据和发送块一同保存服务器上的任意16位无符号整形（用十进制来书写）。客户端可以用它作为&ldquo;位域&rdquo;来存储一些特定的信息；它对服务器是不透明的。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;flags&gt; is an arbitrary 16-bit unsigned integer (written out in<br />decimal) that the server stores along with the data and sends back<br />when the item is retrieved. Clients may use this as a bit field to<br />store data-specific information; this field is opaque to the server.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;exptime&gt; 是终止时间。如果为0，该项永不过期(虽然它可能被删除，以便为其他缓存项目腾出位置)。如果非0（Unix时间戳或当前时刻的秒偏移），到达终止时间后，客户端无法再获得这项内容。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;exptime&gt; is expiration time. If it's 0, the item never expires<br />(although it may be deleted from the cache to make place for other<br />items). If it's non-zero (either Unix time or offset in seconds from<br />current time), it is guaranteed that clients will not be able to<br />retrieve this item after the expiration time arrives (measured by<br />server time). </td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;bytes&gt; 是随后的数据区块的字节长度，不包括用于分野的&ldquo;\r\n&rdquo;。它可以是0（这时后面跟随一个空的数据区块）。</td><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;bytes&gt; is the number of bytes in the data block to follow, *not*<br />including the delimiting \r\n. &lt;bytes&gt; may be zero (in which case<br />it's followed by an empty data block).</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">在这一行以后，客户端发送数据区块。</td><td valign="top" style="font-size: 13px; line-height: 20px">After this line, the client sends the data block:</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">&lt;data block&gt;\r\n</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;data block&gt; 是大段的8位数据，其长度由前面的命令行中的&lt;bytes&gt;指定。</td><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;data block&gt; is a chunk of arbitrary 8-bit data of length &lt;bytes&gt;<br />from the previous line.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">发送命令行和数据区块以后，客户端等待回复，可能的回复如下：</td><td valign="top" style="font-size: 13px; line-height: 20px">After sending the command line and the data blockm the client awaits<br />the reply, which may be:</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">- &quot;STORED\r\n&quot;</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">表明成功.</td><td valign="top" style="font-size: 13px; line-height: 20px">to indicate success.</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">- &quot;NOT_STORED\r\n&quot; </td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">表明数据没有被存储，但不是因为发生错误。这通常意味着add 或 replace命令的条件不成立，或者，项目已经位列删除队列（参考后文的&ldquo;delete&rdquo;命令）。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">to indicate the data was not stored, but not<br />because of an error. This normally means that either that the<br />condition for an &quot;add&quot; or a &quot;replace&quot; command wasn't met, or that the<br />item is in a delete queue (see the &quot;delete&quot; command below).</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td></tr><tr><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">取回命令</span></h5></td><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">Retrieval command</span></h5></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">一行取回命令如下：</td><td valign="top" style="font-size: 13px; line-height: 20px">The retrieval command looks like this:</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">get &lt;key&gt;*\r\n</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;key&gt;* 表示一个或多个键值，由空格隔开的字串</td><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;key&gt;* means one or more key strings separated by whitespace.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">这行命令以后，客户端的等待0个或多个项目，每项都会收到一行文本，然后跟着数据区块。所有项目传送完毕后，服务器发送以下字串：<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">After this command, the client expects zero or more items, each of<br />which is received as a text line followed by a data block. After all<br />the items have been transmitted, the server sends the string</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">&quot;END\r\n&quot;</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">来指示回应完毕。</td><td valign="top" style="font-size: 13px; line-height: 20px">to indicate the end of response.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">服务器用以下形式发送每项内容：</td><td valign="top" style="font-size: 13px; line-height: 20px">Each item sent by the server looks like this:</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">VALUE &lt;key&gt; &lt;flags&gt; &lt;bytes&gt;\r\n<br />&lt;data block&gt;\r\n</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;key&gt; 是所发送的键名</td><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;key&gt; is the key for the item being sent</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;flags&gt; 是存储命令所设置的记号</td><td valign="top" style="font-size: 13px; line-height: 20px"><p>- &lt;flags&gt; is the flags value set by the storage command</p></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;bytes&gt; 是随后数据块的长度，*不包括* 它的界定符&ldquo;\r\n&rdquo;</td><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;bytes&gt; is the length of the data block to follow, *not* including<br />its delimiting \r\n</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;data block&gt; 是发送的数据</td><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;data block&gt; is the data for this item.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">如果在取回请求中发送了一些键名，而服务器没有送回项目列表，这意味着服务器没这些键名（可能因为它们从未被存储，或者为给其他内容腾出空间而被删除，或者到期，或者被已客户端删除）。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">If some of the keys appearing in a retrieval request are not sent back<br />by the server in the item list this means that the server does not<br />hold items with such keys (because they were never stored, or stored<br />but deleted to make space for more items, or expired, or explicitly<br />deleted by a client).</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td></tr><tr><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">删除</span></h5></td><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">Deletion</span></h5></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">命令&ldquo;delete&rdquo;允许从外部删除内容：</td><td valign="top" style="font-size: 13px; line-height: 20px">The command &quot;delete&quot; allows for explicit deletion of items:</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">delete &lt;key&gt; &lt;time&gt;\r\n</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;key&gt; 是客户端希望服务器删除的内容的键名</td><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;key&gt; is the key of the item the client wishes the server to delete</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;time&gt; 是一个单位为秒的时间（或代表直到某一刻的Unix时间），在该时间内服务器会拒绝对于此键名的&ldquo;add&rdquo;和&ldquo;replace&rdquo;命令。此时内容被放入delete队列，无法再通过&ldquo;get&rdquo;得到该内容，也无法是用&ldquo;add&rdquo;和&ldquo;replace&rdquo;命令（但是&ldquo;set&rdquo;命令可用）。直到指定时间，这些内容被最终从服务器的内存中彻底清除。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;time&gt; is the amount of time in seconds (or Unix time until which)<br />the client wishes the server to refuse &quot;add&quot; and &quot;replace&quot; commands<br />with this key. For this amount of item, the item is put into a<br />delete queue, which means that it won't possible to retrieve it by<br />the &quot;get&quot; command, but &quot;add&quot; and &quot;replace&quot; command with this key<br />will also fail (the &quot;set&quot; command will succeed, however). After the<br />time passes, the item is finally deleted from server memory.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&lt;time&gt;参数 是可选的，缺省为0（表示内容会立刻清除，并且随后的存储命令均可用）。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">The parameter &lt;time&gt; is optional, and, if absent, defaults to 0<br />(which means that the item will be deleted immediately and further<br />storage commands with this key will succeed).</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">此命令有一行回应：</td><td valign="top" style="font-size: 13px; line-height: 20px">The response line to this command can be one of:</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">- &quot;DELETED\r\n&quot;</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">表示执行成功</td><td valign="top" style="font-size: 13px; line-height: 20px">to indicate success</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">- &quot;NOT_FOUND\r\n&quot;</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">表示没有找到这项内容</td><td valign="top" style="font-size: 13px; line-height: 20px">to indicate that the item with this key was not found.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">参考随后的&ldquo;flush_all&rdquo;命令使所有内容无效<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">See the &quot;flush_all&quot; command below for immediate invalidation<br />of all existing items.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td></tr><tr><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">增加/减少</span></h5></td><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">Increment/Decrement</span></h5></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">命令 &ldquo;incr&rdquo; 和 &ldquo;decr&rdquo;被用来修改数据，当一些内容需要 替换、增加 或减少时。这些数据必须是十进制的32位无符号整新。如果不是，则当作0来处理。修改的内容必须存在，当使用&ldquo;incr&rdquo;/&ldquo;decr&rdquo;命令修改不存在的内容时，不会被当作0处理，而是操作失败。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">Commands &quot;incr&quot; and &quot;decr&quot; are used to change data for some item<br />in-place, incrementing or decrementing it. The data for the item is<br />treated as decimal representation of a 32-bit unsigned integer. If the<br />current data value does not conform to such a representation, the<br />commands behave as if the value were 0. Also, the item must already<br />exist for incr/decr to work; these commands won't pretend that a<br />non-existent key exists with value 0; instead, they will fail.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">客户端发送命令行：</td><td valign="top" style="font-size: 13px; line-height: 20px">The client sends the command line:</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">incr &lt;key&gt; &lt;value&gt;\r\n<br />或<br />decr &lt;key&gt; &lt;value&gt;\r\n</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;key&gt; 是客户端希望修改的内容的建名</td><td valign="top" style="font-size: 13px; line-height: 20px"><p>- &lt;key&gt; is the key of the item the client wishes to change</p></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;value&gt; 是客户端要增加/减少的总数。</td><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;value&gt; is the amount by which the client wants to increase/decrease<br />the item. It is a decimal representation of a 32-bit unsigned integer.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">回复为以下集中情形：</td><td valign="top" style="font-size: 13px; line-height: 20px"><p>The response will be one of: </p></td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">- &quot;NOT_FOUND\r\n&quot;</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">指示该项内容的值，不存在。</td><td valign="top" style="font-size: 13px; line-height: 20px">to indicate the item with this value was not found</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;value&gt;\r\n ，&lt;value&gt;是 增加/减少 。</td><td valign="top" style="font-size: 13px; line-height: 20px">- &lt;value&gt;\r\n , where &lt;value&gt; is the new value of the item's data,<br />after the increment/decrement operation was carried out.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">注意&quot;decr&quot;命令发生下溢：如果客户端尝试减少的结果小于0时，结果会是0。&quot;incr&quot; 命令不会发生溢出。</td><td valign="top" style="font-size: 13px; line-height: 20px">Note that underflow in the &quot;decr&quot; command is caught: if a client tries<br />to decrease the value below 0, the new value will be 0. Overflow in<br />the &quot;incr&quot; command is not checked.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px"><p>&hellip;&hellip;</p><p>&nbsp;</p></td><td valign="top" style="font-size: 13px; line-height: 20px">Note also that decrementing a number such that it loses length isn't<br />guaranteed to decrement its returned length. The number MAY be<br />space-padded at the end, but this is purely an implementation<br />optimization, so you also shouldn't rely on that.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td></tr><tr><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">状态</span></h5></td><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">Statistics</span></h5></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">命令&quot;stats&quot; 被用于查询服务器的运行状态和其他内部数据。有两种格式。不带参数的：<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">The command &quot;stats&quot; is used to query the server about statistics it<br />maintains and other internal data. It has two forms. Without<br />arguments:</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2"><span style="color: #cccccc">&nbsp;</span>stats\r\n</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">这会在随后输出各项状态、设定值和文档。另一种格式带有一些参数：</td><td valign="top" style="font-size: 13px; line-height: 20px"><p>it causes the server to output general-purpose statistics and<br />settings, documented below. In the other form it has some arguments:</p><br /></td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">stats &lt;args&gt;\r\n</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">通过&lt;args&gt;，服务器传回各种内部数据。因为随时可能发生变动，本文不提供参数的种类及其传回数据。</td><td valign="top" style="font-size: 13px; line-height: 20px">Depending on &lt;args&gt;, various internal data is sent by the server. The<br />kinds of arguments and the data sent are not documented in this vesion<br />of the protocol, and are subject to change for the convenience of<br />memcache developers.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td></tr><tr><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">各种状态</span></h5></td><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">General-purpose statistics</span></h5></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">受到无参数的&quot;stats&quot;命令后，服务器发送多行内容，如下：</td><td valign="top" style="font-size: 13px; line-height: 20px">Upon receiving the &quot;stats&quot; command without arguments, the server sents<br />a number of lines which look like this:</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">STAT &lt;name&gt; &lt;value&gt;\r\n</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">服务器用以下一行来终止这个清单：</td><td valign="top" style="font-size: 13px; line-height: 20px">The server terminates this list with the line</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">END\r\n</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">在每行状态中，&lt;name&gt; 是状态的名字，&lt;value&gt; 使状态的数据。 以下清单，是所有的状态名称，数据类型，和数据代表的含义。<br /></td><td valign="top" style="font-size: 13px; line-height: 20px">In each line of statistics, &lt;name&gt; is the name of this statistic, and<br />&lt;value&gt; is the data. The following is the list of all names sent in<br />response to the &quot;stats&quot; command, together with the type of the value<br />sent for this name, and the meaning of the value.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">在&ldquo;类型&rdquo;一列中，&quot;32u&quot;表示32位无符号整型，&quot;64u&quot;表示64位无符号整型，&quot;32u:32u&quot;表示用冒号隔开的两个32位无符号整型。</td><td valign="top" style="font-size: 13px; line-height: 20px"><p>In the type column below, &quot;32u&quot; means a 32-bit unsigned integer, &quot;64u&quot;<br />means a 64-bit unsigner integer. '32u:32u' means two 32-but unsigned<br />integers separated by a colon.</p></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px" colspan="2"><table cellspacing="0" border="0" bgcolor="#003366" width="94%" cellpadding="0"><tbody><tr><td><table cellspacing="1" border="0" style="font-size: 13px; line-height: 20px" width="100%" cellpadding="2"><tbody><tr><td align="center" valign="top" bgcolor="#cc9933" style="color: #336600" width="100"><strong><span style="font-size: 13px; line-height: 20px">名称/Name</span></strong></td><td align="center" valign="top" bgcolor="#cc9933" style="color: #336600" width="80"><strong><span style="font-size: 13px; line-height: 20px">类型/Type</span></strong></td><td align="center" valign="top" bgcolor="#cc9933" style="color: #336600" colspan="2"><strong><span style="font-size: 13px; line-height: 20px">含义/</span></strong><strong>Meaning</strong></td></tr><tr><td valign="top" bgcolor="#ffe3aa">pid</td><td valign="top" bgcolor="#ffe3aa">32u</td><td valign="top" bgcolor="#ffe3aa">服务器进程ID</td><td valign="top" bgcolor="#ffe3aa">Process id of this server process</td></tr><tr><td valign="top" bgcolor="#ffe3aa">uptime</td><td valign="top" bgcolor="#ffe3aa">32u</td><td valign="top" bgcolor="#ffe3aa">服务器运行时间，单位秒</td><td valign="top" bgcolor="#ffe3aa">Number of seconds this server has been running</td></tr><tr><td valign="top" bgcolor="#ffe3aa">time</td><td valign="top" bgcolor="#ffe3aa">32u</td><td valign="top" bgcolor="#ffe3aa">服务器当前的UNIX时间</td><td valign="top" bgcolor="#ffe3aa">current UNIX time according to the server</td></tr><tr><td valign="top" bgcolor="#ffe3aa">version</td><td valign="top" bgcolor="#ffe3aa">string</td><td valign="top" bgcolor="#ffe3aa">服务器的版本号</td><td valign="top" bgcolor="#ffe3aa">Version string of this server</td></tr><tr><td valign="top" bgcolor="#ffe3aa">rusage_user</td><td valign="top" bgcolor="#ffe3aa">32u:32u</td><td valign="top" bgcolor="#ffe3aa">该进程累计的用户时间<br />(秒:微妙)</td><td valign="top" bgcolor="#ffe3aa">Accumulated user time for this process <br />(seconds:microseconds)</td></tr><tr><td valign="top" bgcolor="#ffe3aa">rusage_system</td><td valign="top" bgcolor="#ffe3aa">32u:32u</td><td valign="top" bgcolor="#ffe3aa">该进程累计的系统时间 <br />(秒:微妙)</td><td valign="top" bgcolor="#ffe3aa">Accumulated system time for this process <br />(seconds:microseconds)</td></tr><tr><td valign="top" bgcolor="#ffe3aa">curr_items</td><td valign="top" bgcolor="#ffe3aa">32u</td><td valign="top" bgcolor="#ffe3aa">服务器当前存储的内容数量</td><td valign="top" bgcolor="#ffe3aa">Current number of items stored by the server</td></tr><tr><td valign="top" bgcolor="#ffe3aa">total_items</td><td valign="top" bgcolor="#ffe3aa">32u</td><td valign="top" bgcolor="#ffe3aa">服务器启动以来存储过的内容总数</td><td valign="top" bgcolor="#ffe3aa">Total number of items stored by this server <br />ever since it started</td></tr><tr><td valign="top" bgcolor="#ffe3aa">bytes</td><td valign="top" bgcolor="#ffe3aa">64u</td><td valign="top" bgcolor="#ffe3aa">服务器当前存储内容所占用的字节数</td><td valign="top" bgcolor="#ffe3aa">Current number of bytes used by this server <br />to store items</td></tr><tr><td valign="top" bgcolor="#ffe3aa">curr_connections</td><td valign="top" bgcolor="#ffe3aa">32u</td><td valign="top" bgcolor="#ffe3aa">连接数量</td><td valign="top" bgcolor="#ffe3aa">Number of open connections</td></tr><tr><td valign="top" bgcolor="#ffe3aa">total_connections</td><td valign="top" bgcolor="#ffe3aa">32u</td><td valign="top" bgcolor="#ffe3aa">服务器运行以来接受的连接总数</td><td valign="top" bgcolor="#ffe3aa">Total number of connections opened since <br />the server started running</td></tr><tr><td valign="top" bgcolor="#ffe3aa">connection_structures</td><td valign="top" bgcolor="#ffe3aa">32u</td><td valign="top" bgcolor="#ffe3aa">服务器分配的连接结构的数量</td><td valign="top" bgcolor="#ffe3aa">Number of connection structures allocated <br />by the server</td></tr><tr><td valign="top" bgcolor="#ffe3aa">cmd_get</td><td valign="top" bgcolor="#ffe3aa">32u</td><td valign="top" bgcolor="#ffe3aa">取回请求总数</td><td valign="top" bgcolor="#ffe3aa">Cumulative number of retrieval requests</td></tr><tr><td valign="top" bgcolor="#ffe3aa">cmd_set</td><td valign="top" bgcolor="#ffe3aa">32u</td><td valign="top" bgcolor="#ffe3aa">存储请求总数</td><td valign="top" bgcolor="#ffe3aa">Cumulative number of storage requests</td></tr><tr><td valign="top" bgcolor="#ffe3aa">get_hits</td><td valign="top" bgcolor="#ffe3aa">32u</td><td valign="top" bgcolor="#ffe3aa">请求成功的总次数</td><td valign="top" bgcolor="#ffe3aa">Number of keys that have been requested and <br />found present</td></tr><tr><td valign="top" bgcolor="#ffe3aa">get_misses</td><td valign="top" bgcolor="#ffe3aa">32u</td><td valign="top" bgcolor="#ffe3aa">请求失败的总次数</td><td valign="top" bgcolor="#ffe3aa">Number of items that have been requested <br />and not found</td></tr><tr><td valign="top" bgcolor="#ffe3aa">bytes_read</td><td valign="top" bgcolor="#ffe3aa">64u</td><td valign="top" bgcolor="#ffe3aa">服务器从网络读取到的总字节数</td><td valign="top" bgcolor="#ffe3aa">Total number of bytes read by this server <br />from network</td></tr><tr><td valign="top" bgcolor="#ffe3aa">bytes_written</td><td valign="top" bgcolor="#ffe3aa">64u</td><td valign="top" bgcolor="#ffe3aa">服务器向网络发送的总字节数</td><td valign="top" bgcolor="#ffe3aa">Total number of bytes sent by this server to <br />network</td></tr><tr><td valign="top" bgcolor="#ffe3aa">limit_maxbytes</td><td valign="top" bgcolor="#ffe3aa">32u</td><td valign="top" bgcolor="#ffe3aa">服务器在存储时被允许使用的字节总数</td><td valign="top" bgcolor="#ffe3aa">Number of bytes this server is allowed to<br />use for storage. </td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td></tr><tr><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">其它命令</span></h5></td><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">Other commands</span></h5></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px"><p>&ldquo;flush_all&rdquo;命令有一个可选的数字参数。它总是执行成功，服务器会发送&ldquo;OK\r\n&rdquo;回应。它的效果是使已经存在的项目立即失效（缺省），或在指定的时间后。此后执行取回命令，将不会有任何内容返回（除非重新存储同样的键名）。flush_all 实际上没有立即释放项目所占用的内存，而是在随后陆续有新的项目被储存时执行。flush_all 效果具体如下：它导致所有更新时间早于flush_all所设定时间的项目，在被执行取回命令时命令被忽略。</p></td><td valign="top" style="font-size: 13px; line-height: 20px">&quot;flush_all&quot; is a command with an optional numeric argument. It always succeeds, and the server sends &quot;OK\r\n&quot; in response. Its effect is to invalidate all existing items immediately (by default) or after the expiration specified. After invalidation none of the items will be returned in response to a retrieval command (unless it's stored again under the same key *after* flush_all has invalidated the items). flush_all doesn't actually free all the memory taken up by existing items; that will happen gradually as new items are stored. The most precise definition of what flush_all does is the following: it causes all items whose update time is earlier than the time at which flush_all was set to be executed to be ignored for retrieval purposes.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&ldquo;version&rdquo;命令没有参数：</td><td valign="top" style="font-size: 13px; line-height: 20px">&quot;version&quot; is a command with no arguments:</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">version\r\n</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">在回应中，服务器发送：</td><td valign="top" style="font-size: 13px; line-height: 20px">In response, the server sends</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">&quot;VERSION &lt;version&gt;\r\n&quot;</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&lt;version&gt; 是服务器的版本字串。</td><td valign="top" style="font-size: 13px; line-height: 20px">where &lt;version&gt; is the version string for the server.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&ldquo;quit&rdquo;命令没有参数：</td><td valign="top" style="font-size: 13px; line-height: 20px">&quot;quit&quot; is a command with no arguments:</td></tr><tr><td valign="top" bgcolor="#cccccc" style="font-size: 13px; line-height: 20px" colspan="2">quit\r\n</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">接收此命令后，服务器关闭连接。不过，客户端可以在不再需要时，简单地关闭连接就行，并不一定需要发送这个命令。</td><td valign="top" style="font-size: 13px; line-height: 20px">Upon receiving this command, the server closes the connection. However, the client may also simply close the connection when it no longer needs it, without issuing this command.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td><td valign="top" style="font-size: 13px; line-height: 20px">&nbsp;</td></tr><tr><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">UDP 协议</span></h5></td><td valign="top" style="color: #336600"><h5><span style="font-size: 13px; line-height: 20px">UDP protocol</span></h5></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">当来自客户端的连接数远大于TCP连接的上限时，可以使用基于UDP的接口。UDP接口不能保证传输到位，所以只有在不要求成功的操作中使用；比如被用于一个&ldquo;get&rdquo;请求时，会因不当的缓存处理而发生错误或回应有遗失。</td><td valign="top" style="font-size: 13px; line-height: 20px">For very large installations where the number of clients is high enough that the number of TCP connections causes scaling difficulties, there is also a UDP-based interface. The UDP interface does not provide guaranteed delivery, so should only be used for operations that aren't required to succeed; typically it is used for &quot;get&quot; requests where a missing or incomplete response can simply be treated as a cache miss.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">每个UDP数据包都包含一个简单的帧头，数据之后的内容与TCP协议的描述类似。在执行所产生的数据流中，请求必须被包含在单独的一个UDP数据包中，但是回应可能跨越多个数据包。（只有&ldquo;get&rdquo;和&ldquo;set&rdquo;请求例外，跨越了多个数据包）</td><td valign="top" style="font-size: 13px; line-height: 20px">Each UDP datagram contains a simple frame header, followed by data in the same format as the TCP protocol described above. In the current implementation, requests must be contained in a single UDP datagram, but responses may span several datagrams. (The only common requests that would span multiple datagrams are huge multi-key &quot;get&quot; requests and &quot;set&quot; requests, both of which are more suitable to TCP transport for reliability reasons anyway.)</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">帧头有8字节长，如下（均由16位整数组成，网络字节顺序，高位在前）：</td><td valign="top" style="font-size: 13px; line-height: 20px">The frame header is 8 bytes long, as follows (all values are 16-bit integers in network byte order, high byte first):</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px"><ul><li>0-1 请求ID </li><li>2-3 序号 </li><li>4-5 该信息的数据包总数 </li><li>6-7 保留位，必须为0</li></ul></td><td valign="top" style="font-size: 13px; line-height: 20px"><ul><li>0-1 Request ID </li><li>2-3 Sequence number </li><li>4-5 Total number of datagrams in this message </li><li>6-7 Reserved for future use; must be 0</li></ul></td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">请求ID有客户端提供。一般它会是一个从随机基数开始的递增值，不过客户端想用什么样的请求ID都可以。服务器的回应会包含一个和请求中的同样的ID。客户端使用请求ID来区分每一个回应。任何一个没有请求ID的数据包，可能是之前的请求遭到延迟而造成的，应该被丢弃。</td><td valign="top" style="font-size: 13px; line-height: 20px">The request ID is supplied by the client. Typically it will be a monotonically increasing value starting from a random seed, but the client is free to use whatever request IDs it likes. The server's response will contain the same ID as the incoming request. The client uses the request ID to differentiate between responses to outstanding requests if there are several pending from the same server; any datagrams with an unknown request ID are probably delayed responses to an earlier request and should be discarded.</td></tr><tr><td valign="top" style="font-size: 13px; line-height: 20px">序号的返回是从0到n-1，n是该条信息的数据包数量。</td><td valign="top" style="font-size: 13px; line-height: 20px">The sequence number ranges from 0 to n-1, where n is the total number of datagrams i