﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客网-gyn</title><link>http://www.cnitblog.com/gyn/</link><description>Win32下的Perl，无用的select，停滞的Tk，结束吧....</description><language>zh-cn</language><lastBuildDate>Tue, 07 Oct 2008 23:40:43 GMT</lastBuildDate><pubDate>Tue, 07 Oct 2008 23:40:43 GMT</pubDate><ttl>60</ttl><item><title>Yet Another Haskell Tutorial中Exercise 3.10的答案</title><link>http://www.cnitblog.com/gyn/archive/2008/09/27/49590.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Sat, 27 Sep 2008 11:28:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/09/27/49590.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/49590.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/09/27/49590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/49590.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/49590.html</trackback:ping><description><![CDATA[
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:"Courier New";
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:42.55pt;
	mso-footer-margin:49.6pt;
	mso-paper-source:0;
	layout-grid:15.6pt;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal">
				<span style="font-family: 黑体;">因为是刚开始看</span>
				<span lang="EN-US">haskell</span>
				<span style="font-family: 黑体;">所以很多概念不是很清楚，比如何时用</span>
				<span lang="EN-US">do</span>
				<span style="font-family: 黑体;">、“</span>
				<span lang="EN-US">&lt;-</span>
				<span style="font-family: 黑体;">”和</span>
				<span lang="EN-US">let</span>
				<span style="font-family: 黑体;">。</span>
				<span lang="EN-US">Exerceise3.10</span>
				<span style="font-family: 黑体;">算是做出来，但是肯定不是一个好办法。希望给我改改吧，顺便解答一下我的疑问。不得不说的是编译信息相当地没有用啊，这真是太遗憾了。</span>
		</p>
		<div style="border: 1pt solid windowtext; padding: 1pt 4pt;">
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">module
Main</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>where</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">import IO</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">main = do
</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>list &lt;- askForNumber</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>let<span style="">  </span></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">       </span>sAdd = show (foldl (+) 0 list)</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">       </span>sMul = show (foldl (*) 1 list)</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>putStrLn ("The sum is " ++ sAdd)</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>putStrLn ("The production is " ++
sMul)</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>putFactorial list</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">           </span>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">askForNumber
= do</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>putStrLn "Give me a number (or 0 to
top):"</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>sNum &lt;- getLine</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>let num = read sNum</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>if num == 0</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">       </span>then return []</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">       </span>else do</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">       </span>
								<span style="">    </span>rest
&lt;- askForNumber</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">           </span>return (num : rest)</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">           </span>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">putFactorial
[] = do</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>putStr ""</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">putFactorial
(x : rest) = do</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>let fact = factorial x</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>putStrLn ((show x) ++ " factorial is
" ++ (show fact))</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>putFactorial(rest)</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">factorial
1 = 1</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">factorial
x = x * factorial (x-1)</span>
				</p>
		</div>
<img src ="http://www.cnitblog.com/gyn/aggbug/49590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2008-09-27 19:28 <a href="http://www.cnitblog.com/gyn/archive/2008/09/27/49590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Perl与Tcl/Tk事件驱动的比较</title><link>http://www.cnitblog.com/gyn/archive/2008/09/20/49317.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Sat, 20 Sep 2008 14:08:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/09/20/49317.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/49317.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/09/20/49317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/49317.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/49317.html</trackback:ping><description><![CDATA[
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	font-family:"Courier New";
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:42.55pt;
	mso-footer-margin:49.6pt;
	mso-paper-source:0;
	layout-grid:15.6pt;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">因为在用</span>
				<span lang="EN-US">Perl-Tk</span>
				<span style="font-family: 黑体;">或者</span>
				<span lang="EN-US">Socket</span>
				<span style="font-family: 黑体;">时，经常会需要监视某些打开的句柄而不至于阻塞主循环，</span>对于这些<span lang="EN-US"> win32</span><span style="font-family: 黑体;"> 下的 </span><span lang="EN-US">Perl</span><span style="font-family: 黑体;">表现远不如</span><span lang="EN-US">Linux</span><span style="font-family: 黑体;">下来得得心应手，</span><span style="font-family: 黑体;">但这时候我基本没有什么办法。这和</span><span lang="EN-US">windows</span><span style="font-family: 黑体;">的底层</span><span lang="EN-US">select</span><span style="font-family: 黑体;">实现有关，而</span><span lang="EN-US">Perl</span><span style="font-family: 黑体;">恰恰是调用它的，但我一直认为肯定有别的替代办法，因为</span><span lang="EN-US">Tcl/Tk</span><span style="font-family: 黑体;">的</span><span lang="EN-US">fileevent</span><span style="font-family: 黑体;">就表现得很好。</span></p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">下面是一个例子，用来显示</span>
				<span lang="EN-US">ping</span>
				<span style="font-family: 黑体;">的结果。这里有两个组件，一个是按钮，用来开始和停止</span>
				<span lang="EN-US">ping</span>
				<span style="font-family: 黑体;">；另一个是</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">用来显示</span>
				<span lang="EN-US">ping</span>
				<span style="font-family: 黑体;">的结果。分别用</span>
				<span lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">和</span>
				<span lang="EN-US">Tcl/Tk</span>
				<span style="font-family: 黑体;">代码来实现，看看他们有什么不同。</span>
		</p>
		<div style="border: 1pt solid windowtext; padding: 1pt 4pt;">
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">use Tk;</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">$count =
4;</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">$host =
'127.0.01';</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">$mw =
MainWindow-&gt;new;</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">$bt =
$mw-&gt;Button(-text =&gt; 'Clink to start ping', -command =&gt;
\&amp;RunPing);</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">$bt-&gt;pack(-fill
=&gt; 'x');</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">$tx =
$mw-&gt;Text(-width =&gt; 50, -height =&gt; 30);</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">$tx-&gt;pack;</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">MainLoop;</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">sub
RunPing {</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>open $fd, "ping -n $count $host|";</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>$mw-&gt;fileevent($fd, 'readable' =&gt; sub
{</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">       </span>sysread $fd, $buf, 30;</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">       </span>$tx-&gt;insert('end', $buf);</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">       </span>});</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>$bt-&gt;configure(-text =&gt; 'close',
-command =&gt; \&amp;ClosePing);</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">}</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">sub
ClosePing {</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>close $fd; </span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>undef $fd;</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>$bt-&gt;configure(-text =&gt; 'Clink to
start ping', -command =&gt; \&amp;RunPing);</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">}</span>
				</p>
		</div>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">运行的结果很让人失望，在</span>
				<span lang="EN-US">readable</span>
				<span style="font-family: 黑体;">的事件中加入</span>
				<span lang="EN-US">print</span>
				<span style="font-family: 黑体;">后而已更清楚地看到，事实上</span>
				<span lang="EN-US">readable</span>
				<span style="font-family: 黑体;">事件是没有被触发过的。这里的</span>
				<span lang="EN-US">fileevent</span>
				<span style="font-family: 黑体;">是</span>
				<span lang="EN-US">Tk</span>
				<span style="font-family: 黑体;">中处理事件触发的函数，它为句柄的两个状态（</span>
				<span lang="EN-US">readable</span>
				<span style="font-family: 黑体;">，</span>
				<span lang="EN-US">writable</span>
				<span style="font-family: 黑体;">）设定触发函数，其本质上使用了系统的</span>
				<span lang="EN-US">select</span>
				<span style="font-family: 黑体;">或者</span>
				<span lang="EN-US">poll</span>
				<span style="font-family: 黑体;">，换句话说即便是用</span>
				<span lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">的</span>
				<span lang="EN-US">select</span>
				<span style="font-family: 黑体;">或者</span>
				<span lang="EN-US">IO::Seelct</span>
				<span style="font-family: 黑体;">也是于事无补。文档里的原话佐证了这点“</span>
				<span lang="EN-US">A file is considered
to be readable on same basis as the system's select() (or poll()).</span>
				<span style="font-family: 黑体;">”。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">所以可以这么讲，</span>
				<span lang="EN-US">win32</span>
				<span style="font-family: 黑体;">下的</span>
				<span lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">是不大适合处理事件响应的，因而也就很难处理好处理网络相关或者界面需要运行后台长时间操作的情况。接下来换作是使用</span>
				<span lang="EN-US">Tcl/Tk</span>
				<span style="font-family: 黑体;">来实现这一功能，值得一提的是在</span>
				<span lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">下</span>
				<span lang="EN-US">50</span>
				<span style="font-family: 黑体;">宽度的</span>
				<span lang="EN-US">button</span>
				<span style="font-family: 黑体;">和</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">是不等长的，所以索性在</span>
				<span lang="EN-US">pack</span>
				<span style="font-family: 黑体;">里用</span>
				<span lang="EN-US">fill</span>
				<span style="font-family: 黑体;">自动拓宽了，而在</span>
				<span lang="EN-US">Tcl/Tk</span>
				<span style="font-family: 黑体;">中没有这个问题。</span>
		</p>
		<div style="border: 1pt solid windowtext; padding: 1pt 4pt;">
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">package
require Tk</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">set
pingcount 4</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">set host
{127.0.0.1}</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">button
.btn -text {Clink to start ping} -command "RunPing $host $pingcount"
-width 50</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">text
.text -width 50 -height 30</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">pack .btn
.text</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">proc
RunPing {host count} {</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>set fd [open "|ping -n $count
$host"]</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>;#fconfigure $fd -blocking 0</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>fileevent $fd readable "onPingRead $fd
$count $host"</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>.btn configure -text "close"
-command "closeFd $fd $count $host"</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">}</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">proc
onPingRead {fd count host} {</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>if {[eof $fd]} {</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">       </span>closeFd $fd $count $host</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>} else {</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">       </span>set buf [gets $fd]</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">       </span>.text insert {end} "$buf\n"</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>}</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">}</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">proc
closeFd {fd count host} {</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>close $fd</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">
								<span style="">    </span>.btn configure -text {Clink to start ping}
-command "RunPing $host $count"</span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span lang="EN-US">}</span>
				</p>
		</div>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">为了使用同样条件的管道，屏蔽了设置非阻塞的代码行，但这么作</span>
				<span style="font-family: 黑体;">因为系统不得不等待管道中的进程运行结束，所以</span>
				<span style="font-family: 黑体;">也使得</span>
				<span lang="EN-US">close</span>
				<span style="font-family: 黑体;">没有起到应有的作用。</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">运行的结果很令人满意，</span>
				<span lang="EN-US">test</span>
				<span style="font-family: 黑体;">没有被阻塞，在显示</span>
				<span lang="EN-US">ping</span>
				<span style="font-family: 黑体;">结果的同时，依然可以在</span>
				<span lang="EN-US">text</span>
				<span style="font-family: 黑体;">中执行输入，而且</span>
				<span lang="EN-US">button</span>
				<span style="font-family: 黑体;">也可以被顺利按下。这么看来</span>
				<span lang="EN-US">Tcl/Tk</span>
				<span style="font-family: 黑体;">比之</span>
				<span lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">在</span>
				<span lang="EN-US">win32</span>
				<span style="font-family: 黑体;">下，显然在事件处理上占有优势，而且这个占优的方面是极其重要的。</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/49317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2008-09-20 22:08 <a href="http://www.cnitblog.com/gyn/archive/2008/09/20/49317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对POE事件队列顺序的一次亲身感受</title><link>http://www.cnitblog.com/gyn/archive/2008/09/18/49185.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Thu, 18 Sep 2008 01:00:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/09/18/49185.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/49185.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/09/18/49185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/49185.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/49185.html</trackback:ping><description><![CDATA[
		<font face="Courier New">众所周知POE的消息触发机制会维护一个事件的队列，我经常会开几个component，然后来回post或者call。一直没有在意，call和post的区别，虽然我是知道这些区别的，但是实际需要用到的时候，这些区别对我而言几乎没有什么意义，所以经常随便用。前两天，因为需要用到网络连接，我决定把一个写得差不多了的Tk程序搬到POE上。主要的工作一是把变量存在$_[HEAP]中，二是将函数改为事件回调。仔细一点的话，一切还是很顺利的，但调试的时候还是出现了一些状况。这个程序差不多是一个在线的文稿系统，在切换文稿的时候，会对为保存信息进行提示，提醒用户保存。但是事情是，对于已保存的文件，在切换的时候，依然会跳出提醒对话框。我怀疑是字体更改标记被修改了，所以对其进行了跟踪，神奇的是在进入保存函数前标记为0，可一出函数永远为1。在保存函数中，有一个对字体修改事件的回调，该事件会在设置完字体之后将字体更改标记设置为1，表示已更改。在保存万之后，需要将该标记重置为0，但是这个重置的过程似乎没有起作用。细想之下，才恍然大悟，原来我用了post来回调字体设置事件，因此该事件是被放置在事件队列的尾部的，也就是说在保存函数执行完毕之后POE才会运行它，那么自然字体更改标记永远会被设置为0了。改为call之后就一切OK了，因为call是立即执行该事件的。<br /></font>
<img src ="http://www.cnitblog.com/gyn/aggbug/49185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2008-09-18 09:00 <a href="http://www.cnitblog.com/gyn/archive/2008/09/18/49185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Perl中使用打印机打印格式化文档</title><link>http://www.cnitblog.com/gyn/archive/2008/09/06/48781.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Sat, 06 Sep 2008 06:29:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/09/06/48781.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/48781.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/09/06/48781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/48781.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/48781.html</trackback:ping><description><![CDATA[
		<font face="Courier New">不得不说的是google上搜索出来的竟然都是《perl在win32平台上直接操作打印机》，这是非常令人抱歉的文章。很显然是初学者写的，如果连这个都不知道，我还真是佩服他怎么学perl的了，这不是单指win32下的打印办法，哪里都一样。但是这太简陋了，不是我想要的。<br />当然了，在avtivePerl中你可以使用ppm下载Printer来打印，但是当你看见那可怜的文档后，也许会打消这个念头，或者打印一些text是再好不过了。或者使用cpan安装Win32::Word::Writer来打印，我想它是非常好的，但前提是你能装的上它，而我在win32下装不上。<br />这个问题事实上困扰了我很久，因为很多时候你写的tk界面脚本，需要将分析的数据打印出来，如果不将这个功能集成进脚本，便不得不求助于其他的工具，比方说先生成一个文档，然后用openoffice或者其他打开它，最后在其中实现打印，这非常麻烦，而且也不容易让使用者接受。<br />既然没有特别好的针对性工具，我变依照上面的流程模拟这个过程，但这一切都是在内存中实现的，因此对于用户，不会知道里面的实现细节，这样很好。首先我用Win32::OLE打开一个文档，要保证它是不被visiable。之后将需要打印的文档按照其中的格式，打入到这个文档中。最后打印出来。不过可能是OLE的bug，这样做会在内存中保留一个到该文档的句柄，在关机的时候不有提示出错，而且如果在程序中直接使用close的话，会弹出对话框询问是否保存，这就做不到隔离使用者的效果了。所以，使用saveas将文档存到disk里，这算是一个无奈的妥协。下面是我在集群文档编辑系统中的用于打印的一个函数：<br /></font>
		<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;">
				<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
				<font face="Courier New">
						<span style="color: rgb(0, 0, 255);">sub</span>
						<span style="color: rgb(0, 0, 0);"> file_print {<br />    </span>
						<span style="color: rgb(0, 0, 255);">my</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$cur_style</span>
						<span style="color: rgb(0, 0, 0);">  </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">a</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0);">;<br />    </span>
						<span style="color: rgb(0, 0, 255);">my</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$word</span>
						<span style="color: rgb(0, 0, 0);">       </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);">
								<br />       Win32</span>
						<span style="color: rgb(0, 0, 0);">::</span>
						<span style="color: rgb(0, 0, 0);">OLE</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">new(</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">Word.Application</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0);">,</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">Quit</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0);">) or </span>
						<span style="color: rgb(0, 0, 255);">die</span>
						<span style="color: rgb(0, 0, 0);"> $</span>
						<span style="color: rgb(0, 0, 0);">!</span>
						<span style="color: rgb(0, 0, 0);">;<br />    </span>
						<span style="color: rgb(128, 0, 128);">$word</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">{</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">Visible</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0);">} </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 0);">0</span>
						<span style="color: rgb(0, 0, 0);">;<br />    </span>
						<span style="color: rgb(0, 0, 255);">my</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$document</span>
						<span style="color: rgb(0, 0, 0);">   </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$word</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">Documents</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">Add;<br />    </span>
						<span style="color: rgb(0, 0, 255);">my</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$selection</span>
						<span style="color: rgb(0, 0, 0);">  </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$word</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">Selection;<br />    </span>
						<span style="color: rgb(0, 0, 255);">my</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$style</span>
						<span style="color: rgb(0, 0, 0);">      </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$document</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">Styles</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">Add(</span>
						<span style="color: rgb(128, 0, 128);">$cur_style</span>
						<span style="color: rgb(0, 0, 0);">);<br />    </span>
						<span style="color: rgb(0, 0, 255);">my</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$style_font</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$style</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">{Font};<br />    </span>
						<span style="color: rgb(128, 0, 128);">$style_font</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">{Name}                         </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$family</span>
						<span style="color: rgb(0, 0, 0);">;<br />    </span>
						<span style="color: rgb(128, 0, 128);">$style_font</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">{Size}                         </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$size</span>
						<span style="color: rgb(0, 0, 0);">;<br />    </span>
						<span style="color: rgb(128, 0, 128);">$style_font</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">{Bold}                         </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$weight</span>
						<span style="color: rgb(0, 0, 0);">;<br />    </span>
						<span style="color: rgb(128, 0, 128);">$style_font</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">{Italic}                       </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$slant</span>
						<span style="color: rgb(0, 0, 0);"> eq </span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">italic</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(0, 0, 0);">?</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 0);">1</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(0, 0, 0);">:</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 0);">0</span>
						<span style="color: rgb(0, 0, 0);">;<br />    </span>
						<span style="color: rgb(128, 0, 128);">$style_font</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">{Underline}                    </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$underline</span>
						<span style="color: rgb(0, 0, 0);">;<br />    </span>
						<span style="color: rgb(128, 0, 128);">$document</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">ActiveWindow</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">Selection</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">{Style} </span>
						<span style="color: rgb(0, 0, 0);">=</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(128, 0, 128);">$cur_style</span>
						<span style="color: rgb(0, 0, 0);">;<br />    </span>
						<span style="color: rgb(128, 0, 128);">$selection</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">TypeText( </span>
						<span style="color: rgb(128, 0, 128);">$textundo</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">get( </span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">1.0</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0);">,</span>
						<span style="color: rgb(0, 0, 0);"> </span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">end</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0);"> ) );<br />    </span>
						<span style="color: rgb(128, 0, 128);">$word</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">ActiveDocument</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">PrintOut;<br />    </span>
						<span style="color: rgb(128, 0, 128);">$document</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">SaveAs(</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">printout.doc</span>
						<span style="color: rgb(0, 0, 0); font-weight: bold;">'</span>
						<span style="color: rgb(0, 0, 0);">);<br />    </span>
						<span style="color: rgb(128, 0, 128);">$document</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 255);">Close</span>
						<span style="color: rgb(0, 0, 0);">;<br />    </span>
						<span style="color: rgb(128, 0, 128);">$word</span>
						<span style="color: rgb(0, 0, 0);">-&gt;</span>
						<span style="color: rgb(0, 0, 0);">Quit;<br />}</span>
				</font>
		</div>
		<font face="Courier New">因为tk下的font和word中的有些不兼容，所以做了一些变换，比如说对于slant，tk是用‘italic’和‘roman’的，相对于word就是布尔值了。</font>
		<br />
<img src ="http://www.cnitblog.com/gyn/aggbug/48781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2008-09-06 14:29 <a href="http://www.cnitblog.com/gyn/archive/2008/09/06/48781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修改pTk组件两则小记（ToolBar, DateEntry）</title><link>http://www.cnitblog.com/gyn/archive/2008/09/02/48604.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Tue, 02 Sep 2008 00:11:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/09/02/48604.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/48604.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/09/02/48604.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/48604.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/48604.html</trackback:ping><description><![CDATA[这里讲的两个都是非标准组件，所以一般都是建立在标准的pTk组件之上的，由纯perl代码写成的，因此也便于修改。<br />第一个是ToolBar，就是文件浏览器中的在菜单栏之下的，一般叫工具栏。pTk中的ToolBar标准支持Button，Label，LabEntry，OptionMenu和自带的一个separator（这个还是很有用的）。如果要加入其他的组件，比如BrowseEntry，pack之后会被ToolBar放到工具栏的第二行上，很不方便。现在我们来看看ToolBar.pm，里面到底是怎么处理标准支持的。搜索到ToolLabel的sub，里面的代码如下：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);"> 1</span> <span style="color: rgb(0, 0, 255);">sub</span><span style="color: rgb(0, 0, 0);"> ToolLabel {<br /></span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">my</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">$self</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">shift</span><span style="color: rgb(0, 0, 0);">;<br /></span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">my</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">$l</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">$self</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">{CONTAINER}</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">Label(</span><span style="color: rgb(128, 0, 128);">@_</span><span style="color: rgb(0, 0, 0);">);</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">push</span><span style="color: rgb(0, 0, 0);"> @{</span><span style="color: rgb(128, 0, 128);">$self</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">{WIDGETS}} </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">$l</span><span style="color: rgb(0, 0, 0);">;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(128, 0, 128);">$self</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">_packWidget(</span><span style="color: rgb(128, 0, 128);">$l</span><span style="color: rgb(0, 0, 0);">);</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">$l</span><span style="color: rgb(0, 0, 0);">;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 7</span><span style="color: rgb(0, 0, 0);"> }</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 128, 128);"></span><span style="color: rgb(0, 0, 0);"><br /></span></div>对比其他的几个sub，我可以很肯定，只要将第四行中的Label改成BrowseEntry就可以了，这里缺少的一行是关于tip的，对于BrowseEntry来说，没有必要。<br />第二个是DateEntry。就是一个日期选择器，很多时候我们会用到它。我再使用的时候发现了一个问题，就是在显示月份的地方，出现了乱码，打开DateEntry.pm一看，找到如下一段：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);">1</span> <span style="color: rgb(0, 0, 0);">    </span><span style="color: rgb(0, 0, 255);">my</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">$monthlabel</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">defined</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">strftime<br /></span><span style="color: rgb(0, 128, 128);">2</span> <span style="color: rgb(0, 0, 0);">              </span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);"> strftime(</span><span style="color: rgb(128, 0, 128);">$w</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">cget(</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">-headingfmt</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">3</span> <span style="color: rgb(0, 0, 0);">                     </span><span style="color: rgb(128, 0, 128);">$w</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">{_month}</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(128, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 128);">$w</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">{_year}</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(128, 0, 0);">1900</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">4</span> <span style="color: rgb(0, 0, 0);">              </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">$w</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">{_month} </span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0); font-weight: bold;">/</span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">$w</span><span style="color: rgb(0, 0, 0);">-&gt;</span><span style="color: rgb(0, 0, 0);">{_year}<br /></span><span style="color: rgb(0, 128, 128);">5</span> <span style="color: rgb(0, 0, 0);">             );</span></div>显然，它是用了<span style="color: rgb(0, 0, 0);">strftime这个函数，去除选择，直接用</span>冒号后的形式即可。<br />还有，如何让在日期控件中的日期按钮被按下的时候响应一个事件。作为一般的控件这是一个必要的功能，但是在DateEntry中却没有，查看了源代码，原来是回调了用于更新标签和关闭的selectDay函数。这么作是很不负责任的，如果不修改源代码，我们就不得不在此控件旁添加一个按钮用于触发事件，这样一来不美观，而来更重要的是不符合一般的使用习惯。为此需要在ConfigSpec中添加一个-btncommand的标签，并在selectDay中回调。<br /><br /><br /><img src ="http://www.cnitblog.com/gyn/aggbug/48604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2008-09-02 08:11 <a href="http://www.cnitblog.com/gyn/archive/2008/09/02/48604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于ARP病毒防护的一些想法</title><link>http://www.cnitblog.com/gyn/archive/2008/08/26/48363.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Mon, 25 Aug 2008 23:55:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/08/26/48363.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/48363.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/08/26/48363.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/48363.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/48363.html</trackback:ping><description><![CDATA[
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="ProgId" content="Word.Document" />
		<meta name="Generator" content="Microsoft Word 11" />
		<meta name="Originator" content="Microsoft Word 11" />
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<o:smarttagtype namespaceuri="urn:schemas-microsoft-com:office:smarttags" name="chsdate">
		</o:smarttagtype>
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<!--[if !mso]><object
 classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui></object>
<style>
st1\:*{behavior:url(#ieooui) }
</style>
<![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:Arial;
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
h3
	{mso-style-next:正文;
	margin-top:13.0pt;
	margin-right:0cm;
	margin-bottom:13.0pt;
	margin-left:0cm;
	text-align:justify;
	text-justify:inter-ideograph;
	line-height:173%;
	mso-pagination:lines-together;
	page-break-after:avoid;
	mso-outline-level:3;
	font-size:16.0pt;
	font-family:Arial;
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
a:link, span.MsoHyperlink
	{color:blue;
	text-decoration:underline;
	text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
	{color:purple;
	text-decoration:underline;
	text-underline:single;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:42.55pt;
	mso-footer-margin:49.6pt;
	mso-paper-source:0;
	layout-grid:15.6pt;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<h3 style="text-align: center;" align="center">
				<span style="font-family: 黑体;">前言</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</h3>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">大约是在三年前的时候，第一次碰到</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">病毒，当时的情况现在依然历历在目。不断的有人断网，之后范围越来越扩大，重启了交换机之后好了一段时间，接着又开始不正常，周而复始。后来在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">net130</span>
				<span style="font-family: 黑体;">的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">BBS</span>
				<span style="font-family: 黑体;">上有人说是</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">病毒，针对于我的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">huawei3526e</span>
				<span style="font-family: 黑体;">可以使用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">display
log</span>
				<span style="font-family: 黑体;">的命令来查看具体的冲突源发生在哪里，于是问题很快就解决了。之后的日子里为了快速定位，统计了全台的电脑</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">mac</span>
				<span style="font-family: 黑体;">地址，这样粗粗算来大约也有</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">300</span>
				<span style="font-family: 黑体;">多台的电脑了。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<h3 style="text-align: center;" align="center">
				<span style="font-family: 黑体;">什么是</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">病毒</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</h3>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">首先要说一下什么是</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">协议。在局域网中，网络中实际传输的是</span>
				<span style="font-family: 黑体;">“</span>
				<span style="font-family: 黑体;">帧</span>
				<span style="font-family: 黑体;">”</span>
				<span style="font-family: 黑体;">，帧里面是有目标主机的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">地址的。在以太网中，一个主机要和另一个主机进行直接通信，必须要知道目标主机的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
MAC</span>
				<span style="font-family: 黑体;">地址。但这个目标</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">地址是如何获得的呢？它就是通过地址解析协议获得的。所谓</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">“</span>
				<span style="font-family: 黑体;">地址解析</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">”</span>
				<span style="font-family: 黑体;">就是主机在发送帧前将目标</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">IP</span>
				<span style="font-family: 黑体;">地址转换成目标</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">地</span>
				<span style="font-family: &quot;Courier New&quot;;">
				</span>
				<span style="font-family: 黑体;">址的过程。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">协议的基本功能就是通过目标设备的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">IP</span>
				<span style="font-family: 黑体;">地址，查询目标设备的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">地址，以保证通信的顺利进行。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">病毒通过发送伪装的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">包，欺骗交换机或者本网段内的邻居电脑，将</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">地址与</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">IP</span>
				<span style="font-family: 黑体;">地址的对应关系更改为自身，从而达到截取数据包、盗取密码等目的。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">就如我在上面讲到的，</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">病毒发作的特点是会导致某个网段的瘫痪，对于不同的网段间一般来说是不会传染的。当然也有可能导致其他网段阻塞，这是因为过多的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">包可能大量占用交换机</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">CPU</span>
				<span style="font-family: 黑体;">资源，并使其死机。我有一次如此的经历，一个网段中同时有两个</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">病毒源，结果交换机</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">CPU</span>
				<span style="font-family: 黑体;">使用率达到了</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">99%</span>
				<span style="font-family: 黑体;">，所有网段全部瘫痪，甚至无法</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">telnet</span>
				<span style="font-family: 黑体;">登陆，最后使用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">console</span>
				<span style="font-family: 黑体;">线恢复的系统。这些只是表面现象，病毒源还通过解析捕获的数据包，极有可能获取重要的信息和密码，导致隐私被泄露、密码被盗取等等。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">病毒是局域网内部安全最大的威胁者，如何能有效地防护关系到工作正常地开展，因此需要从原理上对其有深入的理解，并且针对不同的表现，作出及时、有效判断和处理，同时针对不同的场合、情况，做好防范的工作。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<h3 style="text-align: center;" align="center">
				<span style="font-family: 黑体;">如何快速定位</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">病毒源</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</h3>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">这个基本上是一个力气活，为什么这么说呢？因为即便是可以通过各种手段获得病毒源的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">地址，但是这个</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">所对应的电脑是属于谁的，具体的物理位置在哪里，这就不得而知了。所以事先不得不做一些必要的调查工作，统计每一台电脑的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">地址、位置和所属的人员。之后做一张表，最好是存在数据库中，这样以后可以做一个查询系统。但不是制作完成这张表就万事大吉了，还要定期维护，尤其是在部门变动和人员轮换的时候，可能需要重新做这样的统计。对于有</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">400</span>
				<span style="font-family: 黑体;">台以上电脑的网络来说，这显然不是一件轻松的工作。当然，这也是没有办法的。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">这是针对于</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">病毒已经发作而采用的应急预案，对于平时的维护，最好是可以做一些预防的工作，这样可以有效地减少此类事件的发生，无论对管理者还是使用人员，都可以感到轻松一些。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<h3 style="text-align: center;" align="center">
				<span style="font-family: 黑体;">预防</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">病毒发作的几个方法</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</h3>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">不同的网络有其不同的特点，因此对于其中发生的病毒事件也有着不一样的预防方法。针对于</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">病毒而言，网上流传着一种似乎很</span>
				<span style="font-family: 黑体;">“</span>
				<span style="font-family: 黑体;">神奇</span>
				<span style="font-family: 黑体;">”</span>
				<span style="font-family: 黑体;">的办法，甚至被一些专业人士奉为一种有效的解决方案。具体是这样：在网关上绑定每一台电脑的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">和</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">IP</span>
				<span style="font-family: 黑体;">地址，然后在每台电脑绑定到网管的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">和</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">IP</span>
				<span style="font-family: 黑体;">。举例如下：</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">arp
–s 192.168.0.1 00-17-16-00-88-ad</span>
				<span style="font-family: 黑体;">。很明显这里有漏洞。首先这个命令是</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">windows</span>
				<span style="font-family: 黑体;">下的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">arp</span>
				<span style="font-family: 黑体;">绑定指令，并适合其他的操作系统。第二，这个网络结构的网关是一台安装了</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">windows</span>
				<span style="font-family: 黑体;">的电脑，不适合使用交换机的局域网。所以说，这个办法是应用于</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">windows</span>
				<span style="font-family: 黑体;">操作系统的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">NAT</span>
				<span style="font-family: 黑体;">单网段结构。事实上，它只是提供了一个思路，就是说要在路由端和客户端做双向的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">解析绑定，这样就从根本上消除了</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">病毒的根源，即</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">解析。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">对于使用交换机的网络，我们可以在交换机上绑定其下每一个网段中，每一台电脑的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">和</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">IP</span>
				<span style="font-family: 黑体;">地址，然后关闭交换机的动态</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">APR</span>
				<span style="font-family: 黑体;">功能；之后在每一台电脑上，针对不同的操作系统，使用不同的指令完成网关</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">和</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">IP
</span>
				<span style="font-family: 黑体;">的绑定。但还是和定位病毒时所遇到的困难一样，这样很费劲，而且需要不断地维护。当然，就目前的情况看来这是一种效果很好的办法，而且可以使用在绝大多数不同的网络结构中。以前我写过一个这样的解决方案，里面有很详细的配置步骤，可以到我的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">blog</span>
				<span style="font-family: 黑体;">（</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<a href="../../gyn">http://www.cnitblog.com/gyn</a>
				</span>
				<span style="font-family: 黑体;">）上查阅。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">还有一种比较商业化的防御办法，就是设置</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">病毒防火墙，即是在交换机之前架设一台监控过滤器，对于检测到的威胁来源进行封锁。有些解决方案可能还会在客户端安装一个监控小软件，但这其实是有风险的，因为对于这样的解决方案，如果一旦客户端受到病毒攻击，可能使得该软件被破坏，从而导致监控失效。其实这样的商业解决方案，将其分解开来，每一个模块都是很容易实现的。首先，在防火墙上设置网管和路由，保证数据的正常进出，在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">windows</span>
				<span style="font-family: 黑体;">和</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">linux</span>
				<span style="font-family: 黑体;">下都有</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">route</span>
				<span style="font-family: 黑体;">指令来完成该功能；第二，需要一个抓包的工具，通过它来检测网络中的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">包，并对其进行分析，可以使用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">pcap</span>
				<span style="font-family: 黑体;">工具；第三，针对分析得到的结果，比如说一个病毒源，使用一定的手段对其封锁，在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">linux</span>
				<span style="font-family: 黑体;">环境相可以使用强大的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">iptables</span>
				<span style="font-family: 黑体;">。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<h3 style="text-align: center;" align="center">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">防火墙实现的几点细节</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</h3>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">针对于以上描述的三个模块，可以具体实现如下：</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">首先是抓包的实现。在类</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">unix</span>
				<span style="font-family: 黑体;">的操作系统之下可以使用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">pcap</span>
				<span style="font-family: 黑体;">，在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">windows</span>
				<span style="font-family: 黑体;">下有</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">winpcap</span>
				<span style="font-family: 黑体;">，功能都是类似的，但又都非常强大。这里以</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">windows</span>
				<span style="font-family: 黑体;">为例，编程工具使用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ActivePerl<st1:chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on">5.8.8</st1:chsdate></span>
				<span style="font-family: 黑体;">。第一步，到</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<a href="http://www.winpcap.org/install/default.htm">http://www.winpcap.org/install/default.htm</a>
				</span>
				<span style="font-family: 黑体;">下载最新的版本，然后安装。第二，在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ppm</span>
				<span style="font-family: 黑体;">下安装</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">NetPacket</span>
				<span style="font-family: 黑体;">网络数据包解析工具和</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Net-Pcap</span>
				<span style="font-family: 黑体;">及其它的简化工具</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Net-PcapUtil</span>
				<span style="font-family: 黑体;">，其中后两者的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ppd</span>
				<span style="font-family: 黑体;">文件在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<a href="http://www.bribes.org/perl/ppm/Net-Pcap.ppd" target="_blank">http://www.bribes.org/perl/ppm/Net-Pcap.ppd</a>
				</span>
				<span style="font-family: 黑体;">和</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<a href="http://www.bribes.org/perl/ppm/Net-PcapUtils.ppd" target="_blank">http://www.bribes.org/perl/ppm/Net-PcapUtils.ppd</a>
				</span>
				<span style="font-family: 黑体;">中。之后参照安装之后生成的帮助文档，我们就可以开始着手抓包了。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">关键是下面这个</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Net::PcapUtil</span>
				<span style="font-family: 黑体;">中的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">loop</span>
				<span style="font-family: 黑体;">方法，该方法启动一个循环检测，将符合过滤要求的包送给处理程序进行分析。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<div style="border: 1pt solid windowtext; padding: 1pt 4pt;">
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 17.95pt;">
						<a name="loop">
								<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Net::PcapUtils::loop(\&amp;callback_fn,
[ARG =&gt; value]);</span>
						</a>
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</p>
		</div>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">callback_fn</span>
				<span style="font-family: 黑体;">就是包处理程序。其中</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARG</span>
				<span style="font-family: 黑体;">是如下结构的一下哈希表：</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<div style="border: 1pt solid windowtext; padding: 1pt 4pt;">
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">    </span>my %args = (<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">        </span>SNAPLEN =&gt; 100,<span style="">         </span># Num bytes to capture from packet<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">        </span>PROMISC =&gt; 1,<span style="">           </span># Operate in promiscuous mode?<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">        </span>TIMEOUT =&gt; 1000,<span style="">        </span># Read timeout (ms)<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">        </span>NUMPACKETS =&gt; -1,<span style="">      </span><span style=""> </span>#
Pkts to read (-1 = loop forever)<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">        </span>FILTER =&gt; '',<span style="">           </span># Filter string<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">        </span>USERDATA =&gt; '',<span style="">         </span># Passed as first arg to callback fn<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">        </span>SAVEFILE =&gt; '',<span style="">         </span># Default save file<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">        </span>DEV =&gt; '',<span style="">              </span># Network interface to open<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">        </span>);<o:p></o:p></span>
				</p>
		</div>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">需要注意的两点，其一是</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">FILTER</span>
				<span style="font-family: 黑体;">，包过滤器，具体的语法可以到</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">winpcap</span>
				<span style="font-family: 黑体;">手册中查询。这里使用了“</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">arp or rarp</span>
				<span style="font-family: 黑体;">”，即是只抓取</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">arp</span>
				<span style="font-family: 黑体;">和反向</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">arp</span>
				<span style="font-family: 黑体;">解析的包。其二是</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">DEV</span>
				<span style="font-family: 黑体;">，需要使用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">Net::Pcap::findalldevs(\$err)</span>
				<span style="font-family: 黑体;">来得到本机的网络设备列表，因为有宽带连接的存在，本地连接会被放在比较靠后的位置，一般会是在最后一位。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">抓到包之后，就要对其进行解析。这里要用到</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">NetPacket</span>
				<span style="font-family: 黑体;">，它提供了针对不同网络层次的包的分析工具。局域网中的“帧”数据以太网层的数据，所以先要使用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">NetPacket::Ethernet</span>
				<span style="font-family: 黑体;">得到其中的有效数据，之后再使用</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">NetPacket::ARP</span>
				<span style="font-family: 黑体;">得到其中的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">和</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">IP</span>
				<span style="font-family: 黑体;">对应关系。如果对于相同的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">地址，存在不同的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">IP</span>
				<span style="font-family: 黑体;">地址映射，那么我们就可以确定该</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">地址即是病毒源。为了防止</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">伪装，还可以增加在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ethernet</span>
				<span style="font-family: 黑体;">中的检验。但是因为</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">IP</span>
				<span style="font-family: 黑体;">地址是以八进制的形式存储的，为了方便阅读和进一步利用，需要做一些转换，使其变现为</span>
				<span style="font-family: 黑体;">点分十进制</span>
				<span style="font-family: 黑体;">。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<div style="border: 1pt solid windowtext; padding: 1pt 4pt;">
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 17.95pt;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">sub sap_to_ip {<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 35.9pt;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">
								</span>my
$spa = shift;<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 35.9pt;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">
								</span>my
$ip;<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 35.9pt;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">
								</span>for
my $idx (0, 2, 4, 6) {<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 35.9pt;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">     </span>$ip
.= oct('0x' . substr($spa, $idx, 2)) . '.';<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 35.9pt;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">
								</span>}<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 35.9pt;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
								<span style="">
								</span>return
substr($ip, 0, length($ip) - 1);<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 21pt;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">}<o:p></o:p></span>
				</p>
		</div>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">第二，对于得到的病毒源</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">地址，经过一定的处理之后，交由</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">iptables</span>
				<span style="font-family: 黑体;">进行进一步的处理。在这里我们要用到基于</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">地址的匹配，可以使用如下的指令：</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<div style="border: 1pt solid windowtext; padding: 1pt 4pt;">
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 17.95pt;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">iptables
-A INPUT -m mac --mac-source xx:xx:xx:xx:xx:xx –j DROP<o:p></o:p></span>
				</p>
		</div>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">这表示，在</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">INPUT</span>
				<span style="font-family: 黑体;">链中，丢弃所有源</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MAC</span>
				<span style="font-family: 黑体;">地址为“</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">xx:xx:xx:xx:xx:xx</span>
				<span style="font-family: 黑体;">”的包。这样就封锁了所有来自病毒源的数据和请求，包括</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">请求。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">第三，完成网关的路由功能。相比较原先的网络结构，建立了防火墙的子网，需要将网关由交换机移到防火墙上。根据防火墙连接子网的数量，防火墙上应该配有相应数量的网卡或者说是网络接口。对于单子网的结构，在这里需要两块网卡。首先，假设子网的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">IP</span>
				<span style="font-family: 黑体;">段为</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">192.168.138.0/24,</span>
				<span style="font-family: 黑体;">交换机中的内部连接网络为</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">192.168.65.0/24</span>
				<span style="font-family: 黑体;">，那么我们需要在防火墙中做如下的配置：</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<div style="border: 1pt solid windowtext; padding: 1pt 4pt;">
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 17.95pt;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ifconfig eht0 192.168.65.21 netmask
255.255.255.0<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 17.95pt;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">route add –net 192.168.65.0 netmask
255.255.255.0<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 17.95pt;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ifconfig eth1 192.168.138.65 netmask
255.255.255.0<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 17.95pt;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">route add –net 192.168.138.0 netmask
255.255.255.0<o:p></o:p></span>
				</p>
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-indent: 17.95pt;">
						<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">route add default gw 192.168.65.25<o:p></o:p></span>
				</p>
		</div>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">子网“</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">192.168.138.0</span>
				<span style="font-family: 黑体;">”中的所有的数据将通过转发，从而交给上层交换机中的</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">IP</span>
				<span style="font-family: 黑体;">地址“</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">192.168.65.25</span>
				<span style="font-family: 黑体;">”，这样就完成了路由功能。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<h3 style="text-align: center;" align="center">
				<span style="font-family: 黑体;">结束语</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</h3>
		<p class="MsoNormal" style="text-indent: 17.95pt;">
				<span style="font-family: 黑体;">局域网的管理，最重要的还是要理解这些问题发生背后的原因，以及相关的一些概念和原理，只有这样才能从根本上找出解决的办法，举一反三、触类旁通。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ARP</span>
				<span style="font-family: 黑体;">病毒的防护只是一个例子，它不仅仅需要网络相关的知识，还需要熟悉一些操作系统指令，这些东西都是一个系统的，因此在平时的工作中在深入专业知识的同时，要注意拓展知识的面，从而更好地应对不断进步的科技发展及其中带来和出现的一些问题。</span>
				<span style="font-family: &quot;Courier New&quot;;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/48363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2008-08-26 07:55 <a href="http://www.cnitblog.com/gyn/archive/2008/08/26/48363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件结构保护系统概述</title><link>http://www.cnitblog.com/gyn/archive/2008/08/25/48328.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Mon, 25 Aug 2008 01:27:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/08/25/48328.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/48328.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/08/25/48328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/48328.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/48328.html</trackback:ping><description><![CDATA[
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="ProgId" content="Word.Document" />
		<meta name="Generator" content="Microsoft Word 11" />
		<meta name="Originator" content="Microsoft Word 11" />
		<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
		<!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
 </w:WordDocument>
</xml><![endif]-->
		<!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" LatentStyleCount="156">
 </w:LatentStyles>
</xml><![endif]-->
		<style>
				<!--
 /* Font Definitions */
 @font-face
	{font-family:黑体;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimHei;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
@font-face
	{font-family:"\@黑体";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:1 135135232 16 0 262144 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:12.0pt;
	font-family:"Courier New";
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
h3
	{mso-style-next:正文;
	margin-top:13.0pt;
	margin-right:0cm;
	margin-bottom:13.0pt;
	margin-left:0cm;
	text-align:justify;
	text-justify:inter-ideograph;
	line-height:173%;
	mso-pagination:lines-together;
	page-break-after:avoid;
	mso-outline-level:3;
	font-size:16.0pt;
	font-family:"Courier New";
	mso-fareast-font-family:黑体;
	mso-bidi-font-family:"Times New Roman";
	mso-font-kerning:1.0pt;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page Section1
	{size:595.3pt 841.9pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:42.55pt;
	mso-footer-margin:49.6pt;
	mso-paper-source:0;
	layout-grid:15.6pt;}
div.Section1
	{page:Section1;}
-->
		</style>
		<!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.0pt;
	font-family:"Times New Roman";
	mso-fareast-font-family:"Times New Roman";
	mso-ansi-language:#0400;
	mso-fareast-language:#0400;
	mso-bidi-language:#0400;}
</style>
<![endif]-->
		<h3 style="text-align: center;" align="center">
				<span style="font-family: 黑体;">引入文件结构保护的原因</span>
		</h3>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">随着越来越多的工作、数据被迁移到服务器及存储上，对于这些作为业务基础的软硬件的安全性和可靠性，我们需要提高关注度，并在尽可能的范围内提高这种可靠性，以保障工作的平稳顺利开展。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">针对不同的内容，我们可以采取不同的安全保障策略。比方说，对于服务器的灾难恢复，比较方便而合适的办法是用双机热备，备机通过监视主机运行状况，实现尽可能快地恢复服务。而对于资料的存储，我们多是会选择一些实践证明了的比较可靠的数据备份和恢复方法，这些方法多是基于某种特定的数据库的，或者是数据库自身提供的。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">以上两点内容是大多数管理者想得到并且可以做得不错的，我们常常会忽略一点是，作为提供某种服务的程序本身的安全性。打个比方说，提供</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">web</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">服务的</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">apache</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">，其配置和一些附属的文件可能遭到破坏，而且即便是有操作系统锁级的保护，进程也可能被恶意停止，进而破坏文件。拓展开来讲，任何以文件或者文件树形式存储的数据的安全性，一向被忽略。其结果是，我们不得不重新安装服务并配置参数，这不是一项轻松的工作，尤其是对于一些复杂的程序而言。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">虽然针对不同服务的保护各不相同，但一般都需要涉及到对于该服务的文件结构保护，在此基础上在做一些进程的恢复工作等。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<h3 style="text-align: center;" align="center">
				<span style="font-family: 黑体;">文件结构保护系统的架构</span>
		</h3>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">除了必要的防杀毒软件之外，还需要一些更一般的保护手段，因为病毒库的更新总是有滞后性的。这些手段包括建立文件结构信息备份、实时监控和文件恢复等。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">首先，在确定系统一切正常的前提下，对于需要进行保护的文件结构，我们需要采集能唯一标识该结构的必要信息，至少包括一个描述文件结构的数据结构和在其中每一个文件的唯一标记。就前者而言，可以是一个多叉树或者向量，这个根据不同的工具的特性具体而定；文件唯一标记可以通过计算整个文件的</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">md5</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">码来得到，这也是现阶段在网络上发布文件尤其是大型文件时，保证文件完整性的一个通用做法，比如说</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">ubuntu</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">的发布。除了多叉树或向量数据结构需要驻留本地之外，其他的必要信息连同文件结构中所有有效文件将存储到一个可以保证安全的位置，这个位置一般是一台被隔离的服务器，通过有限的端口与存在受保护文件结构的服务器相连接，也就是监控端。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">完成了文件结构的备份之后，将建立服务器之间的监控关系。因为文件遍历的本地性特点，所以主逻辑即数据结构与文件结构之间的比较需要在被监控段实现。根据比较之后的结果，包括被恶意添加或删除的文件，做出是否恢复或删除的决定。而具体到每一个文件的完整性检测，则需要被监测端将当前次文件遍历中得到的</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">md5</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">码，发送至监测端进行比较。因此，从最终的实现来看，服务器两端之间的关系并不能完全用监控来描述，事实上被监控端将负责起遍历文件结构的工作，而监控端将主要负责</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">md5</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">码比较和文件恢复的功能。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">最后在监控端，通过一定的途径连接监控程序和备份信息，实现文件按顺序有效地回传，这样就基本上形成了一个文件结构保护系统的框架。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<h3 style="text-align: center;" align="center">
				<span style="font-family: 黑体;">需要注意的一些细节</span>
		</h3>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">文件结构信息的采集需要在系统建立之初就准备就绪，然后通过人工拷贝的方法移植到监控端。这个采集过程相对来说比较简单，只需要一次文件结构的遍历就可以实现。监控端的信息存储可以考虑使用数据库，而在存储文件的时候，根据具体的回传特点可以直接存储在文件系统之下或者以</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">blob</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">的形式存入数据库。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">相比于略显简单的初始化，保护系统实现的关键环节在于文件结构与数据结构的比较以及如何准确地回传文件。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">首先数据结构的建立需要在保护系统启动的初始化环节完成，之后它将作为整个系统运行的基础，循环地将文件结构与它进行对比。而该对比过程可以通过两种方法来实现。第一：两次遍历，即数据结构和文件结构遍历。这么做的好处是实现难度不大，尤其是在文件结构遍历部分，可以任意选择深度或广度遍历。但是针对遍历中每个节点遇到的文件或文件夹，不得不查询一次数据结构，对于设计不佳的数据结构，这么做的结果可能又是一次遍历，这就增加了运行的时长。第二：一次遍历，即在数据结构和文件结构同时以一种相对协调的步调向下遍历。这里所说的向下即是说，需要在完成本层次遍历的基础上才能继续下一个层次，也就是层次优先遍历。这样的做法需要在设计上保证数据结构与文件结构具有类似性，而对于层次的控制也完全依靠人工逻辑完成，但在运行上将获得比前一种方法快一个数量级以上的优势。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">在文件回传方面，由于存在很大可能性是需要恢复的一个文件列表，所以应准确控制其中每一个文件恢复的启动与截至。可以采用架设</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">ftp</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">服务器的方法，在传输单文件时阻塞本地剩余传输队列中的文件。在这里采用了这种模式，但未直接使用</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">ftp</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">，而是采用了一种简化的模拟方式：被监控端维护一个文件处理队列，通过阻塞的方式和先进先出的顺序来处理</span>
				<span style="line-height: 125%; font-family: 黑体;">文件句柄</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">；建立了两个</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">socket</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">连接，其中之一在监控端接受被监控端发出的指令并启动数据传输，另一个在被监控端接受来自监控端的文件传输完成信号并关闭本地文件句柄，然后通知启动下一个文件传输。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<h3 style="text-align: center;" align="center">
				<span lang="EN-US">Perl</span>
				<span style="font-family: 黑体;">实现的几点建议</span>
		</h3>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;">一：</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">对于这种通过网络来连接的服务，整体的框架可以考虑使用</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">poe</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">，这将极大地减少底层代码的维护量，而将精力主要集中到业务逻辑的实现上来。尤其是在合理利用</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">component</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">的情况下，一段几十行的</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">socket</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">代码可能会被压缩为短短几行。更为重要的是，</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">poe</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">在单线程内实现了多任务模式，虽然依旧会阻塞在长任务执行过程中，但这方便各个任务之间信息的传递和资源的共享。对于未来其他模块功能的增加，也</span>
				<span style="line-height: 125%; font-family: 黑体;">提供了</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">一个可扩展的基础。比如，需要为客户端提供一个可视的操作界面，只需引入</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">Tk</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">，</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">poe</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">会在变量表中自动添加根元素</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">$poe_main_window</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;">二：</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">由于文件结构信息的量一般不是很大，因此在事先未安装其他数据库的情况下，信息的存储可以考虑使用轻量级的</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">sqlite</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">。它没有守护进程，一般以嵌入的形式</span>
				<span style="line-height: 125%; font-family: 黑体;">服务</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">于各个</span>
				<span style="line-height: 125%; font-family: 黑体;">任务</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">中。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;">三：</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">体现文件结构逻辑的数据结构，可以使用</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">hash</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">表来实现，在这里</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">hash</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">表起得是多叉树的作用。打个比方，针对绝对路径</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<div style="border: 1pt solid windowtext; padding: 1pt 4pt;">
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
						<span style="line-height: 125%; font-family: Arial;" lang="EN-US">d:\sources\perl\frs\md5_check.pl<o:p></o:p></span>
				</p>
		</div>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">其数据结构将是</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">:<o:p></o:p></span>
		</p>
		<div style="border: 1pt solid windowtext; padding: 1pt 4pt;">
				<p class="MsoNormal" style="border: medium none ; padding: 0cm; text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
						<span style="line-height: 125%; font-family: Arial;" lang="EN-US">$base-&gt;{d}-&gt;{sources}-&gt;{perl}-&gt;{frs}-&gt;{md5_check.pl}
= ’f’<o:p></o:p></span>
				</p>
		</div>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">也就是说任意的目录是一个</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">hash</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">引用，而最终的文件节点是一个内容为“</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">f</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">”的</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">text</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">变量。那么在遍历时，就可以通过</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">ref</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">节点类型来判断是目录还是文件。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="text-align: left; text-indent: 17.95pt; line-height: 125%;" align="left">
				<span style="line-height: 125%; font-family: 黑体;">四：</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">在处理关闭文件传输的指令时，可以考虑使用</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">ikc</span>
				<span style="line-height: 125%; font-family: 黑体;" lang="AR-SA">来远程调用本地指令，这实际上是简化了由远程发指令、本地翻译再到本地指令执行这一连串的过程，用在这里也方便未来丰富远程指令。</span>
				<span style="line-height: 125%; font-family: Arial;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
<img src ="http://www.cnitblog.com/gyn/aggbug/48328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gyn/" target="_blank">gyn_tadao</a> 2008-08-25 09:27 <a href="http://www.cnitblog.com/gyn/archive/2008/08/25/48328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>perl and Net::Pcap</title><link>http://www.cnitblog.com/gyn/archive/2008/07/27/47179.html</link><dc:creator>gyn_tadao</dc:creator><author>gyn_tadao</author><pubDate>Sun, 27 Jul 2008 12:49:00 GMT</pubDate><guid>http://www.cnitblog.com/gyn/archive/2008/07/27/47179.html</guid><wfw:comment>http://www.cnitblog.com/gyn/comments/47179.html</wfw:comment><comments>http://www.cnitblog.com/gyn/archive/2008/07/27/47179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gyn/comments/commentRss/47179.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gyn/services/trackbacks/47179.html</trackback:ping><description><![CDATA[原文在http://www.perlmonks.org/index.pl?node_id=170648里，代码抄了一遍。<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">use</span><span style="color: rgb(0, 0, 0);"> Net</span><span style="color: rgb(0, 0, 0);">::</span><span style="color: rgb(0, 0, 0);">Pcap;<br /></span><span style="color: rgb(0, 0, 255);">use</span><span style="color: rgb(0, 0, 0);"> NetPacket</span><span style="color: rgb(0, 0, 0);">::</span><span style="color: rgb(0, 0, 0);">Ethernet;<br /></span><span style="color: rgb(0, 0, 255);">use</span><span style="color: rgb(0, 0, 0);"> NetPacket</span><span style="color: rgb(0, 0, 0);">::</span><span style="color: rgb(0, 0, 0);">IP;<br /></span><span style="color: rgb(0, 0, 255);">use</span><span style="color: rgb(0, 0, 0);"> NetPacket</span><span style="color: rgb(0, 0, 0);">::</span><span style="color: rgb(0, 0, 0);">TCP;<br /></span><span style="color: rgb(0, 0, 255);">use</span><span style="color: rgb(0, 0, 0);"> strict;<br /><br /></span><span style="color: rgb(0, 0, 255);">my</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">$err</span><span style="color: rgb(0, 0, 0);">;<br /><br /></span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">  Use network device passed in program argments or if no<br />#  argument is passed, determine an appropriate network<br />#  device fo packet sniffering using the<br />#  Net::Pcap::lookupdev method</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">my</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">$dev</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">$ARGV</span><span style="color: rgb(0, 0, 0);">[</span><span style="color: rgb(128, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">];<br /></span><span style="color: rgb(0, 0, 255);">unless</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">defined</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">$dev</span><span style="color: rgb(0, 0, 0);">) {<br />    </span><span style="color: rgb(0, 0, 255);">my</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">@devs</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> Net</span><span style="color: rgb(0, 0, 0);">::</span><span style="color: rgb(0, 0, 0);">Pcap</span><span style="color: rgb(0, 0, 0);">::</span><span style="color: rgb(0, 0, 0);">findalldevs(</span><span style="color: rgb(0, 0, 0);">\</span><span style="color: rgb(128, 0, 128);">$err</span><span style="color: rgb(0, 0, 0);">);<br />    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">defined</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">$err</span><span style="color: rgb(0, 0, 0);">) { </span><span style="color: rgb(0, 0, 255);">die</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">Unable to determine network device for monitoring - </span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 128);">$err</span><span style="color: rgb(0, 0, 0);">; }<br />    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (</span><span style="color: rgb(0, 0, 255);">length</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(128, 0, 128);">@devs</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">) { </span><span style="color: rgb(128, 0, 128);">$dev</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 