利用XMLHTTP 从其他页面获取数据     选择自 qieyj 的 Blog  
关键字   XML
出处   http://www.codeproject.com/useritems/xml_newsfeed....

我们在编写ASP代码的时候,大家都知道可以通过post或者get获得form表单的数据,那么我们如何直接获得其他页面上的数据呢?这就要借助xmlhttp协议了。xmlhttp是xmldom技术的一部分。

下面的代码就是一个很简单的例子,我们利用xmlhttp技术,把http://www.codetoad.com/站点首页的代码以xml的形式完全获取,并且在页面中输出。

<%
 Dim objXMLHTTP, xml
 Set xml = Server.CreateObject("Microsoft.XMLHTTP")
 
 xml.Open "GET", "http://www.codetoad.com/", False
 ' Pull the data from the web page
 xml.Send

 Response.write "Here's the html we now have in our xml object"
 Response.write "<BR><BR><BR>"
 Response.Write "<xmp>"
 Response.Write xml.responseText
 Response.Write "</xmp>"
 Response.write "<BR><BR><BR>"
Response.write " Now here's how the page looks:<BR><BR>"
 Response.Write xml.responseText

 Set xml = Nothing
%>


下面是另一个实例

<%
dim objHTTP , objXML , objXSL
set objHTTP = Server.CreateObject("Microsoft.XMLHTTP")
objHTTP.open "GET", "http://p.moreover.com/cgi-local/page?c=Pop%20music..., false
objHTTP.send
set objXML = objHTTP.responseXML
set objXSL=Server.CreateObject("microsoft.xmldom")
objXSL.async=false

objXSL.load(Server.MapPath("style.xsl"))

if (objXSL.parseError.errorCode = 0) then
   Response.Write(objXML.transformnode(objXSL))
else
   Response.Write "Error: " & objXSL.parseError.reason & " URL:" & objXSL.url
end if

Set objHTTP = Nothing
Set objXML = Nothing
Set objXSL = Nothing
%>

style.xsl:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
   <xsl:template match="/">

<html>
<head>
<TITLE>moreover...</TITLE>
</head>
<body BGCOLOR="ffffff">




<DIV ALIGN="center">
<TABLE BGCOLOR="ffffff" BORDER="0" CELLPADDING="4" CELLSPACING="0" WIDTH="100%">

     <xsl:for-each select="moreovernews/article">
     
        <TR VALIGN="middle">
          <TD ALIGN="left" BGCOLOR="ffffff">
           
                 
            <xsl:attribute name="HREF">
              <xsl:value-of select="url"/>
            </xsl:attribute>
            <xsl:attribute name="TARGET">
              _blank
            </xsl:attribute>
           
              <xsl:value-of select="headline_text"/>
           
         
       
       
               
          <xsl:attribute name="HREF">
            <xsl:value-of select="document_url"/>
          </xsl:attribute>
          <xsl:attribute name="TARGET">
            _blank
          </xsl:attribute>
         
            <xsl:value-of select="source"/>
         
       
               
          <xsl:attribute name="HREF">
          <xsl:value-of select="access_registration"/>
          </xsl:attribute>
          <xsl:attribute name="TARGET">
            _blank
          </xsl:attribute>
         
            <xsl:value-of select="access_status"/>
         
       
       
          <xsl:value-of select="harvest_time"/> GMT
       
          </TD>
        </TR>
         
      </xsl:for-each>


</TABLE>
</DIV>
</body>
</html>
   </xsl:template>
 </xsl:stylesheet>


怎样防止欠入统计代码等拖网站速度,我来教你![原创]

使用别人的统计、广告等欠入代码的,由于有时候网络原因打开需要一定时间,会影响自己网站速度~~

这样做可以防止拖你网站速度:

1,使用IFRAME:使用框架几乎不影响速度

2,使用独立表格或表格与表格间的位置:不要把代码放在你网页内容的表格里~做网页的时候把网页内容分别做在几个表格里而不是一个,因为一个表格的话打开的时候会等到这个表格里的内容全部下载完才显示。所以你可以放在表格于表格之间。

比如我把网页分为上(header)-中(index)-下(fotter),三块,在header与index的表格之间放上广告代码,最好是IFRAME的`


</table>
// 上面一个表格结束
<div align="center"><iframe src="http://****" frameborder="0" scrolling=no width="755" height="60" align="center"></iframe></div>
// 下面一个表格开始
<table width="755" border="0" align="center" cellpadding="0" cellspacing="0">


这样不是影响速度

3,放在</body>的上面,这样就与网页内容的表格脱离了,比如你放 51.la的统计,可以这样!!


<center>
   <NOSCRIPT>
   <A href="http://www.51.la/?s=13&id=***" title="51.la Free Site Stats" target="_blank"><IMG src="http://s13.51.La/s.asp?siteid=****&t=img" border="0"></A>
   </NOSCRIPT>
</center>
</body> //body域结束


这样放统计绝对不会影响你网站打开速度~~
远程图片自动保存到本地服务器,并利用aspjpeg为图片加上水印

<%
'函数功能:远程图片自动保存到本地服务器,并利用aspjpeg为图片加上水印
'(注意:请先在目录下创建images目录,用来保存临时图片)
'程序落伍者:我是星星
'加入落伍第二份原创程序,HOHO,今天一定要落伍类,5.6日注册,5.7日落伍,庆祝一下!
'本程序需要在服务器上安装"aspjpeg组件"否则无法正常使用
'也可以只取'''''22222222'''''''以上的部分,这部分可以保存图片,第二部分是进行水印增加
'使用方法,请保存为saveimg.asp
'saveimg.asp?url=http://image2.sina.com.cn/home/images/sina_logo2.gif  即可以取下图片啦,HOHO. 其他需要加的功能,大家自己扩展好啦
'如何获取其他后缀名的文件呢? 当然也可以啦
'(jpg|gif|png|bmp)改成(mp3)明白吧? 就是取mp3后缀的文件名.以此类推. 嘻嘻
'俺要落伍. 发了二份原创,一份是惊云下载系统偷天空时防止出现连接来自天空软件站的程序,有需要的在落伍里面搜索我的贴子
'不要忘了使用时在目录下建images的保存目录哦

Server.ScriptTimeOut=99999

const savepath="images" '图片保存路径
url=request("url")



function myreplace(str)
newstr=str
set objregEx = new RegExp
objregEx.IgnoreCase = true
objregEx.Global = true
objregEx.Pattern = "http://(.+?)\.(jpg|gif|png|bmp)" '定义文件后缀
set matches = objregEx.execute(str)
for each match in matches
newstr=replace(newstr,match.value,saveimg(match.value))
next
myreplace=newstr
end function

function saveimg(url)
temp=split(url,".")
'以下是用时间与随机数重命名文件名
randomize
ranNum=int(90000*rnd)+10000
filename=year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&temp(ubound(temp))
'文件名重命名结束
set xmlhttp=server.createobject("Microsoft.XMLHTTP")
xmlhttp.open "get",url,false
xmlhttp.send
img=xmlhttp.ResponseBody
set xmlhttp=nothing
set objAdostream=server.createobject("ADODB.Stream")
objAdostream.Open()
objAdostream.type=1
objAdostream.Write(img)
objAdostream.SaveToFile(server.mappath(savepath&filename))
objAdostream.SetEOS
set objAdostream=nothing
'''''''222222222'''''''''''
saveimg=savepath&filename '获取保存路径
Dim Jpeg
Set Jpeg = Server.CreateObject("Persits.Jpeg")
Jpeg.Open Server.MapPath(saveimg) '打开保存图片的路径

' 添加文字水印
Jpeg.Canvas.Font.Color = &HFF0000' 红色
Jpeg.Canvas.Font.Family = "宋体"
Jpeg.Canvas.Font.Bold = True  
Jpeg.Canvas.Print Jpeg.OriginalWidth-200,Jpeg.OriginalHeight-50, "www.sina.com"  '水印离左边的距离,离顶端的距离,这个是放在右下脚了
'保存文件
Jpeg.Save Server.MapPath(saveimg) '保存添加水印后的图片

' 注销对象
Set Jpeg = Nothing
end function
%>
使用php通过Socket进行发信源码,支持发信认证。

使用php直接打开socket端口进行发信的小程序
特点是使用smtp认证,能够更好的使用满足一般网友建站需要

<?
/******************************************/
/*          Php webmail sender            */
/*           www.ebugs.org                */
/* Copyright 富翁 in im286.com 2005.03.07 */
/*           转载请注明出处               */
/******************************************/

//使用前请首先按照提示进行配置发信认证的用户名、密码以及smtp服务器地址、发件人信箱等。
//注意将#替换成#,落伍(www.im286.com)负翁版权所有,可随意使用,但保留版权信息

//例子
echo send_mail('fuweng#im286.com','发信标题','发信内容');


function send_mail($to, $subject = 'No subject', $body) {
       $loc_host = "im286";            //发信计算机名,可随意
       $smtp_acc = "fuweng#im286.com"; //Smtp认证的用户名,类似fuweng@im286.com,或者fuweng
       $smtp_pass="password";          //Smtp认证的密码,一般等同pop3密码
       $smtp_host="smtp.im286.com";    //SMTP服务器地址,类似 smtp.tom.com
       $from="fuweng#im286.com";       //发信人Email地址,你的发信信箱地址
   $headers = "Content-Type: text/plain; charset=\"gb2312\"\r\nContent-Transfer-Encoding: base64";
   $lb="\r\n";                    //linebreak
           
       $hdr = explode($lb,$headers);     //解析后的hdr
   if($body) {$bdy = preg_replace("/^\./","..",explode($lb,$body));}//解析后的Body

       $smtp = array(
               //1、EHLO,期待返回220或者250
               array("EHLO ".$loc_host.$lb,"220,250","HELO error: "),
               //2、发送Auth Login,期待返回334
               array("AUTH LOGIN".$lb,"334","AUTH error:"),
               //3、发送经过Base64编码的用户名,期待返回334
               array(base64_encode($smtp_acc).$lb,"334","AUTHENTIFICATION error : "),
               //4、发送经过Base64编码的密码,期待返回235
               array(base64_encode($smtp_pass).$lb,"235","AUTHENTIFICATION error : "));
       //5、发送Mail From,期待返回250
       $smtp[] = array("MAIL FROM: <".$from.">".$lb,"250","MAIL FROM error: ");
       //6、发送Rcpt To。期待返回250
       $smtp[] = array("RCPT TO: <".$to.">".$lb,"250","RCPT TO error: ");
       //7、发送DATA,期待返回354
       $smtp[] = array("DATA".$lb,"354","DATA error: ");
       //8.0、发送From
       $smtp[] = array("From: ".$from.$lb,"","");
       //8.2、发送To
       $smtp[] = array("To: ".$to.$lb,"","");
       //8.1、发送标题
       $smtp[] = array("Subject: ".$subject.$lb,"","");
       //8.3、发送其他Header内容
       foreach($hdr as $h) {$smtp[] = array($h.$lb,"","");}
       //8.4、发送一个空行,结束Header发送
       $smtp[] = array($lb,"","");
       //8.5、发送信件主体
       if($bdy) {foreach($bdy as $b) {$smtp[] = array(base64_encode($b.$lb).$lb,"","");}}
       //9、发送“.”表示信件结束,期待返回250
       $smtp[] = array(".".$lb,"250","DATA(end)error: ");
       //10、发送Quit,退出,期待返回221
       $smtp[] = array("QUIT".$lb,"221","QUIT error: ");

       //打开smtp服务器端口
       $fp = @fsockopen($smtp_host, 25);
       if (!$fp) echo "<b>Error:</b> Cannot conect to ".$smtp_host."<br>";
       while($result = @fgets($fp, 1024)){if(substr($result,3,1) == " ") { break; }}
       
       $result_str="";
       //发送smtp数组中的命令/数据
       foreach($smtp as $req){
               //发送信息
               @fputs($fp, $req[0]);
               //如果需要接收服务器返回信息,则
               if($req[1]){
                       //接收信息
                       while($result = @fgets($fp, 1024)){
                               if(substr($result,3,1) == " ") { break; }
                       };
                       if (!strstr($req[1],substr($result,0,3))){
                               $result_str.=$req[2].$result."<br>";
                       }
               }
       }
       //关闭连接
       @fclose($fp);
       return $result_str;
}
?>
Tom's Hardware网站做了一个很有趣的测试,即针对Intel和AMD刚刚推出的双核心CPU的稳定性测试,而且这个测试是实时进行的,到目前为止还在持续进行中。
测试的主角是Athlon 64 X2 4800+和Pentium 840 EE,而主板分别使用技嘉GA-K8NXP-SLI和GA-8N-SLI(都基于nForce4 SLI芯片组)。 除了CPU和主板,两个系统的其它配件完全相同。
为了让CPU满负荷工作,两套系统分别同时运行4个程序:用Winrar压缩3cd的Doom3,将DVD“Die Another Day”压缩为Divx,把Michael Jackson的CD “Dangerous” 转换为MP3格式,另外还以1600 x 1200分辨率DEMO模式运行了游戏《Farcry》,这也让图形子系统(双6800U SLI)在最大负荷下工作。

双方的表现如何呢?哈哈,小编截图的时候,AMD系统已经运行了5天多,重启次数0,而Intel刚刚从一次死机中恢复过来,并且自从测试以来一共已经重启了4次。不过Tom's Hardware解释Intel的死机有可能是北桥芯片过热造成的,他们已经更换了北桥风扇并且更新了主板BIOS。
有兴趣的朋友可以到这个页面观看目前两个系统的实时运行状态和系统屏幕等实时图片。
http://www.tomshardware.com/stresstest/index.html

完整评测文章在这里。http://www.tomshardware.com/cpu/20050603/index.htm...
什么是 Blog?

"Blog"是 Web Log 的简称(译者注:也就是网志(中国大陆也叫博客))。它是一种作者与读者以日志风格进行交互的中介。在软件社区,人们以网志形式来共享观念与思想变得越来越流行。如:http://blogs.msdn.com 就是 MSDN 上的一个 blogging。

建立网志最轻松的方法是什么?

要想建立自己的网志,最容易的方法是到类似 blogger.com 这样的站点注册一个新用户,它提供一个创建自定义网志的 Web 界面,并且可以立即使用所创建的网志。类似 blogger.com 的站点有很多,它们都提供对网志特性的支持。如果你想更多地控制网志的基础结构或者想要在自己的服务器上建立网志服务系统。你可在以下最流行的几种网志应用商业产品中选择其一:Radio Userland、Manila 和 Movable Type。还有些易用的免费 .NET 网志应用可以使用,最流行的有:.TEXT 和 dasBlog。只要把它们下载下来,然后按照安装说明进行安装与设置,分分钟便可建立起一个可运行的网志服务系统。
  从功能上讲,这两个基于 .NET 的网志应用系统不相上下。其主要区别在于 .TEXT 需要数据库,SQL Server 或者 MSDE,而dasBlog 将所有信息都存储在 XML 文件中(它基于原来一些微软公司开发人员创建的 BlogX 框架),另一个差别是 .TEXT 在单个安装配置中可支持多个网志(比如现在的 http://blogs.msdn.com 就是如此),而 dasBlog 要支持多个网志,必须进行多次安装。但 dasBlog 有一个很突出的特性,那就是“Mail to Weblog”,它允许你通过邮件来发布新信息。
  新的 MSDN 网志服务站点和 PDC Bloggers 都是开始查找关于软件开发主题的很好去处。只要浏览这些站点之一便可阅读其经过聚合的预定内容。其预定的摘要会向你公开许多个人网志,渐渐的你会自然而然地发现一些你比较喜欢阅读的内容。这样,你便可以直接预定你最喜欢的个人网志摘要。
  对于专门讨论 XML 和 Web 服务的网志,请查看 MSDN Web Services Developer Center 上的清单,我个人要花很多时间上这些网志站点。

什么是 Feed(以下称为提要),如何预定它?

网志以 RSS 文档形式为其内容提供一个提要,该 RSS 文档可以通过众所周知 URL 获得。RSS 文档是一个 XML 文件,它包含大量离散的新闻项,如某个网志中的入口项(RSS 提要的例子参见 Figure 1)。由于 RSS 是 XML 格式文件,所以它很容易被其它程序所使用。
  RSS 聚合器是一个读取 RSS 文档并显示新闻项的程序。大多数聚合器只要输入 RSS 的 URL,使得预定提要成为可能。
  RSS 使阅读网志便得容易。大多数经常阅读网志的开发人员都使用某种类型的聚合器来帮助他们有效地筛选提要内容。聚合器使得阅读网志的感觉就象是在阅读电子邮件,因为它们突出新闻项并将新闻项进行缓冲处理以便离线阅读(参见 Figure 2)。
  还有一些在线 RSS 聚合器将 RSS 提要捆绑到某个单独的网站。其优点是易于设置并且可以从任何计算机存取你的提要内容。当然,其缺点也是显而易见的,那就是在阅读时必须始终保持连接。
  RSS 是网志成为一种强大的新型信息交流形式之根本所在。在网志出现之前,大多数开发人员为了要查找到需要的内容,通常要花大量时间来筛选掉那些令人讨厌的无关的信息。
  网志通过让读者选择所要阅读的提要,将控制权交给读者,从而有效地构建自己的个性化内容流。
  其它类型的站点也能利用 RSS 的优点来聚合内容。例如,多数主流的新闻站点包括 Wired、CNet、Yahoo 和 NPR News 都提供 RSS 提要。访问 Blogdigger 和 Syndic8,你可以找到一些支持 RSS 的站点。
  微软的 MSDN 提供 RSS 提要(RSS feeds)来聚合新添加到站点的技术内容。MSDN 的 Just Published提要是一种保持 MSDN 新文章和下载的主要方式。甚至 MSDN Magazine(MSDN 杂志)都有其自己的 RSS 提要!可以预定:http://msdn.microsoft.com/msdnmag/rss/recent.xml 获得每月的更新以便查看本期有何内容?目前有许多种 RSS 聚合器可供选择,在 http://blogs.law.harvard.edu/tech/directory/5/aggr... 上可以找到一个相当完整的列表。其中一些是在线聚合器,而另外一些是桌面应用程序。有些是免费的,另外一些需要付费才能使用。

哪个 RSS 版本是最通用的?

这个问题的答案要看你问的是谁,RSS 的版本有好多个,0.90、0.91、0.92、0.93、0.94、1.0 和 2.0。要弄清楚这些版本之间的差别是巨大的挑战之一。理解它们需要了解一些有关它们的历史背景。Netscape 创建了 RSS 的最初版本 0.90,起初的名字是“RDF Site Summary”或者“Rich Site Summary”(规范中说前者是正式名称)。Netscape 创建 RSS 0.90 用于其 Web 门户,这个时候,其他人看到了 RSS 的使用潜力。Userland Software 是第一个开始将 RSS 用于其网志商业产品者之一。
  版本 0.90 在很大程度上基于 W3C 的 Resource Description Framework (RDF)。许多人都认为 RDF 过于复杂,因此都建议出一个免费的简化版本 0.91。这个任务恰好就给了 Userland Software。Userland Software 便继续发展 RSS 的简化版本,随后出台的版本包括:0.92、0.93 和 0.94。为了强调其所做的简化工作,他们将 RSS 的全称定为“Really Simple Syndication”。
  正当 Userland Software 继续专注于其简化工作时,另外一组开发人员在复兴最初的 RDF 版本(0.90),因为 RSS 号称自己更灵活。他们最终发布了一个 RSS 1.0 的版本,其正式名称还是“RDF Site Summary”。由于使用 RDF,这个版本完全不同于 Userland Software 所控制的版本。Userland Software 当然不太愿意看到 RSS 1.0 似乎要取代其 0.94 版本的事实,于是出了一个新版本,并将版本号一下子跳到了 2.0。
  这就是今天的这种局面,形成了两个主要的竞争版本:一个基于 RDF 1.0,而另一个则不是(2.0),但它们两个都共用相同的名字。这是一种可怕的混乱,因为版本号导致人们误认为 2.0 是 1.0 的改进版本,而实际上它们是两个目标完全不同的规范。另一组开发人员已经下狠心着手解决这种混乱问题,通过定义新的摘要(syndication)规范来与 RSS 名字的随意性决裂。这个解决方案称为 Atom(原子)项目。本文稍后将会详细讨论。
  使用哪个版本其实是无关痛痒的,大多数 RSS 聚合机制支持所有的 RSS 版本(有些甚至支持 Atom)。最终的决定取决于你是否想使用 RDF,可谓萝卜白菜,各有所爱,它完全要看某人所信奉的 Semantic Web 概念而定。

RSS 1.0 和 RSS 2.0 各是什么样子?

RSS 1.0 和 2.0 格式所包含的核心信息相同,但其结构不一样。我提供了一个 RSS 1.0 文档(参见 Figure 1)以及一个同等的 RSS 2.0(参见 Figure 2)用于对照。
你会注意到顶行右边开始的根元素的差异,RSS 1.0 的根元素是 rdf:RDF,而 RSS 2.0 的根元素是 rss。rss 还包含一个强制版本属性用以表示所用的RSS的准确格式(可能的值包括:0.91, 0.94 等)。另一个主要差别是 RSS 1.0 文档有名字空间限定,RSS 2.0 的文档就没有。不管怎样,包含在两个文档中的信息本质上是一样的。
  两个版本都包含 channel 元素,而 channel 元素又包含三个必须的元素:title、description 和 link,其代码如下:

<channel>
<title><!-- channel 的标题 --></title>
<description><!-- 简要描述 --></description>
<link><!-- channel 的 URL --></link>
<!-- 可选/可扩展元素 -->
</channel>
  

  除了这些必须的元素外,RSS 1.0 还定义了三个附加元素:image、items 和 textinput,其中,image 和 textinput 是可选的。另一方面,RSS 2.0 提供了 16 个附加元素,其中也包括 image、items 和 textinput,此外还有 language、copyright、managingEditor、pubDate 和 category。RSS 1.0 允许通过定义在单独的 XML 名字空间中的可扩展元素来创建这种类型的元数据。
  这两种格式在结构上的主要区别必须要看其 item、image 和 textinput 节点的表示形式。RSS 1.0 中,channel 元素包含对 item、image 和 textinput 节点的引用,这些节点存在于 channel 节点本身之外。这样在 channel 和 所引用的节点之间建立了一种 RDF 关联。如 Figure 1 所示,channel 元素与一个 image 元素以及两个 item 元素关联。RSS 2.0 中,item 元素只是在 channel 元素中连续排放(如 Figure 2 所示)。item 元素包含实际的新闻项信息。item 的结构在两个版本中是相同的。item 元素通常包含 title、link 和 description 元素,如下代码所示:

<item>
<title><!-- 项标题 --></title>
<link><!-- 项 URL --></link>
<description><!-- 简要描述 --></description>
<!-- 可选的/可扩展的元素 -->
</item>


  在 RSS 1.0 中,title 和 link 是必须的,description 是可选的。而在 RSS 2.0 中,title 或 description 必须提供其中的一个;其它均可选。这些只是定义在 RSS 1.0 中的 item 元素。RSS 2.0 提供几个其它可选元素,其中有 author、category、comments、enclosure、guid、pubDate 和 source。RSS 1.0 获取这样的元数据是通过定义在单独的 XML 名字空间中称为 RSS 模块的可扩展元素来实现的。例如,在 Figure 1 中,item 的日期是用 Dublic Core 模块的 <dc:date> 元素表示的。

有关不同格式的完整信息请参考 RSS 1.0 和 2.0 规范。

那么,何为 Atom?

前面我提到过,Atom 乃一项目的名字,主要是开发一个新的网志摘要格式以解决目前 RSS 存在的问题(混乱的版本号,不是一个真正的开放标准,表示方法的不一致,定义贫乏等等)。Atom 希望提供一个清晰的版本以解决每个人的需要,其设计完全不依赖于供货商,任何人都可以对之进行自由扩展,完整详细说明。
  当今许多 Blog 引擎已经支持当前的摘要格式。Figure 3 是一个Atom 0.3 提要例子,它与前述 Figure 1 及 Figure 2 RSS 提要等同。注意 Atom 提要用名字空间限定的,但它不使用 RDF。这使得 Atom 和 RSS 1.0 及 RSS 2.0 在某些地方有相似之处。Atom 在未来是否能被接受,人们拭目以待。
  除了定义新的摘要格式之外,Atom 还希望定义一个标准的档案文件格式和一个标准的网志编辑 API(Atom API)。有关 Atom 详细规范以及其它 Atom 资源请访问 The Atom Project。

什么是 blogroll?

blogroll 是网志提要的集合,大多数 blogger(博客)在其个人网志上都提供 blogroll。这就允许读者连接到其他趣味和写作风格相投的人的网志上。Blogroll 方便了网络上的沟通。通过使用Outline Processor Markup Language (OPML),人们可以用 XML 格式文件交换 blogroll。Figure 4 是 blogroll 的一个例子。
  大多数网志引擎都自己管理 blogroll,每当读者请求 blogroll 时都自己产生相应的 XML 格式。同样,大多数聚合器都能导入 blogroll 并自动预定所包含的摘要。有关 OPML 更多的信息参见 http://opml.scripting.com

能解释 referrers、trackbacks 和 pingbacks 是什么吗?

大多数网志软件都能让读者添加网志评论。但更常见的做法是让读者在其自己的网志添加一个入口回链到原来的帖子。博客们(Bloggers)都乐于跟踪连接发生的时间以便新读者能理解整个会话内容。
  所谓 referrer 是一个外部站点,用户单击该站点上一个超链接便可以到达你的网站。许多网志引擎当读者导航到你的网志的某个入口时都能自动保持跟踪。大多数引擎都会在网志入口底部显示一个 referrers 清单,以便读者能往回导航到 referrer 的站点,并清楚他们关于该入口要说些什么,这基于一个假设,那就是如果他们链接到它,可能就此会写些什么。referrer 存在的问题是必须要有这个假设才成立——没有足够的信息说明是否引用的页面事实上包含有关信息。实际上,垃圾信息的发布者为了营销企图已经利用了这个漏洞来重定向读者。
  Trackback 和 pingback 同一个规范,被用来弥补上述问题的方案。使用 trackback 和 pingback,其他博客们能自动发送一个 ping 到你的网志以明确表示他们已经写了一个引用特定帖子的入口。
  这种类型的反链允许你的网志以更明显的方式显示所有评论的清单。当今大多数网志软件支持所有这些技术。参见 TrackBack Technical Specification 和 Pingback 1.0。

如何为我的站点产生 RSS 提要?

Figure 5 举例说明了如何用 asp:Repeater 控件在 .aspx 页面中生成 RSS 2.0 提要。该页面假设你已经在后端代码文件中将控件的 DataSource 属性设置成对应的数据库结果集。

我想聚合几个 RSS 提要并将信息显示在个人网站上,能解释一下如何实现吗?

因为 RSS 提要是 XML 文件,作为练习,你可以用自己最擅长的 XML API,比如,Microsoft .NET Framework 中的 System.Xml,Figure 6 中包含 ASP.NET Web 用户控件代码,它是我编写用来聚合 blogroll 文件中(.opml)所列出的 RSS 提要的一段代码。这段代码假设 opml 元素包含 numberToDisplay 属性,以表示你打算显示的每个提要有多少项。


Figure 7 ASP.NET Web 用户控件

你可以将控件拖到任何 .aspx 页面中,它将显示 blogroll 文件中列出的不同提要的项,Figure 7 显示了 Utah .NET User Group 网站使用这个控件的效果画面。

有没有与网志交互的 Web Services APIs?

许多网志引擎都提供属于自己的 Web service 接口,通过编程与网志交互,但目前还没有出现一种标准化的东西。
.Text 和 dasBlog 两者都提供某些 .asmx 端点,可以通过 SOAP 来实现编辑功能,但其接口是不同的。Blogger.com 提供基于 XML-RPC 的交互式 API (Blogger API)。Userland Software 对Blogger API 的功能进行了增强,并把它叫做 MetaWeblog API。这些可能是当今公认的网志 APIs,但仍然不是所有网志引擎都支持的。还有一个用于添加评论的独力的 API 叫做 Comment API,同样,它也不是被普遍支持。
  Atom 组正在努力解决这些问题,Atom API 定义了一个标准的网志 API 用于发布和编辑网志内容。有关信息请参考 The Atom Project 网站。

发送问题和评论给 Aaron:xmlfiles@microsoft.com。
 
Quoted from Unkown:
作者简介
  Aaron Skonnard 在盐湖城 Northface 大学授课。与人合著有《Essential XML Quick Reference》(Addison-Wesley, 2001)以及《Essential XML》(Addison-Wesley, 2000),经常在会议上演讲。在 http://www.skonnard.com 可以联系上他。
本文出自 MSDN Magazine 的 April 2004 期刊,可通过当地报摊获得,或其最好是 订阅。
<?php

$ADMIN[defaulturl] = "http://www.163.com/404.htm";//盗链返回的地址
$okaysites = array("http://www.163.com/","http://163.com"); //白名单
$ADMIN[url_1] = "http://www.163.com/download/";//下载地点1
$ADMIN[url_2] = "";//下载地点2,以此类推

$reffer = $HTTP_REFERER;
if($reffer) {
$yes = 0;
while(list($domain, $subarray) = each($okaysites)) {
if (ereg($subarray,"$reffer")) {
$yes = 1;
}
}
$theu = "url"."_"."$site";
if ($ADMIN[$theu] AND $yes == 1) {
header("Location: $ADMIN[$theu]/$file");
} else {
header("Location: $ADMIN[defaulturl]");
}
} else {
header("Location: $ADMIN[defaulturl]");
}

?>  


使用方法:将上述代码保存为dao4.php,
比如测试用的validatecode.rar在站点http://163.com/download里面,
则用以下代码表示下载连接.

 
文件名?site=1&file=文件  



例如以下URL.复制到你的站点下试试

 
http://www.163.com/dao4.php?site=1&file=valida...

以上代码测试可用
<?
// ========================== 文件说明 ==========================//
// 文件说明:图片防盗链程序
// --------------------------------------------------------------//
// 程序作者:Sindo(锐利工作室)
// --------------------------------------------------------------//
// 程序版本:0.1
// --------------------------------------------------------------//
// 运行依赖:一个中文字体文件 chinese.fon
// --------------------------------------------------------------//
// 程序主页:http://www.wreny.com
// --------------------------------------------------------------//
// Copyright (C) Wreny Studio. All Rights Reserved.
// ==============================================================//
   main();

   function main() {
       //存放图片的文件夹在服务器上的绝对地址,注意以/结尾
       //$imgRootPath = "D:/WorkSpas/Apache/";
       $imgRootPath = "/home/610c00cfe2827dcf2ebf27314fb027a1/";
       //例外允许连接的网址,注意:自身域名不需要填入,设定为肯定可以连接图片
       $excludeReferArr = array("www.im286.com", "im286.com");

       doJudgeReferer($excludeReferArr);

       $imgRelPath=$_REQUEST['src'];
       if(empty($imgRelPath)){
           doOutputMsgImg("未指定要查看的图片!");
           exit;
       }

       $srcSplitArr = explode(".", $imgRelPath);

       $srcSuffix = $srcSplitArr[count($srcSplitArr)-1];
       $srcSuffix = strtolower($srcSuffix);

       $imgAbsPath = $imgRootPath.$imgRelPath;

       if(!file_exists($imgAbsPath)){
           doOutputMsgImg("对不起,此图片链接已经失效!");
       }
       else if($srcSuffix == "gif") {
           header ("Content-type: image/gif");

           $imgFlag = $_REQUEST['flag'];
           if($imgFlag == "dynGif") {
               $fp = fopen($imgAbsPath, 'r');
               fpassthru($fp);
           }
           else {
               $image = imagecreatefromgif ($imgAbsPath);
               imagegif ($image);
               imagedestroy ($image);
           }
       }
       else if($srcSuffix == "jpg") {
           header ("Content-type: image/jpeg");
           $image = imagecreatefromjpeg (imgAbsPath);
           imagejpeg ($image);
           imagedestroy ($image);
       }
       else if($srcSuffix == "png") {
           header ("Content-type: image/png");

           $image = imagecreatefrompng ($imgAbsPath);
           imagepng ($image);
           imagedestroy ($image);
       }
       else {
           doOutputMsgImg("图像类型不支持");
       }
   }

   function doJudgeReferer($excludeReferArr) {
       $referUrl=parse_url($_SERVER["HTTP_REFERER"]);
       $referHost = $referUrl[host];
       if($referHost!="" && $referHost!=$_SERVER["HTTP_HOST"] && !in_array($referHost, $excludeReferArr)){
           doOutputMsgImg("BS来自".$referUrl[host]."的盗链!");
           exit;
       }
   }

   function doMarkImage($inImg,$inMarkStr="Powered by Wreny.com") {
       $black = imagecolorallocate ($inImg, 0, 0, 0);

       $imgWidth = imagesx($inImg);
       $imgHeight = imagesy($inImg);
       //289-108,86
       drawTxt($inImg,$inMarkStr, ($imgWidth-strlen($inMarkStr)*9),($imgHeight-16), $black);
   }

   function doOutputMsgImg($msg, $imgWidth=468,
       $imgHeight=60, $imgFgColorArr=array(0,0,0), $imgBgColorArr=array(255,255,255)) {
       $img = imagecreatetruecolor($imgWidth, $imgHeight);

       // 用白色背景加黑色边框画个方框
       $backColor = imagecolorallocate($img, 255, 255, 255);
       $borderColor = imagecolorallocate($img, 0, 0, 0);
       imagefilledrectangle($img, 0, 0, $imgWidth - 1, $imgHeight - 1, $backColor);
       imagerectangle($img, 0, 0, $imgWidth - 1, $imgHeight - 1, $borderColor);

       $imgFgColor = imagecolorallocate ($img, $imgFgColorArr[0], $imgFgColorArr[1], $imgFgColorArr[2]);
       drawTxt($img, $msg, ($imgWidth-strlen($msg)*9)/2,($imgHeight/2-16),$imgFgColor);
       doMarkImage($img);

       header('Content-type: image/png');
       imagepng($img);
       imagedestroy($img);
   }

   function isCharVilid($inStr, $inPos) {
       if(strlen($inStr) < ($inPos+1)) {
           return true;
       }
       else {

           for($iLoop=0,$iCounter=0;$iLoop<=$inPos; $iLoop++){
               if(substr($inStr, $iLoop, 1)<='~') {
                   $iCounter++;
               }
           }

           return ( ($iCounter % 2) == 0 );
       }
   }

   function drawTxt($image, $string, $x, $y, $color) {
       $fp = fopen("chinese.fon", "r"); //WIN98中,此文件在:c:windowscommand 下
       if (feof($fp)) {
           fclose($fp);
           return 0;
       }

       //GBK
       $strings = preg_split(
           '/((?:[\x80-\xFF][\x40-\xFF])+)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE
       );

       //print_r($strings);

       $isch = false;

       for ($p = 0, $count = count($strings); $p < $count; $p ++) {
           if ($isch) {
               $string = $strings[$p];
               for ($i = 0, $l = strlen($string) - 1; $i < $l; $i += 2) {
                   $qh = ord($string{$i}); // get ascii code
                   $offset = (94 * ($qh - 0xA0 - 1) + (ord($string{$i + 1}) - 0xA0 - 1)) * 32;

                   fseek($fp, $offset, SEEK_SET);
                   $buffer = unpack('n*', fread($fp, 32));
                   //        $buffers[$offset] = $buffer;
                   for ($yy = 1, $ypos = $y; $yy <= 16; $yy ++, $ypos ++) {
                       $bits = $buffer[$yy];
                       for ($xbit = 32768, $xpos = $x; $xbit > 0; $xbit >>= 1, $xpos ++)  {
                           if ($bits & $xbit) {
                               imagesetpixel($image, $xpos, $ypos, $color);
                           }
                       }
                   }
                   $x += 16;
               }
           }
           else {
               imagestring($image, 12, $x, $y, $strings[$p], $color);
               $x += strlen($strings[$p]) * 9;
           }
           $isch = !$isch;
       }

       return 0;
   }
?>
1. gpedit.msc-----组策略
2. sndrec32-------录音机
3. Nslookup-------IP地址侦测器
4. explorer-------打开资源管理器
5. logoff---------注销命令
6. tsshutdn-------60秒倒计时关机命令
7. lusrmgr.msc----本机用户和组
8. services.msc---本地服务设置
9. oobe/msoobe /a----检查XP是否激活
10. notepad--------打开记事本
11. cleanmgr-------垃圾整理
12. net start messenger----开始信使服务
13. compmgmt.msc---计算机管理
14. net stop messenger-----停止信使服务
15. conf-----------启动netmeeting
16. dvdplay--------DVD播放器
17. charmap--------启动字符映射表
18. diskmgmt.msc---磁盘管理实用程序
19. calc-----------启动计算器
20. dfrg.msc-------磁盘碎片整理程序
21. chkdsk.exe-----Chkdsk磁盘检查
22. devmgmt.msc--- 设备管理器
23. regsvr32 /u *.dll----停止dll文件运行
24. drwtsn32------ 系统医生
25. rononce -p ----15秒关机
26. dxdiag---------检查DirectX信息
27. regedt32-------注册表编辑器
28. Msconfig.exe---系统配置实用程序
29. rsop.msc-------组策略结果集
30. mem.exe--------显示内存使用情况
31. regedit.exe----注册表
32. winchat--------XP自带局域网聊天
33. progman--------程序管理器
34. winmsd---------系统信息
35. perfmon.msc----计算机性能监测程序
36. winver---------检查Windows版本
37. sfc /scannow-----扫描错误并复原
38. taskmgr-----任务管理器(2000/xp/2003
39. winver---------检查Windows版本
40. wmimgmt.msc----打开windows管理体系结构(WMI)
41. wupdmgr--------windows更新程序
42. wscript--------windows脚本宿主设置
43. write----------写字板
44. winmsd---------系统信息
45. wiaacmgr-------扫描仪和照相机向导
46. winchat--------XP自带局域网聊天
47. mem.exe--------显示内存使用情况
48. Msconfig.exe---系统配置实用程序
49. mplayer2-------简易widnows media player
50. mspaint--------画图板
51. mstsc----------远程桌面连接
52. mplayer2-------媒体播放机
53. magnify--------放大镜实用程序
54. mmc------------打开控制台
55. mobsync--------同步命令
56. dxdiag---------检查DirectX信息
57. drwtsn32------ 系统医生
58. devmgmt.msc--- 设备管理器
59. dfrg.msc-------磁盘碎片整理程序
60. diskmgmt.msc---磁盘管理实用程序
61. dcomcnfg-------打开系统组件服务
62. ddeshare-------打开DDE共享设置
63. dvdplay--------DVD播放器
64. net stop messenger-----停止信使服务
65. net start messenger----开始信使服务
66. notepad--------打开记事本
67. nslookup-------网络管理的工具向导
68. ntbackup-------系统备份和还原
69. narrator-------屏幕“讲述人”
70. ntmsmgr.msc----移动存储管理器
71. ntmsoprq.msc---移动存储管理员操作请求
72. netstat -an----(TC)命令检查接口
73. syncapp--------创建一个公文包
74. sysedit--------系统配置编辑器
75. sigverif-------文件签名验证程序
76. sndrec32-------录音机
77. shrpubw--------创建共享文件夹
78. secpol.msc-----本地安全策略
79. syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
80. services.msc---本地服务设置
81. Sndvol32-------音量控制程序
82. sfc.exe--------系统文件检查器
83. sfc /scannow---windows文件保护
84. tsshutdn-------60秒倒计时关机命令
85. tourstart------xp简介(安装完成后出现的漫游xp程序)
86. taskmgr--------任务管理器
87. eventvwr-------事件查看器
88. eudcedit-------造字程序
89. explorer-------打开资源管理器
90. packager-------对象包装程序
91. perfmon.msc----计算机性能监测程序
92. progman--------程序管理器
93. regedit.exe----注册表
94. rsop.msc-------组策略结果集
95. regedt32-------注册表编辑器
96. rononce -p ----15秒关机
97. regsvr32 /u *.dll----停止dll文件运行
98. regsvr32 /u zipfldr.dll------取消ZIP支持
99. cmd.exe--------CMD命令提示符
100. chkdsk.exe-----Chkdsk磁盘检查
101. certmgr.msc----证书管理实用程序
102. calc-----------启动计算器
103. charmap--------启动字符映射表
104. cliconfg-------SQL SERVER 客户端网络实用程序
105. Clipbrd--------剪贴板查看器
106. conf-----------启动netmeeting
107. compmgmt.msc---计算机管理
108. cleanmgr-------垃圾整理
109. ciadv.msc------索引服务程序
110. osk------------打开屏幕键盘
111. odbcad32-------ODBC数据源管理器
112. oobe/msoobe /a----检查XP是否激活
113. lusrmgr.msc----本机用户和组
114. logoff---------注销命令
115. iexpress-------木马捆绑工具,系统自带
116. Nslookup-------IP地址侦测器
117. fsmgmt.msc-----共享文件夹管理器
118. utilman--------辅助工具管理器
119. gpedit.msc-----组策略
自己写的tc2,共享给大家,希望听听大家的高见,以待完善.觉得好的,就帮忙顶一下,以便更多的人共同探索,发现问题,解决问题,总结问题.谢谢.

#!/bin/bash
#脚本文件名: tc2
#########################################################################################
#用TC(Traffic Control)解决ADSL宽带速度技术 Ver. 1.0 by KindGeorge 2004.12.27 #
#########################################################################################
#此脚本经过实验通过,更多的信息请参阅http://lartc.org
#tc+iptables+HTB+SFQ
#
#一.什么是ADSL? ADSL(Asymmetric Digital Subscriber Loop,非对称数字用户环路)
#用最简单的话的讲,就是采用上行和下行不对等带宽的基于ATM的技术.
#举例,我们最快的其中一条ADSL带宽是下行3200Kbit,上行只有320Kbit.带宽通常用bit表示.
#
#1、下行3200K 意味着什么?
#因为 1Byte=8Bit ,一个字节由8个位(bit)组成,一般用大写B表示Byte,小写b表示Bit.
#所以 3200K=3200Kbps=3200K bits/s=400K bytes/s.
#2、 上行320K 意味着什么?
# 320K=320Kbps=320K bits/s=40K bytes/s.
#就是说,个人所能独享的最大下载和上传速度,整条线路在没任何损耗,最理想的时候,
#下载只有400K bytes/s,上传只有最大40K bytes/s的上传网速.
#这些都是理想值,但现实总是残酷的,永远没有理想中那么好.至少也有损耗,何况内部网有几十台
#电脑一起疯狂上网.
#
#3.ADSL上传速度对下载的影响
#(1)TCP/IP协议规定,每一個封包,都需要有acknowledge讯息的回传,也就是说,传输的资料,
#需要有一个收到资料的讯息回复,才能决定后面的传输速度,並决定是否重新传输遗失
#的资料。上行的带宽一部分就是用來传输這些acknowledge(确认)資料模鄙闲懈涸毓?
#大的时候,就会影响acknowledge资料的传送速度,并进而影响到下载速度。这对非对称
#数字环路也就是ADSL这种上行带宽远小于下载带宽的连接来说影响尤为明显。
#(2)试验证明,当上传满载时,下载速度变为原来速度的40%,甚至更低.因为上载文件(包括ftp
#上传,发邮件smtp),如果较大,一个人的通讯量已经令整条adsl变得趋向饱和,那么所有的数据
#包只有按照先进先出的原则进行排队和等待.这就可以解释为什么网内其中有人用ftp上载文件,
#或发送大邮件的时候,整个网速变得很慢的原因。
#
#二.解决ADSL速度之道
#1. 为解决这些速度问题,我们按照数据流和adsl的特点,对经过线路的数据进行了有规则的分流.
#把本来在adsl modem上的瓶颈转移到我们linux路由器上,可以把带宽控制的比adsl modem上的小一点,
#这样我们就可以方便的用tc技术对经过的数据进行分流和控制.
#我们的想象就象马路上的车道一样,有高速道,还有小车道,大车道.需要高速的syn,ack,icmp等走
#高速道,需要大量传输的ftp-data,smtp等走大车道,不能让它堵塞整条马路.各行其道.
#2. linux下的TC(Traffic Control)就有这样的作用.只要控制得当,一定会有明显的效果.
#tc和iptables结合是最好的简单运用的结合方法.
#我们设置过滤器以便用iptables对数据包进行分类,因为iptables更灵活,而且你还可以为每个规则设
#置计数器. iptables用mangle链来mark数据包,告诉了内核,数据包会有一个特定的FWMARK标记值(hanlde x fw),
#表明它应该送给哪个类( classid x : x),而prio是优先值,表明哪些重要数据应该优先通过哪个通道.
#首先选择队列,cbq和htb是不错的选择,经过实验,htb更为好用,所以以下脚本采用htb来处理
#3. 一般系统默认的是fifo的先进先出队列,就是说数据包按照先来先处理的原则,如果有一个大的数
#据包在前面,#那么后面的包只能等前面的发完后才能接着发了,这样就算后面即使是一个小小的ack包,
#也要等待了,这样上传就影响了下载,就算你有很大的下载带宽也无能为力.
#HTB(Hierarchical Token Bucket, 分层的令牌桶)
#更详细的htb参考 http://luxik.cdi.cz/~devik/qos/htb/
#HTB就象CBQ一样工作,但是并不靠计算闲置时间来整形。它是一个分类的令牌桶过滤器。它只有很少的参数
#他的分层(Hierarchical)能够很好地满足这样一种情况:你有一个固定速率的链路,希望分割给多种不同的
#用途使用,为每种用途做出带宽承诺并实现定量的带宽借用。
#4. 结构简图:
#~~~~~~ |
#~~~~~ __1:__
#~~~~ |~~~~~ |
#~ _ _ _1:1~~~ 1:2_ _ _ _ _ _ _ _
# | ~ ~ | ~ ~ ~ | ~ ~ | ~ ~ | ~ ~ |
#1:11~1:12~~1:21~1:22~1:23~1:24
#优先顺序是1:11 1:12 1:21 1:22 1:23 1:24
#
#--------------------------------------------------------------------------------------------
#5.根据上面的例子,开始脚本
#通常adsl用pppoe连接,的得到的是ppp0,所以公网网卡上绑了ppp0
#关于参数的说明
#(1)rate: 是一个类保证得到的带宽值.如果有不只一个类,请保证所有子类总和是小于或等于父类.
#(2)ceil: ceil是一个类最大能得到的带宽值.
#(3)prio: 是优先权的设置,数值越大,优先权越小.如果是分配剩余带宽,就是数值小的会最优先取得剩余
#的空闲的带宽权.
#具体每个类要分配多少rate,要根据实际使用测试得出结果.
#一般大数据的话,控制在50%-80%左右吧,而ceil最大建议不超过85%,以免某一个会话占用过多的带宽.
#rate可按各类所需分配,
#1:11 是很小而且最重要的数据包通道,当然要分多点.甚至必要时先全部占用,不过一般不会的.所以给全速.
#1:12 是很重要的数据道,给多点,最少给一半,但需要时可以再多一点.
#rate 规划 1:2 = 1:21 + 1:22 + 1:23 + 1:24 一般总数在50%-80%左右
#1:21 http,pop是最常用的啦,为了太多人用,而导致堵塞,我们不能给得太多,也不能太少.
#1:22 我打算给smtp用,优先低于1:21 以防发大的附件大量占用带宽,
#1:23 我打算给ftp-data,和1:22一样,很可能大量上传文件,所以rate不能给得太多,而当其他有剩时可以给大些,ceil设置大些
#1:24 是无所谓通道,就是一般不是我们平时工作上需要的通道了,给小点,防止这些人在妨碍有正常工作需要的人
#上行 uplink 320K,设置稍低于理论值
DEV="ppp0"
UPLINK=300
#下行downlink 3200 k 大概一半左右,以便能够得到更多的并发连接
DOWNLINK=1500

echo "==================== Packetfilter and Traffic Control 流量控制 By 网络技术部 Ver. 1.0===================="

start_routing() {
echo -n "队列设置开始start......"
#1.增加一个根队列,没有进行分类的数据包都走这个1:24是缺省类:
tc qdisc add dev $DEV root handle 1: htb default 24
#1.1增加一个根队下面主干类1: 速率为$UPLINK k
tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit prio 0

#1.1.1 在主干类1下建立第一叶子类,这是一个最高优先权的类.需要高优先和高速的包走这条通道,比如SYN,ACK,ICMP等
tc class add dev $DEV parent 1:1 classid 1:11 htb rate $[$UPLINK]kbit ceil ${UPLINK}kbit prio 1
#1.1.2 在主类1下建立第二叶子类 ,这是一个次高优先权的类。比如我们重要的crm数据.
tc class add dev $DEV parent 1:1 classid 1:12 htb rate $[$UPLINK-150]kbit ceil ${UPLINK-50}kbit prio 2

#1.2 在根类下建立次干类 classid 1:2 。此次干类的下面全部优先权低于主干类,以防重要数据堵塞.
tc class add dev $DEV parent 1: classid 1:2 htb rate $[$UPLINK-150]kbit prio 3

#1.2.1 在次干类下建立第一叶子类,可以跑例如http,pop等.
tc class add dev $DEV parent 1:2 classid 1:21 htb rate 100kbit ceil $[$UPLINK-150]kbit prio 4

#1.2.2 在次干类下建立第二叶子类。不要太高的速度,以防发大的附件大量占用带宽,例如smtp等
tc class add dev $DEV parent 1:2 classid 1:22 htb rate 30kbit ceil $[$UPLINK-160]kbit prio 5

#1.2.3 在次干类下建立第三叶子类。不要太多的带宽,以防大量的数据堵塞网络,例如ftp-data等,
tc class add dev $DEV parent 1:2 classid 1:23 htb rate 15kbit ceil $[$UPLINK-170]kbit prio 6

#1.2.4 在次干类下建立第四叶子类。无所谓的数据通道,无需要太多的带宽,以防无所谓的人在阻碍正务.
tc class add dev $DEV parent 1:2 classid 1:24 htb rate 5kbit ceil $[$UPLINK-250]kbit prio 7

#在每个类下面再附加上另一个队列规定,随机公平队列(SFQ),不被某个连接不停占用带宽,以保证带宽的平均公平使用:
#SFQ(Stochastic Fairness Queueing,随机公平队列),SFQ的关键词是“会话”(或称作“流”) ,
#主要针对一个TCP会话或者UDP流。流量被分成相当多数量的FIFO队列中,每个队列对应一个会话。
#数据按照简单轮转的方式发送, 每个会话都按顺序得到发送机会。这种方式非常公平,保证了每一
#个会话都不会没其它会话所淹没。SFQ之所以被称为“随机”,是因为它并不是真的为每一个会话创建
#一个队列,而是使用一个散列算法,把所有的会话映射到有限的几个队列中去。
#参数perturb是多少秒后重新配置一次散列算法。默认为10
tc qdisc add dev $DEV parent 1:11 handle 111: sfq perturb 5
tc qdisc add dev $DEV parent 1:12 handle 112: sfq perturb 5
tc qdisc add dev $DEV parent 1:21 handle 121: sfq perturb 10
tc qdisc add dev $DEV parent 1:22 handle 122: sfq perturb 10
tc qdisc add dev $DEV parent 1:23 handle 133: sfq perturb 10
tc qdisc add dev $DEV parent 1:24 handle 124: sfq perturb 10
echo "队列设置成功.done."
echo -n "设置包过滤 Setting up Filters......"
#这里设置过滤器,handle 是iptables作mark的值,让被iptables 在mangle链做了mark的不同的值选择不同的通
#道classid,而prio 是过滤器的优先级别.
tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
tc filter add dev $DEV parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
tc filter add dev $DEV parent 1:0 protocol ip prio 3 handle 3 fw classid 1:21
tc filter add dev $DEV parent 1:0 protocol ip prio 4 handle 4 fw classid 1:22
tc filter add dev $DEV parent 1:0 protocol ip prio 5 handle 5 fw classid 1:23
tc filter add dev $DEV parent 1:0 protocol ip prio 6 handle 6 fw classid 1:24
echo "设置过滤器成功.done."



########## downlink ##########################################################################
#6. 下行的限制:
#设置入队的规则,是因为把一些经常会造成下载大文件的端口进行控制,不让它们来得太快,导致堵塞.来得太快
#的就直接drop,就不会浪费和占用机器时间和力量去处理了.
#(1). 把下行速率控制在大概1000-1500k左右,因为这个速度已经足够用了,以便能够得到更多的并发下载连接

tc qdisc add dev $DEV handle ffff: ingress

tc filter add dev $DEV parent ffff: protocol ip prio 50 handle 8 fw police rate ${DOWNLINK}kbit burst 10k drop flowid :8
}
#(2).如果内部网数据流不是很疯狂的话,就不用做下载的限制了,用#符号屏蔽上面两行即可.
#(3).如果要对任何进来数据的数据进行限速的话,可以用下面这句:
#tc filter add dev $DEV parent ffff: protocol ip prio 10 u32 match ip src 0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1

###############################################################################################
#7. 开始给数据包打标记,往PREROUTING链中添加mangle规则:
start_mangle() {

echo -n "开始给数据包打标记......start mangle mark......"

#(1)把出去的不同类数据包(为dport)给mark上标记1--6.让它走不同的通道
#(2)把进来的数据包(为sport)给mark上标记8,让它受到下行的限制,以免速度太过快而影响全局.
#(3)每条规则下根着return的意思是可以通过RETURN方法避免遍历所有的规则,加快了处理速度
##设置TOS的处理:
#iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 1
#iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j RETURN
#iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j MARK --set-mark 4
#iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j RETURN
#iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 5
#iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j RETURN

##提高tcp初始连接(也就是带有SYN的数据包)的优先权是非常明智的:
iptables -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN

######icmp,想ping有良好的反应,放在第一类吧.
iptables -t mangle -A PREROUTING -p icmp -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p icmp -j RETURN

# small packets (probably just ACKs)长度小于64的小包通常是需要快些的,一般是用来确认tcp的连接的,
#让它跑快些的通道吧.也可以把下面两行屏蔽,因为再下面有更多更明细的端口分类.
#iptables -t mangle -A PREROUTING -p tcp -m length --length :64 -j MARK --set-mark 2
#iptables -t mangle -A PREROUTING -p tcp -m length --length :64 -j RETURN

#ftp放第2类,因为一般是小包, ftp-data放在第5类,因为一般是大量数据的传送.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp-data -j MARK --set-mark 5
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp-data -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j RETURN
##提高ssh数据包的优先权:放在第1类,要知道ssh是交互式的和重要的,不容待慢哦
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 22 -j RETURN
#
##smtp邮件:放在第4类,因为有时有人发送很大的邮件,为避免它堵塞,让它跑4道吧
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j RETURN
#iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j MARK --set-mark 8
#iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j RETURN
## name-domain server:放在第1类,这样连接带有域名的连接才能快速找到对应的地址,提高速度的一法
iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j RETURN
#
## http:放在第3类,是最常用的,最多人用的,
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j RETURN
##pop邮件:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j RETURN
## https:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j RETURN
## Microsoft-SQL-Server:放在第2类,我这里认为较重要,一定要保证速度的和优先的.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1433 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1433 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 1433 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 1433 -j RETURN

## voip用, 提高,语音通道要保持高速,才不会断续.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1720 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1720 -j RETURN
iptables -t mangle -A PREROUTING -p udp -m udp --dport 1720 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 1720 -j RETURN

## vpn ,用作voip的,也要走高速路,才不会断续.
iptables -t mangle -A PREROUTING -p udp -m udp --dport 7707 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 7707 -j RETURN

## 放在第1类,因为我觉得它在我心中很重要,优先.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 7070 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 7070 -j RETURN

## WWW caching service:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j RETURN

##提高本地数据包的优先权:放在第1
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22 -j RETURN

iptables -t mangle -A OUTPUT -p icmp -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p icmp -j RETURN

#本地small packets (probably just ACKs)
iptables -t mangle -A OUTPUT -p tcp -m length --length :64 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp -m length --length :64 -j RETURN

#(4). 向PREROUTING中添加完mangle规则后,用这条规则结束PREROUTING表:
##也就是说前面没有打过标记的数据包将交给1:24处理。
##实际上是不必要的,因为1:24是缺省类,但仍然打上标记是为了保持整个设置的协调一致,而且这样
#还能看到规则的包计数。

iptables -t mangle -A PREROUTING -i $DEV -j MARK --set-mark 6
echo "标记完毕! mangle mark done!"
}
#-----------------------------------------------------------------------------------------------------

#8.取消mangle标记用的自定义函数
stop_mangle() {

echo -n "停止数据标记 stop mangle table......"
( iptables -t mangle -F && echo "ok." ) || echo "error."
}

#9.取消队列用的
stop_routing() {
echo -n "(删除所有队列......)"
( tc qdisc del dev $DEV root && tc qdisc del dev $DEV ingress && echo "ok.删除成功!" ) || echo "error."
}

#10.显示状态
status() {
echo "1.show qdisc $DEV (显示上行队列):----------------------------------------------"
tc -s qdisc show dev $DEV
echo "2.show class $DEV (显示上行分类):----------------------------------------------"
tc class show dev $DEV
echo "3. tc -s class show dev $DEV (显示上行队列和分类流量详细信息):------------------"
tc -s class show dev $DEV
echo "说明:设置总队列上行带宽 $UPLINK k."
echo "1. classid 1:11 ssh、dns、和带有SYN标记的数据包。这是最高优先权的类包并最先类 "
echo "2. classid 1:12 重要数据,这是较高优先权的类。"
echo "3. classid 1:21 web,pop 服务 "
echo "4. classid 1:22 smtp服务 "
echo "5. classid 1:23 ftp-data服务 "
echo "6. classid 1:24 其他服务 "
}

#11.显示帮助
usage() {
echo "使用方法(usage): `basename $0` [start | stop | restart | status | mangle ]"
echo "参数作用:"
echo "start 开始流量控制"
echo "stop 停止流量控制"
echo "restart 重启流量控制"
echo "status 显示队列流量"
echo "mangle 显示mark标记"
}

#----------------------------------------------------------------------------------------------
#12. 下面是脚本运行参数的选择的控制
#
kernel=`eval kernelversion`
case "$kernel" in
2.2)
echo " (!) Error: won't do anything with 2.2.x 不支持内核2.2.x"
exit 1
;;

2.4|2.6)
case "$1" in
start)
( start_routing && start_mangle && echo "开始流量控制! TC started!" ) || echo "error."

exit 0
;;

stop)
( stop_routing && stop_mangle && echo "停止流量控制! TC stopped!" ) || echo "error."

exit 0
;;
restart)
stop_routing
stop_mangle
start_routing
start_mangle

echo "流量控制规则重新装载!"
;;
status)
status
;;

mangle)
echo "iptables -t mangle -L (显示目前mangle表表标记详细):"
iptables -t mangle -nL
;;


*) usage
exit 1
;;
esac
;;

*)
echo " (!) Error: Unknown kernel version. check it !"
exit 1
;;
esac
#三.结束语
#1. 如果要支持htb,请到相关网站下载有关补丁.
#此脚本是参考http://lartc.orghttp://luxik.cdi.cz/~devik/qos/htb/http://www.docum.org/docum.org
#和听取chinaunix.net的C++版主JohnBull的"Linux的高级路由和流量控制北京沙龙讲座录音
#及关于<<Linux的高级路由和流量控制HOWTO中文版>>,经过不断调试得出的总结结果,在此感谢所有作出贡献的人.
#2. iptables,在http://www.iptables.org/ .iptables v1.2.7a 和tc是Red hat linux 9.0下自带的版本.
#3. 此脚本已经在Red Hat Linux 9.0内核2.4.20上,内网约70台频繁上网机器的环境下运行数月,事实证明良好.
#4. 如果ADSL带宽不同或有变,调节相关rate参数及ceil参数即可.
#5. 还有,如果结合IMQ,IMQ(Intermediate queueing device,中介队列设备)把上行和下行都进行分类控制
#就更理想了,但要支持IMQ,就要重新编译内核.关于补丁和更多的文档请参阅imq网站http://www.linuximq.net/
#6. 欢迎交流yahoo messegsender: kindgeorge#yahoo.com此脚本将有待不断完善.
#7. 除了ADSL外,还可以进行其他宽带的控制.
#8. 如果看谁老是在网内搞鬼,经常占满带宽,就把它列为黑名单,并派到"无所谓的数据通道",以防无所谓的人
#在阻碍正务: iptables -t mangle -I PREROUTING 1 -s 192.168.xxx.xxx -j MARK --set-mark 6
# iptables -t mangle -I PREROUTING 2 -s 192.168.xxx.xxx -j RETURN
#9.使用方法: 整篇文档拷贝后,chmod +x tc2 ,
#执行脚本: ./tc2 start (或其他参数start | stop | restart | status | mangle )即可
#如果想每次在ppp启动时就启动,则在/etc/ppp/ip-up 文件里面加上一句: /路径/tc2 restart
echo "script done!"
exit 1
#end----------------------------------------------------------------------------------------



结合web界面的流量监测就更完美了.
进行流量监测相关例子可以参阅:http://bbs.chinaunix.net/forum/viewtopic.php?t=480...
分页: 12/26 第一页 上页 8 9 10 11 12 13 14 15 16 下页 最后页 [ 显示模式: 摘要 | 列表 ]