﻿<?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>C++博客-在路上</title><link>http://www.cppblog.com/andy851899/</link><description>五湖醉人</description><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 10:10:42 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 10:10:42 GMT</pubDate><ttl>60</ttl><item><title>Fedora 13  杂记</title><link>http://www.cppblog.com/andy851899/archive/2010/05/29/116662.html</link><dc:creator>五湖醉人</dc:creator><author>五湖醉人</author><pubDate>Fri, 28 May 2010 22:55:00 GMT</pubDate><guid>http://www.cppblog.com/andy851899/archive/2010/05/29/116662.html</guid><wfw:comment>http://www.cppblog.com/andy851899/comments/116662.html</wfw:comment><comments>http://www.cppblog.com/andy851899/archive/2010/05/29/116662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/andy851899/comments/commentRss/116662.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/andy851899/services/trackbacks/116662.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 刚装上Fedora 13，开始全面脱离Windows系统之旅，记录下疑难杂症及解决办法。&nbsp;&nbsp;<a href='http://www.cppblog.com/andy851899/archive/2010/05/29/116662.html'>阅读全文</a><img src ="http://www.cppblog.com/andy851899/aggbug/116662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/andy851899/" target="_blank">五湖醉人</a> 2010-05-29 06:55 <a href="http://www.cppblog.com/andy851899/archive/2010/05/29/116662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 时间函数用法 集合</title><link>http://www.cppblog.com/andy851899/archive/2009/10/26/99453.html</link><dc:creator>五湖醉人</dc:creator><author>五湖醉人</author><pubDate>Mon, 26 Oct 2009 01:27:00 GMT</pubDate><guid>http://www.cppblog.com/andy851899/archive/2009/10/26/99453.html</guid><wfw:comment>http://www.cppblog.com/andy851899/comments/99453.html</wfw:comment><comments>http://www.cppblog.com/andy851899/archive/2009/10/26/99453.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/andy851899/comments/commentRss/99453.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/andy851899/services/trackbacks/99453.html</trackback:ping><description><![CDATA[<p>对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型。&nbsp; </p>
<p>这里是一个使用日期函数的例子。下面的查询选择了所有记录，其date_col的值是在最后30天以内：&nbsp; </p>
<p>mysql&gt; SELECT something FROM table&nbsp; <br>WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) &lt;= 30;&nbsp; </p>
<p><strong>DAYOFWEEK(date)</strong>&nbsp; <br>返回日期date的星期索引(1=星期天，2=星期一, &#8230;&#8230;7=星期六)。这些索引值对应于ODBC标准。&nbsp; <br>mysql&gt; select DAYOFWEEK('1998-02-03');&nbsp; <br>-&gt; 3&nbsp; </p>
<p><strong>WEEKDAY(date)</strong>&nbsp; <br>返回date的星期索引(0=星期一，1=星期二, &#8230;&#8230;6= 星期天)。&nbsp; <br>mysql&gt; select WEEKDAY('1997-10-04 22:23:00');&nbsp; <br>-&gt; 5&nbsp; <br>mysql&gt; select WEEKDAY('1997-11-05');&nbsp; <br>-&gt; 2&nbsp; </p>
<p><strong>DAYOFMONTH(date)&nbsp; <br></strong>返回date的月份中日期，在1到31范围内。&nbsp; <br>mysql&gt; select DAYOFMONTH('1998-02-03');&nbsp; <br>-&gt; 3&nbsp; </p>
<p><strong>DAYOFYEAR(date)</strong>&nbsp; <br>返回date在一年中的日数, 在1到366范围内。&nbsp; <br>mysql&gt; select DAYOFYEAR('1998-02-03');&nbsp; <br>-&gt; 34&nbsp; </p>
<p><strong>MONTH(date)</strong>&nbsp; <br>返回date的月份，范围1到12。&nbsp; <br>mysql&gt; select MONTH('1998-02-03');&nbsp; <br>-&gt; 2&nbsp; </p>
<p><strong>DAYNAME(date)</strong>&nbsp; <br>返回date的星期名字。&nbsp; <br>mysql&gt; select DAYNAME("1998-02-05");&nbsp; <br>-&gt; 'Thursday'&nbsp; </p>
<p><strong>MONTHNAME(date)</strong>&nbsp; <br>返回date的月份名字。&nbsp; <br>mysql&gt; select MONTHNAME("1998-02-05");&nbsp; <br>-&gt; 'February'&nbsp; </p>
<p><strong>QUARTER(date)&nbsp;</strong> <br>返回date一年中的季度，范围1到4。&nbsp; <br>mysql&gt; select QUARTER('98-04-01');&nbsp; <br>-&gt; 2&nbsp; </p>
<p>WEEK(date)&nbsp; <br>　&nbsp; <br><strong>WEEK(date,first)</strong>&nbsp; <br>对于星期天是一周的第一天的地方，有一个单个参数，返回date的周数，范围在0到52。2个参数形式WEEK()允许你指定星期是否开始于星期天或星期一。如果第二个参数是0，星期从星期天开始，如果第二个参数是1，从星期一开始。&nbsp; <br>mysql&gt; select WEEK('1998-02-20');&nbsp; <br>-&gt; 7&nbsp; <br>mysql&gt; select WEEK('1998-02-20',0);&nbsp; <br>-&gt; 7&nbsp; <br>mysql&gt; select WEEK('1998-02-20',1);&nbsp; <br>-&gt; 8&nbsp; </p>
<p><strong>YEAR(date)</strong>&nbsp; <br>返回date的年份，范围在1000到9999。&nbsp; <br>mysql&gt; select YEAR('98-02-03');&nbsp; <br>-&gt; 1998&nbsp; </p>
<p><strong>HOUR(time)&nbsp; <br></strong>返回time的小时，范围是0到23。&nbsp; <br>mysql&gt; select HOUR('10:05:03');&nbsp; <br>-&gt; 10&nbsp; </p>
<p><strong>MINUTE(time)&nbsp; <br></strong>返回time的分钟，范围是0到59。&nbsp; <br>mysql&gt; select MINUTE('98-02-03 10:05:03');&nbsp; <br>-&gt; 5&nbsp; </p>
<p><strong>SECOND(time)&nbsp; <br></strong>回来time的秒数，范围是0到59。&nbsp; <br>mysql&gt; select SECOND('10:05:03');&nbsp; <br>-&gt; 3&nbsp; </p>
<p><strong>PERIOD_ADD(P,N)</strong>&nbsp; <br>增加N个月到阶段P（以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日期值。&nbsp; <br>mysql&gt; select PERIOD_ADD(9801,2);&nbsp; <br>-&gt; 199803&nbsp; </p>
<p><strong>PERIOD_DIFF(P1,P2)</strong>&nbsp; <br>返回在时期P1和P2之间月数，P1和P2应该以格式YYMM或YYYYMM。注意，时期参数P1和P2不是日期值。&nbsp; <br>mysql&gt; select PERIOD_DIFF(9802,199703);&nbsp; <br>-&gt; 11&nbsp; </p>
<p>DATE_ADD(date,INTERVAL expr type)&nbsp; <br>　&nbsp; <br>DATE_SUB(date,INTERVAL expr type)&nbsp; <br>　&nbsp; <br>ADDDATE(date,INTERVAL expr type)&nbsp; <br>　&nbsp; <br>SUBDATE(date,INTERVAL expr type)&nbsp; <br>这些功能执行日期运算。对于MySQL 3.22，他们是新的。ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同义词。 <br>在MySQL 3.23中，你可以使用+和-而不是DATE_ADD()和DATE_SUB()。（见例子）date是一个指定开始日期的 <br>DATETIME或DATE值，expr是指定加到开始日期或从开始日期减去的间隔值一个表达式，expr是一个字符串；它可以以 <br>一个&#8220;-&#8221;开始表示负间隔。type是一个关键词，指明表达式应该如何被解释。EXTRACT(type FROM date)函数从日期 <br>中返回&#8220;type&#8221;间隔。下表显示了type和expr参数怎样被关联： type值 含义 期望的expr格式&nbsp; <br>SECOND 秒 SECONDS&nbsp; <br>MINUTE 分钟 MINUTES&nbsp; <br>HOUR 时间 HOURS&nbsp; <br>DAY 天 DAYS&nbsp; <br>MONTH 月 MONTHS&nbsp; <br>YEAR 年 YEARS&nbsp; <br>MINUTE_SECOND 分钟和秒 "MINUTES:SECONDS"&nbsp; <br>HOUR_MINUTE 小时和分钟 "HOURS:MINUTES"&nbsp; <br>DAY_HOUR 天和小时 "DAYS HOURS"&nbsp; <br>YEAR_MONTH 年和月 "YEARS-MONTHS"&nbsp; <br>HOUR_SECOND 小时, 分钟， "HOURS:MINUTES:SECONDS"&nbsp; <br>DAY_MINUTE 天, 小时, 分钟 "DAYS HOURS:MINUTES"&nbsp; <br>DAY_SECOND 天, 小时, 分钟, 秒 "DAYS HOURS:MINUTES:SECONDS"&nbsp; </p>
<p>MySQL在expr格式中允许任何标点分隔符。表示显示的是建议的分隔符。如果date参数是一个DATE值并且你的计算仅仅包含YEAR、MONTH和DAY部分(即，没有时间部分)，结果是一个DATE值。否则结果是一个DATETIME值。&nbsp; </p>
<p>mysql&gt; SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;&nbsp; <br>-&gt; 1998-01-01 00:00:00&nbsp; <br>mysql&gt; SELECT INTERVAL 1 DAY + "1997-12-31";&nbsp; <br>-&gt; 1998-01-01&nbsp; <br>mysql&gt; SELECT "1998-01-01" - INTERVAL 1 SECOND;&nbsp; <br>-&gt; 1997-12-31 23:59:59&nbsp; <br>mysql&gt; SELECT DATE_ADD("1997-12-31 23:59:59",&nbsp; <br>INTERVAL 1 SECOND);&nbsp; <br>-&gt; 1998-01-01 00:00:00&nbsp; <br>mysql&gt; SELECT DATE_ADD("1997-12-31 23:59:59",&nbsp; <br>INTERVAL 1 DAY);&nbsp; <br>-&gt; 1998-01-01 23:59:59&nbsp; <br>mysql&gt; SELECT DATE_ADD("1997-12-31 23:59:59",&nbsp; <br>INTERVAL "1:1" MINUTE_SECOND);&nbsp; <br>-&gt; 1998-01-01 00:01:00&nbsp; <br>mysql&gt; SELECT DATE_SUB("1998-01-01 00:00:00",&nbsp; <br>INTERVAL "1 1:1:1" DAY_SECOND);&nbsp; <br>-&gt; 1997-12-30 22:58:59&nbsp; <br>mysql&gt; SELECT DATE_ADD("1998-01-01 00:00:00",&nbsp; <br>INTERVAL "-1 10" DAY_HOUR);&nbsp; <br>-&gt; 1997-12-30 14:00:00&nbsp; <br>mysql&gt; SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);&nbsp; <br>-&gt; 1997-12-02&nbsp; <br>mysql&gt; SELECT EXTRACT(YEAR FROM "1999-07-02");&nbsp; <br>-&gt; 1999&nbsp; <br>mysql&gt; SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");&nbsp; <br>-&gt; 199907&nbsp; <br>mysql&gt; SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");&nbsp; <br>-&gt; 20102&nbsp; </p>
<p>如果你指定太短的间隔值(不包括type关键词期望的间隔部分)，MySQL假设你省掉了间隔值的最左面部分。例如，如果你指定一个type是DAY_SECOND，值expr被希望有天、小时、分钟和秒部分。如果你象"1:10"这样指定值，MySQL假设日子和小时部分是丢失的并且值代表分钟和秒。换句话说，"1:10" DAY_SECOND以它等价于"1:10" MINUTE_SECOND的方式解释，这对那MySQL解释TIME值表示经过的时间而非作为一天的时间的方式有二义性。如果你使用确实不正确的日期，结果是NULL。如果你增加MONTH、YEAR_MONTH或YEAR并且结果日期大于新月份的最大值天数，日子在新月用最大的天调整。&nbsp; </p>
<p>mysql&gt; select DATE_ADD('1998-01-30', Interval 1 month);&nbsp; <br>-&gt; 1998-02-28&nbsp; </p>
<p>注意，从前面的例子中词INTERVAL和type关键词不是区分大小写的。&nbsp; <br><br><strong>TO_DAYS(date)&nbsp; <br></strong>给出一个日期date，返回一个天数(从0年的天数)。&nbsp; <br>mysql&gt; select TO_DAYS(950501);&nbsp; <br>-&gt; 728779&nbsp; <br>mysql&gt; select TO_DAYS('1997-10-07');&nbsp; <br>-&gt; 729669&nbsp; </p>
<p><strong>TO_DAYS()<br></strong>不打算用于使用格列高里历(1582)出现前的值。&nbsp; </p>
<p><strong>FROM_DAYS(N)&nbsp; <br></strong>给出一个天数N，返回一个DATE值。&nbsp; <br>mysql&gt; select FROM_DAYS(729669);&nbsp; <br>-&gt; '1997-10-07'&nbsp; </p>
<p><strong>DATE_FORMAT(date,format)&nbsp; </strong><br>根据format字符串格式化date值。下列修饰符可以被用在format字符串中： %M 月名字(January&#8230;&#8230;December)&nbsp; <br>%W 星期名字(Sunday&#8230;&#8230;Saturday)&nbsp; <br><clk style="FONT-SIZE: 14px; LINE-HEIGHT: 18pt">%D 有<nobr oncontextmenu="return false" onmousemove=$cE.MoW() id=clickeyekey0 onmouseover=$cE.s(event,0) style="FONT-SIZE: 14px; COLOR: #6600ff; LINE-HEIGHT: 18pt; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick='$cE.c(event,0,"",1)' onmouseout=$cE.OuK()>英语</nobr>前缀的月份的日期(1st, 2nd, 3rd, 等等。）&nbsp; </clk><br>%Y 年, 数字, 4 位&nbsp; <br>%y 年, 数字, 2 位&nbsp; <br>%a 缩写的星期名字(Sun&#8230;&#8230;Sat)&nbsp; <br>%d 月份中的天数, 数字(00&#8230;&#8230;31)&nbsp; <br>%e 月份中的天数, 数字(0&#8230;&#8230;31)&nbsp; <br>%m 月, 数字(01&#8230;&#8230;12)&nbsp; <br>%c 月, 数字(1&#8230;&#8230;12)&nbsp; <br>%b 缩写的月份名字(Jan&#8230;&#8230;Dec)&nbsp; <br>%j 一年中的天数(001&#8230;&#8230;366)&nbsp; <br>%H 小时(00&#8230;&#8230;23)&nbsp; <br>%k 小时(0&#8230;&#8230;23)&nbsp; <br>%h 小时(01&#8230;&#8230;12)&nbsp; <br>%I 小时(01&#8230;&#8230;12)&nbsp; <br>%l 小时(1&#8230;&#8230;12)&nbsp; <br>%i 分钟, 数字(00&#8230;&#8230;59)&nbsp; <br>%r 时间,12 小时(hh:mm:ss [AP]M)&nbsp; <br>%T 时间,24 小时(hh:mm:ss)&nbsp; <br>%S 秒(00&#8230;&#8230;59)&nbsp; <br>%s 秒(00&#8230;&#8230;59)&nbsp; <br>%p AM或PM&nbsp; <br>%w 一个星期中的天数(0=Sunday &#8230;&#8230;6=Saturday ）&nbsp; <br>%U 星期(0&#8230;&#8230;52), 这里星期天是星期的第一天&nbsp; <br>%u 星期(0&#8230;&#8230;52), 这里星期一是星期的第一天&nbsp; <br>%% 一个文字&#8220;%&#8221;。&nbsp; </p>
<p>所有的其他字符不做解释被复制到结果中。&nbsp; </p>
<p>mysql&gt; select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');&nbsp; <br>-&gt; 'Saturday October 1997'&nbsp; <br>mysql&gt; select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');&nbsp; <br>-&gt; '22:23:00'&nbsp; <br>mysql&gt; select DATE_FORMAT('1997-10-04 22:23:00',&nbsp; <br>'%D %y %a %d %m %b %j');&nbsp; <br>-&gt; '4th 97 Sat 04 10 Oct 277'&nbsp; <br>mysql&gt; select DATE_FORMAT('1997-10-04 22:23:00',&nbsp; <br>'%H %k %I %r %T %S %w');&nbsp; <br>-&gt; '22 22 10 10:23:00 PM 22:23:00 00 6'&nbsp; <br>MySQL3.23中，在格式修饰符字符前需要%。在MySQL更早的版本中，%是可选的。&nbsp; </p>
<p><strong>TIME_FORMAT(time,format)</strong>&nbsp; <br>这象上面的DATE_FORMAT()函数一样使用，但是format字符串只能包含处理小时、分钟和秒的那些格式修饰符。其他修饰符产生一个NULL值或0。&nbsp; <br><br>CURDATE()&nbsp; <br>　&nbsp; <br><strong>CURRENT_DATE</strong>&nbsp; <br>以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值，取决于函数是在一个字符串还是数字上下文被使用。&nbsp; <br>mysql&gt; select CURDATE();&nbsp; <br>-&gt; '1997-12-15'&nbsp; <br>mysql&gt; select CURDATE() + 0;&nbsp; <br>-&gt; 19971215&nbsp; </p>
<p>CURTIME()&nbsp; <br>　&nbsp; <br><strong>CURRENT_TIME</strong>&nbsp; <br>以'HH:MM:SS'或HHMMSS格式返回当前时间值，取决于函数是在一个字符串还是在数字的上下文被使用。&nbsp; <br>mysql&gt; select CURTIME();&nbsp; <br>-&gt; '23:50:26'&nbsp; <br>mysql&gt; select CURTIME() + 0;&nbsp; <br>-&gt; 235026&nbsp; </p>
<p>NOW()&nbsp; <br>　&nbsp; <br>SYSDATE()&nbsp; <br>　&nbsp; <br><strong>CURRENT_TIMESTAMP</strong>&nbsp; <br>以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的日期和时间，取决于函数是在一个字符串还是在数字的上下文被使用。&nbsp; <br>mysql&gt; select NOW();&nbsp; <br>-&gt; '1997-12-15 23:50:26'&nbsp; <br>mysql&gt; select NOW() + 0;&nbsp; <br>-&gt; 19971215235026&nbsp; </p>
<p>UNIX_TIMESTAMP()&nbsp; <br>　&nbsp; <br><strong>UNIX_TIMESTAMP(date)&nbsp; <br></strong>如果没有参数调用，返回一个Unix时间戳记(从'1970-01-01 00:00:00'GMT开始的秒数)。如果UNIX_TIMESTAMP()用一个date参数被调用，它返回从'1970-01-01 00:00:00' GMT开始的秒数值。date可以是一个DATE字符串、一个DATETIME字符串、一个TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地时间的一个数字。&nbsp; <br>mysql&gt; select UNIX_TIMESTAMP();&nbsp; <br>-&gt; 882226357&nbsp; <br>mysql&gt; select UNIX_TIMESTAMP('1997-10-04 22:23:00');&nbsp; <br>-&gt; 875996580&nbsp; <br>当UNIX_TIMESTAMP被用于一个TIMESTAMP列，函数将直接接受值，没有隐含的&#8220;string-to-unix-timestamp&#8221;变换。&nbsp; </p>
<p><strong>FROM_UNIXTIME(unix_timestamp)</strong>&nbsp; <br>以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值，取决于函数是在一个字符串还是或数字上下文中被使用。&nbsp; <br>mysql&gt; select FROM_UNIXTIME(875996580);&nbsp; <br>-&gt; '1997-10-04 22:23:00'&nbsp; <br>mysql&gt; select FROM_UNIXTIME(875996580) + 0;&nbsp; <br>-&gt; 19971004222300&nbsp; </p>
<p><strong>FROM_UNIXTIME(unix_timestamp,format)</strong>&nbsp; <br>返回表示 Unix 时间标记的一个字符串，根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符。&nbsp; <br>mysql&gt; select FROM_UNIXTIME(UNIX_TIMESTAMP(),&nbsp; <br>'%Y %D %M %h:%i:%s %x');&nbsp; <br>-&gt; '1997 23rd December 03:43:30 x'&nbsp; </p>
<p><strong>SEC_TO_TIME(seconds)</strong>&nbsp; <br>返回seconds参数，变换成小时、分钟和秒，值以'HH:MM:SS'或HHMMSS格式化，取决于函数是在一个字符串还是在数字上下文中被使用。&nbsp; <br>mysql&gt; select SEC_TO_TIME(2378);&nbsp; <br>-&gt; '00:39:38'&nbsp; <br>mysql&gt; select SEC_TO_TIME(2378) + 0;&nbsp; <br>-&gt; 3938&nbsp; </p>
<p><strong>TIME_TO_SEC(time)</strong>&nbsp; <br>返回time参数，转换成秒。&nbsp; <br>mysql&gt; select TIME_TO_SEC('22:23:00');&nbsp; <br>-&gt; 80580&nbsp; <br>mysql&gt; select TIME_TO_SEC('00:39:38');&nbsp; <br>-&gt; 2378 <br></p>
<img src ="http://www.cppblog.com/andy851899/aggbug/99453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/andy851899/" target="_blank">五湖醉人</a> 2009-10-26 09:27 <a href="http://www.cppblog.com/andy851899/archive/2009/10/26/99453.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可以让你少奋斗十年的工作经验</title><link>http://www.cppblog.com/andy851899/archive/2009/10/12/98370.html</link><dc:creator>五湖醉人</dc:creator><author>五湖醉人</author><pubDate>Mon, 12 Oct 2009 05:09:00 GMT</pubDate><guid>http://www.cppblog.com/andy851899/archive/2009/10/12/98370.html</guid><wfw:comment>http://www.cppblog.com/andy851899/comments/98370.html</wfw:comment><comments>http://www.cppblog.com/andy851899/archive/2009/10/12/98370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/andy851899/comments/commentRss/98370.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/andy851899/services/trackbacks/98370.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转帖网址:http://blog.21ic.com/user1/5872/archives/2009/62334.html第一：不要认为停留在心灵的舒适区域内是可以原谅的。 　　 　　每个人都有一个舒适区域，在这个区域内是很自我的，不愿意被打扰，不愿意被push，不愿意和陌生的面孔交谈，不愿意被人指责，不愿意按照规定的时限做事，不愿意主动的去关心别人，不愿意去思考别人还有什么没有想到。这在学生时代...&nbsp;&nbsp;<a href='http://www.cppblog.com/andy851899/archive/2009/10/12/98370.html'>阅读全文</a><img src ="http://www.cppblog.com/andy851899/aggbug/98370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/andy851899/" target="_blank">五湖醉人</a> 2009-10-12 13:09 <a href="http://www.cppblog.com/andy851899/archive/2009/10/12/98370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tcpdump 侦测网络端口数据</title><link>http://www.cppblog.com/andy851899/archive/2009/10/12/98369.html</link><dc:creator>五湖醉人</dc:creator><author>五湖醉人</author><pubDate>Mon, 12 Oct 2009 05:06:00 GMT</pubDate><guid>http://www.cppblog.com/andy851899/archive/2009/10/12/98369.html</guid><wfw:comment>http://www.cppblog.com/andy851899/comments/98369.html</wfw:comment><comments>http://www.cppblog.com/andy851899/archive/2009/10/12/98369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/andy851899/comments/commentRss/98369.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/andy851899/services/trackbacks/98369.html</trackback:ping><description><![CDATA[tcpdump采用命令行方式，它的命令格式为：<br>　　tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]<br>　　　　　　　　　　[ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]<br>　　　　　　　　　　[ -T 类型 ] [ -w 文件名 ] [表达式 ]<br><br>　　1. tcpdump的选项介绍<br>　　　-a 　　　将网络地址和广播地址转变成名字；<br>　　　-d 　　　将匹配信息包的代码以人们能够理解的汇编格式给出；<br>　　　-dd 　　　将匹配信息包的代码以c语言程序段的格式给出；<br>　　　-ddd 　　　将匹配信息包的代码以十进制的形式给出；<br>　　　-e 　　　在输出行打印出数据链路层的头部信息；<br>　　　-f 　　　将外部的Internet地址以数字的形式打印出来；<br>　　　-l 　　　使标准输出变为缓冲行形式；<br>　　　-n 　　　不把网络地址转换成名字；<br>　　　-t 　　　在输出的每一行不打印时间戳；<br>　　　-v 　　　输出一个稍微详细的信息，例如在ip包中可以包括ttl和服务类型的信息；<br>　　　-vv 　　　输出详细的报文信息；<br>　　　-c 　　　在收到指定的包的数目后，tcpdump就会停止；<br>　　　-F 　　　从指定的文件中读取表达式,忽略其它的表达式；<br>　　　-i 　　　指定监听的网络接口；<br>　　　-r 　　　从指定的文件中读取包(这些包一般通过-w选项产生)；<br>　　　-w 　　　直接将包写入文件中，并不分析和打印出来；<br>　　　-T 　　　将监听到的包直接解释为指定的类型的报文，常见的类型有rpc （远程过程<br>调用）和snmp（简单　　　　　　　网络管理协议；）<br><br>　　2. tcpdump的表达式介绍<br>　　　表达式是一个正则表达式，tcpdump利用它作为过滤报文的条件，如果一个报文满足表<br>达式的条件，则这个报文将会被捕获。如果没有给出任何条件，则网络上所有的信息包将会<br>被截获。<br>　　　在表达式中一般如下几种类型的关键字，一种是关于类型的关键字，主要包括host，<br>net，port, 例如 host 210.27.48.2，指明 210.27.48.2是一台主机，net 202.0.0.0 指明<br>202.0.0.0是一个网络地址，port 23 指明端口号是23。如果没有指定类型，缺省的类型是<br>host.<br>　　　第二种是确定传输方向的关键字，主要包括src , dst ,dst or src, dst and src ,<br>这些关键字指明了传输的方向。举例说明，src 210.27.48.2 ,指明ip包中源地址是210.27.<br>48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字，则<br>缺省是src or dst关键字。<br>　　　第三种是协议的关键字，主要包括fddi,ip ,arp,rarp,tcp,udp等类型。Fddi指明是在<br>FDDI(分布式光纤数据接口网络)上的特定的网络协议，实际上它是"ether"的别名，fddi和e<br>ther具有类似的源地址和目的地址，所以可以将fddi协议包当作ether的包进行处理和分析。<br>其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议，则tcpdump将会<br>监听所有协议的信息包。<br>　　　除了这三种类型的关键字之外，其他重要的关键字如下：gateway, broadcast,less,<br>greater,还有三种逻辑运算，取非运算是 'not ' '! ', 与运算是'and','&amp;&amp;';或运算 是'o<br>r' ,'||'；<br>　　　这些关键字可以组合起来构成强大的组合条件来满足人们的需要，下面举几个例子来<br>说明。<br>　　　(1)想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包：<br>　　　　#tcpdump host 210.27.48.1 <br>　　　(2) 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信，使用命令<br>：（在命令行中适用　　　括号时，一定要<br>　　　　#tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \) <br>　　　(3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包<br>，使用命令：<br>　　　　#tcpdump ip host 210.27.48.1 and ! 210.27.48.2<br>　　　(4)如果想要获取主机210.27.48.1接收或发出的telnet包，使用如下命令：<br>　　　　#tcpdump tcp port 23 host 210.27.48.1 <br><br>　　3. tcpdump 的输出结果介绍<br>　　　下面我们介绍几种典型的tcpdump命令的输出信息<br>　　　(1) 数据链路层头信息<br>　　　使用命令#tcpdump --e host ice<br>　　　ice 是一台装有linux的主机，她的MAC地址是0：90：27：58：AF：1A<br>　　　H219是一台装有SOLARIC的SUN工作站，它的MAC地址是8：0：20：79：5B：46；上一条<br>命令的输出结果如下所示：<br>21:50:12.847509 eth0 &lt; 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 &gt; ice.<br>telne<br>t 0:0(0) ack 22535 win 8760 (DF)<br>　　分析：21：50：12是显示的时间， 847509是ID号，eth0 &lt;表示从网络接口eth0 接受该<br>数据包，eth0 &gt;表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它<br>表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的<br>目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 &gt; ice.<br>telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535<br>表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.<br><br>　　(2) ARP包的TCPDUMP输出信息<br>　　　使用命令#tcpdump arp <br>　　　得到的输出结果是：<br>　　22:32:42.802509 eth0 &gt; arp who-has route tell ice (0:90:27:58:af:1a)<br>　　22:32:42.802902 eth0 &lt; arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af<br>:1a)<br>　　分析: 22:32:42是时间戳, 802509是ID号, eth0 &gt;表明从主机发出该数据包, arp表明是<br>ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:5<br>8:af:1a是主机ICE的MAC地址。<br><br>　　(3) TCP包的输出信息<br>　　　用TCPDUMP捕获的TCP包的一般输出信息是：<br>　　src &gt; dst: flags data-seqno ack window urgent options<br>　　src &gt; dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (F<br>IN), P (PUSH) , R (RST) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是<br>下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针. <br>Options是选项.<br><br>　　(4) UDP包的输出信息<br>　　　用TCPDUMP捕获的UDP包的一般输出信息是：<br>　　route.port1 &gt; ice.port2: udp lenth<br>　　UDP十分简单，上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机<br>ICE的port2端口，类型是UDP， 包的长度是lenth<br><br>===============================================================<br><br>
<p>在传统的网络分析和测试技术中，嗅探器(sniffer)是最常见，也是最重要的技术之一。sniffer工具首先是为网络管理员和网络程序员进行
网络分析而设计的。对于网络管理人员来说，使用嗅探器可以随时掌握网络的实际情况，在网络性能急剧下降的时候，可以通过sniffer工具来分析原因，找
出造成网络阻塞的来源。对于网络程序员来说,通过sniffer工具来调试程序。 </p>
<p>用过windows平台上的sniffer工具(例如，netxray和sniffer
pro软件)的朋友可能都知道，在共享式的局域网中，采用sniffer工具简直可以对网络中的所有流量一览无余！Sniffer工具实际上就是一个网络
上的抓包工具，同时还可以对抓到的包进行分析。由于在共享式的网络中，信息包是会广播到网络中所有主机的网络接口，只不过在没有使用sniffer工具之
前，主机的网络设备会判断该信息包是否应该接收，这样它就会抛弃不应该接收的信息包，sniffer工具却使主机的网络设备接收所有到达的信息包，这样就
达到了网络监听的效果。</p>
<p>Linux作为网络服务器，特别是作为路由器和网关时，数据的采集和分析是必不可少的。所以，今天我们就来看看Linux中强大的网络数据采集分析工具——TcpDump。 </p>
<p>用简单的话来定义<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>，就是：dump the traffice on a network，根据使用者的定义对网络上的数据包进行截获的包分析工具。 </p>
<p>作为互联网上经典的的系统管理员必备工具，<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>以其强大的功能，灵活的截取策略，成为每个高级的系统管理员分析网络，排查问题等所必备的东东之一。 </p>
<p>顾名思义，TcpDump可以将网络中传送的数据包的&#8220;头&#8221;完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤，并提供and、or、not等逻辑语句来帮助你去掉无用的信息。 </p>
<p><a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>提供了源代码，公开了接口，因此具备很强的可扩展性，对于网络维护和入侵者都是非常有用的工具。<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>存在于基本的FreeBSD系统中，由于它需要将网络界面设置为混杂模式，普通用户不能正常执行，但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁，而是对网络上的其他计算机的安全存在威胁。 </p>
<p>普通情况下，直接启动<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>将监视第一个网络界面上所有流过的数据包。 <br><font face="courier new, courier, mono">－－－－－－－－－－－－－－－－－－－－－－－ <br>bash-2.02# <a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a> <br><a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>: listening on eth0 <br>11:58:47.873028 202.102.245.40.netbios-ns &gt; 202.102.245.127.netbios-ns: udp 50 <br>11:58:47.974331 0:10:7b:8:3a:56 &gt; 1:80:c2:0:0:0 802.1d ui/C len=43 <br>0000 0000 0080 0000 1007 cf08 0900 0000 <br>0e80 0000 902b 4695 0980 8701 0014 0002 <br>000f 0000 902b 4695 0008 00 <br>11:58:48.373134 0:0:e8:5b:6d:85 &gt; Broadcast sap e0 ui/C len=97 <br>ffff 0060 0004 ffff ffff ffff ffff ffff <br>0452 ffff ffff 0000 e85b 6d85 4008 0002 <br>0640 4d41 5354 4552 5f57 4542 0000 0000 <br>0000 00 <br>^C <br>－－－－－－－－－－－－－－－－－－－－－－－－</font> </p>
<p>首先我们注意一下，从上面的输出结果上可以看出来，基本上<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>总的的输出格式为：系统时间 来源主机.端口 &gt; 目标主机.端口 数据包参数 </p>
<p>TcpDump的参数化支持 </p>
<p>　　<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>支持相当多的不同参数，如使用-i参数指定<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>监听的网络界面，这在计算机具有多个网络界面时非常有用，使用-c参数指定要监听的数据包数量，使用-w参数指定将监听到的数据包写入文件中保存，等等。 </p>
<p>　　然而更复杂的<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>参数是用于过滤目的，这是因为网络中流量很大，如果不加分辨将所有的数据包都截留下来，数据量太大，反而不容易发现需要的数据包。使用这些参数定义的过滤规则可以截留特定的数据包，以缩小目标，才能更好的分析网络中存在的问题。<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>使用参数指定要监视数据包的类型、地址、端口等，根据具体的网络问题，充分利用这些过滤规则就能达到迅速定位故障的目的。请使用man <a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>查看这些过滤规则的具体用法。 </p>
<p>　　显然为了安全起见，不用作网络管理用途的计算机上不应该运行这一类的网络分析软件，为了屏蔽它们，可以屏蔽内核中的bpfilter伪设备。一
般情况下网络硬件和TCP/IP堆栈不支持接收或发送与本计算机无关的数据包，为了接收这些数据包，就必须使用网卡的混杂模式，并绕过标准的TCP/IP
堆栈才行。在FreeBSD下，这就需要内核支持伪设备bpfilter。因此，在内核中取消bpfilter支持，就能屏蔽<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>之类的网络分析工具。 </p>
<p>　　并且当网卡被设置为混杂模式时，系统会在控制台和日志文件中留下记录，提醒管理员留意这台系统是否被用作攻击同网络的其他计算机的跳板。 </p>
<p>　　May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled </p>
<p>　　虽然网络分析工具能将网络中传送的数据记录下来，但是网络中的数据流量相当大，如何对这些数据进行分析、分类统计、发现并报告错误却是更关键的
问题。网络中的数据包属于不同的协议，而不同协议数据包的格式也不同。因此对捕获的数据进行解码，将包中的信息尽可能的展示出来，对于协议分析工具来讲更
为重要。昂贵的商业分析工具的优势就在于它们能支持很多种类的应用层协议，而不仅仅只支持tcp、udp等低层协议。 </p>
<p>　　从上面<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>的输出可以看出，<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>对截获的数据并没有进行彻底解码，数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障，通常的解决办法是先使用带-w参数的<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a> 截获数据并保存到文件中，然后再使用其他程序进行解码分析。当然也应该定义过滤规则，以避免捕获的数据包填满整个硬盘。 </p>
<p>TCP功能 </p>
<p>数据过滤 </p>
<p>不带任何参数的TcpDump将搜索系统中所有的网络接口，并显示它截获的所有数据，这些数据对我们不一定全都需要，而且数据太多不利于分析。所以，我们应当先想好需要哪些数据，TcpDump提供以下参数供我们选择数据： </p>
<p>-b 在数据-链路层上选择协议，包括ip、arp、rarp、ipx都是这一层的。 </p>
<p>例如：<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a> -b arp 将只显示网络中的arp即地址转换协议信息。 </p>
<p>-i 选择过滤的网络接口，如果是作为路由器至少有两个网络接口，通过这个选项，就可以只过滤指定的接口上通过的数据。例如： </p>
<p><a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a> -i eth0 只显示通过eth0接口上的所有报头。 </p>
<p>src、dst、port、host、net、ether、gateway这几个选项又分别包含src、dst
、port、host、net、ehost等附加选项。他们用来分辨数据包的来源和去向，src host
192.168.0.1指定源主机IP地址是192.168.0.1，dst net
192.168.0.0/24指定目标是网络192.168.0.0。以此类推，host是与其指定主机相关无论它是源还是目的，net是与其指定网络相
关的，ether后面跟的不是IP地址而是物理地址，而gateway则用于网关主机。可能有点复杂，看下面例子就知道了： </p>
<p><a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a> src host 192.168.0.1 and dst net 192.168.0.0/24 </p>
<p>过滤的是源主机为192.168.0.1与目的网络为192.168.0.0的报头。 </p>
<p><a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a> ether src 00:50:04:BA:9B and dst&#8230;&#8230; </p>
<p>过滤源主机物理地址为XXX的报头（为什么ether src后面没有host或者net？物理地址当然不可能有网络喽）。 </p>
<p>Tcpdump src host 192.168.0.1 and dst port not telnet </p>
<p>过滤源主机192.168.0.1和目的端口不是telnet的报头。 </p>
<p>ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置，用来过滤数据报的类型。 <br>例如： </p>
<p><a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a> ip src&#8230;&#8230; </p>
<p>只过滤数据-链路层上的IP报头。 </p>
<p><a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a> udp and src host 192.168.0.1 </p>
<p>只过滤源主机192.168.0.1的所有udp报头。 </p>
<p>数据显示/输入输出 </p>
<p>TcpDump提供了足够的参数来让我们选择如何处理得到的数据，如下所示： </p>
<p>-l 可以将数据重定向。 </p>
<p>如<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a> -l ＞tcpcap.txt将得到的数据存入tcpcap.txt文件中。 </p>
<p>-n 不进行IP地址到主机名的转换。 </p>
<p>如果不使用这一项，当系统中存在某一主机的主机名时，TcpDump会把IP地址转换为主机名显示，就像这样：eth0 ＜
ntc9.1165＞ router.domain.net.telnet，使用-n后变成了：eth0 ＜ 192.168.0.9.1165 ＞
192.168.0.1.telnet。 </p>
<p>-nn 不进行端口名称的转换。 </p>
<p>上面这条信息使用-nn后就变成了：eth0 ＜ ntc9.1165 ＞ router.domain.net.23。 </p>
<p>-N 不打印出默认的域名。 </p>
<p>还是这条信息-N 后就是：eth0 ＜ ntc9.1165 ＞ router.telnet。 </p>
<p>-O 不进行匹配代码的优化。 <br>-t 不打印UNIX时间戳，也就是不显示时间。 <br>-tt 打印原始的、未格式化过的时间。 <br>-v 详细的输出，也就比普通的多了个TTL和服务类型。 </p>
<p>　 <br>TCPDUMP的安装 </p>
<p>　在linux下<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>的安装十分简单，一般由两种安装方式。一种是以rpm包的形式来进行安装。另外一种是以源程序的形式安装。 <br>　　1． rpm包的形式安装 <br>　　　　#rpm -ivh <a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>-3_4a5.rpm <br>　　这样<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>就顺利地安装到你的linux系统中。怎么样，很简单吧。 <br>　　2． 源程序的安装 <br>　　　　　#tar xvfz <a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>-3_4a5.tar.Z <br>　　　　rpm的包可以使用如下命令安装: <br>　　　　　#rpm -ivh <a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>-3_4a5.src.rpm <br>　　　　这样就把<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>的源代码解压到/usr/src/redhat/SOURCES目录下. </p>
<p>第二步 做好编译源程序前的准备活动 </p>
<p>在编译源程序之前，最好已经确定库文件libpcap已经安装完毕，这个库文件是<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>软件所需的库文件 。同样，你同时还要有一个标准的c语言编译器。在linux下标准的c 语言编译器一般是gcc。 在<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>的源程序目录中。有一个文件是Makefile.in，configure命令就是从Makefile.in文件中自动产生Makefile文件。在Makefile.in文件中，可以根据系统的配置来修改BINDEST 和 MANDEST 这两个宏定义，缺省值是 <br>　　　 　　BINDEST = @sbindir@ <br>　　　 　　MANDEST = @mandir@ <br>　 <br>第一个宏值表明安装<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>的二进制文件的路径名，第二个表明<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>的man 帮助页的路径名,你可以修改它们来满足系统的需求。 </p>
<p>　 第三步 编译源程序 <br>　 <br>使用源程序目录中的configure脚本，它从系统中读出各种所需的属性。并且根据Makefile.in文件自动生成Makefile文件，以便编译使用.make 命令则根据Makefile文件中的规则编译<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>的源程序。使用make install命令安装编译好的<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>的二进制文件。 <br>　 <br>总结一下就是: <br>　 <br>　　　 　　# tar xvfz <a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>-3_4a5.tar.Z <br>　　　 　　# vi Makefile.in <br>　　　 　　# . /configure <br>　　　 　　# make <br>　　　 　　# make install </p>
<p>关于<a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a>更详细的信息，请查看Man <a  href="http://tcpdump.anheng.com.cn/news/22/591.html"><font color="#0000ff">tcpdump</font></a></p>
<p>&nbsp;<font color="#000099"><strong>原文地址</strong></font>
http://blog.chinaunix.net/u1/34645/showart_266986.html</p><img src ="http://www.cppblog.com/andy851899/aggbug/98369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/andy851899/" target="_blank">五湖醉人</a> 2009-10-12 13:06 <a href="http://www.cppblog.com/andy851899/archive/2009/10/12/98369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>