找回密码
 加入
搜索
查看: 4910|回复: 6

[AU3基础] 网络电视很好看,但如何控制带宽?

[复制链接]
发表于 2011-12-21 09:10:17 | 显示全部楼层 |阅读模式
头些天看了好几个网络电视的源码,要说网络电视确实是不错,有这么多台。
要看电视有网络电视...
要看视频有优酷土豆...
要玩游戏有在线游戏....
另有迅雷BT等P2P下载工具...
还有一些夸张的网站,只要浏览打开就不停装载广告,脚本,flash视频...等元素
电脑CPU,内存资源,本机带宽,被迫以最高速,最优先,最独断....等方式,抢占网络。
结果悲剧了,在线视频浏览器没法控制其下载流量,浏览其他网页慢如龟行....
如果网内是多台电脑通过路由上网,就更悲剧,某人看视频玩游戏,别人只好看“网页白板”...

........
AU3或者UDF,有没有办法做到限制本机流量....?
发表于 2011-12-21 09:40:22 | 显示全部楼层
...限制本机?
局域网一般是通过路由或交换机来限制的.
 楼主| 发表于 2011-12-21 10:18:42 | 显示全部楼层


以上是截图,在线观看视频
同时用浏览器查看新闻
网页迟迟不能打开
同时视频出现卡顿
本机尚且如此,网内别的电脑就更不用说了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2011-12-21 10:27:31 | 显示全部楼层
回复 2# user3000

-----------------------------------------

谢谢!
主要是想学习或了解用AU3来解决的方法。
有的宽带路由器是有流量分配的功能,
但由于宽带路由的体积与散热的局限性,其内置芯片的计算效率等....
流量很大时,也是可能死机断线的。

而还有很多宽带路由器并不带流量控制的,或者软件不支持之类。

查看了一些坛里的资料,多是介绍调用netlimter,P2P终结者,网络执法官...等
要不就是XX管家,XX卫士....

当然可以暂时用着,但AU3自已可以完成吗?
 楼主| 发表于 2011-12-21 10:32:33 | 显示全部楼层
 楼主| 发表于 2011-12-21 10:46:59 | 显示全部楼层
百度百科一下:


流量监控原理


  目前网络上有多种流量监控工具,它们的原理各不相同。


1.  用微软提供的API 接口进行流量监控

  这是很常用的一种监控方法,利用微软提供的API接口可以很容易地获得流量数据,但是此种方法会受多方面因素的限制,得到的结果很有可能不准确、得到结果有延迟、或者得不到结果。 此类方法的流量监控通常安装后即可使用而不用重启电脑。

2.用底层驱动的方式获得网卡数据流量数据

  这是一种不太常用的方法,技术难度较高,不易受其他因素的影响,获得的信息准确,无延迟,兼容性好,而且很容易限制被监控程序的流量。   此类方法的流量监控软件在安装后可能要重启计算机。

3.调用Windows中的组件获得流量数据
  调用Windows性能工具获得网络流量,此类方法不常用,难度大,而且仅仅对Vista/Windows7系统有效。基本没有软件会使用这种方法。

为什么需要流量监控

  随着互联网发展越来越快,人们对宽带速度要求也越来越高,512已经是过去时了,现在办理2M宽带很常见。但是许多网民会发现自己的带宽总是不够,不管从下载、打游戏、在线电影速度很不稳定,忽高忽低,让人难以捉摸。


..............................................
...........................................
 楼主| 发表于 2011-12-21 10:59:20 | 显示全部楼层
这一篇资料更有质量,望坛内高手拿下


原文网址:
http://blog.csdn.net/shejingjing/article/details/6771192

WINDOWS下利用QOS实现流量控制
分类: Win32 Dev CC++ 2011-09-13 14:42
摘要:
限制网络流量的方法包括路由器端限制和本地限制,一般企业采用的是路由器限制的方法,但是并不是所有的路由器都支持流量限制功能。本文尝试解决如下问题:局域网内的机器上都安装一客户端软件,并连接到一内网服务器;客户端软件控制客户机网络流量,服务器负责制定并分发控制规则。本文采用的是Windows系统提供的流量控制功能

一、问题提出及描述
在Windows系统上利用客户端软件控制网络流量,对于内网和外网连接区别对待。如某用户使用BT下载,占用带宽,影响其他同事正常上网,这种情况是需要限制的。而局域网内部应用,则不应受限制。限制外网连接的上传、下载速度,避免造成阻塞,影响正常工作。

二、问题分析
问题的关键是网络流量控制,Windows系统本身提供了流量控制功能,
看一下MSDN关于Traffic Control的描述:
Traffic Control API
The traffic control application programming interface (TC API), is a programmatic interface to the components that regulate network traffic on local hosts; both from an internal perspective (within the kernel itself), and from a network perspective (prioritization and queuing of packets based on transmission priority).
Traffic control is implicitly invoked through calls made to the QOS API and subsequently serviced by the RSVP service provider (RSVP SP). However, applications that require further or specific control over traffic control can use the TC API. The RSVP Service also uses TC API calls.
Note that the use of functions in the TC API requiresadministrative privilege  .
Windows本身提供了流量控制功能,我们要做的就是call TC API.


--------------------------------------

原文网址:
http://blog.csdn.net/shejingjing/article/details/6771192

贴出全文:


流量控制的原理:
从上面的描述中我们可以看到,Windows提供的Traffic Control使用的是QOS中的RSVP(资源预留)协议。
资源预留(适于综合服务): 根据某个应用对QoS的要求来分配网络资源, 并且服从带宽管理策略
RSVP 提 供 网 络 资 源 预 留 的 信 令。 尽 管 RSVP 经 常 用 于 单 个 流, 但 也 用 于 聚 合 流 的 资 源 预 留 。
RSVP 是 一 个 信 令 协 议, 它 提 供 建 立 连 接 的 资 源 预 留, 控 制 综 合 业 务, 往 往 在 IP 网 络 上 提 供 仿 真 电 路。 RSVP 是 所 有 QoS 技 术 中 最 复 杂 的 一 种, 与 尽 力 而 为 的 IP 服 务 标 准 差 别 最 大 , 它 能 提 供 最 高 的 QoS 等 级, 使 得 服 务 得 到 保 障、 资 源 分 配 量 化, 服 务 质 量 的 细 微 变 化 能 反 馈 给 支 持 QoS 的 应 用 和 用 户。

Traffic Control对系统的依赖:
系统需求:Windows 2000及以上版本
系统软件需求:需要客户机安装
各系统测试结果:

系统        需要的组件        默认是否安装        安装后是否可控          
Win2000 Professional        Qos数据包安装计划        否        可          
Windows Server 2003 En        Qos数据包安装计划        否        可          
Windows XP Professional        Qos数据包安装计划        是        可          
Windows vista        Qos数据包安装计划        是        可         

如何限制用户访问外网速度而不限制内网访问速度?
第一步限制所有的网段到期望的速率,ip:0.0.0.0,Mask:0.0.0.0
第二步重新设置对内网的限制:如,132.132.0.0,Mask:255.255.0.0
此方法已经过测试,证明可行

如何调整速率限制的大小?
The TcModifyFlow function modifies an existing flow. When callingTcModifyFlow, newFlowspec parameters and any traffic control objects should be filled.


三、问题解决
下面是TC API列表,函数的详细描述请参见MSDN,本文会解释部分用到的关键函数。

根据调用顺序排序:
TcRegisterClient   // 调用Tc API,必须首先调用这个。注册一个使用TCI(流量控制接口)的客户端
TcEnumerateInterfaces // 枚举可用户流量控制的接口。接口=网卡?待确定
TcOpenInterface   // 打开接口
TcAddFlow           // 添加一个Flow,一个Flow可以看做一个或一类连接(Connection)
TcAddFilter           // 添加一个Filter,Filter是实现流量控制的关键对象,我们将在下文解释
TcDeleteFilter     // 删除Fliter
TcDeleteFlow     // 删除Flow
TcCloseInterface    // 关闭Tc接口
// 下面这些是一些功能函数,对限制流量功能来说并不是必须调用的,详细解释可以查看MSDN。
TcDeregisterClient
TcEnumerateFlows
TcGetFlowName
TcModifyFlow
TcQueryFlow
TcQueryInterface
TcSetFlow
TcSetInterface

结合一下代码来详细解释一下程序执行过程。
/******************************************************************
* 函数介绍:限制一个Connection的网络流量
* 输入参数:nProtocol:要限制流量的协议类型
            pzSrcIp:源IP
                    nSrcPort:源端口
                    pzDstIp:目标IP
                    nDstPort:目标端口
                    nTraffic:限制流量
* 输出参数:
* 返回值  :成功返回0;失败返回错误码
*******************************************************************/
注意:设置网段流量限制的函数和这个函数大体相同
int CTrafficControl::AddTrafficControl(
                                                                     int nProtocol,
                                                                     const char *pzSrcIp,
                                                                     const int nSrcPort,
                                                                     const char *pzDstIp,
                                                                     const int nDstPort,
                                                                     int nTraffic
                                                                 )
{
      HANDLE   ClientHandle;   
      HANDLE   ifcHandle;   
      HANDLE   flowHandle;   
      HANDLE   FilterHandle;

   // QOS函数列表,处理各种事件通知回调函数
      TCI_CLIENT_FUNC_LIST   QoSFunctions;   
      QoSFunctions.ClAddFlowCompleteHandler   =   NULL;   
      QoSFunctions.ClDeleteFlowCompleteHandler   =   NULL;
      QoSFunctions.ClModifyFlowCompleteHandler   =   NULL;   
      QoSFunctions.ClNotifyHandler  = (TCI_NOTIFY_HANDLER)MyClNotifyHandler;
      
      // 注册Client,获取Client句柄
      long   result   =   TcRegisterClient(CURRENT_TCI_VERSION,   NULL,   &QoSFunctions   ,   &ClientHandle);
      if( NO_ERROR != result )
      {
             //cout << "TcRegisterClient error" << endl;
             return result;
      }

      // 获取TC接口。枚举接口->根据接口名称打开接口
      TC_IFC_DESCRIPTOR   InterfaceBuffer[40];   
      PTC_IFC_DESCRIPTOR   pInterfaceBuffer   =   &InterfaceBuffer[0];   
      ULONG   BufferSize   =   40 * sizeof(TC_IFC_DESCRIPTOR);   
      result   =   TcEnumerateInterfaces(ClientHandle,   &BufferSize,   pInterfaceBuffer);  
      if( NO_ERROR != result )
      {
             //cout << "TcEnumerateInterfaces error:" << result << endl;
             return result;
      }

      // 打开接口。注1:项目编码请使用Unicode编码,否则这里会出错,出现ERROR_NOT_FOUND找不到接口的错误。
      result   =   TcOpenInterface( InterfaceBuffer[0].pInterfaceName,   ClientHandle,   NULL,   &ifcHandle   );
      if( NO_ERROR != result )
      {
             //cout << "TcOpenInterface error:" << result << endl;
             return result;
      }

      // 创建一个Flow,下面是关键代码
      int   curSize   =   sizeof(TC_GEN_FLOW)   +  sizeof(QOS_DS_CLASS)   +   sizeof(QOS_TRAFFIC_CLASS)   +   sizeof(QOS_OBJECT_HDR);
      char   *bufFlow   =   new   char[curSize];   
      PTC_GEN_FLOW   newFlow   =   (   PTC_GEN_FLOW   )bufFlow;   
      LPQOS_OBJECT_HDR   objHdr   =   NULL;

      // 设置FlowerSpec属性. SetFlowSpec函数实现参见附件中的代码
      FLOWSPEC sendFlowspec, recvFlowspec;
      SetFlowSpec( sendFlowspec, nTraffic, SERVICETYPE_QUALITATIVE );
      SetFlowSpec( recvFlowspec, nTraffic, SERVICETYPE_QUALITATIVE );
     newFlow->SendingFlowspec = sendFlowspec;
      newFlow->ReceivingFlowspec = recvFlowspec;

      newFlow-> TcObjectsLength   =   sizeof(QOS_DS_CLASS)   +   sizeof(QOS_TRAFFIC_CLASS)   +   sizeof(QOS_OBJECT_HDR);  
      
      LPQOS_DS_CLASS   pQOSClass   =   (LPQOS_DS_CLASS)(&(newFlow-> TcObjects[0])   );
      pQOSClass-> ObjectHdr.ObjectType   =   QOS_OBJECT_DS_CLASS;
      pQOSClass-> ObjectHdr.ObjectLength   =   sizeof(QOS_DS_CLASS);
      pQOSClass-> DSField   =   0x24;
      LPQOS_TRAFFIC_CLASS   pTRClass   =   (LPQOS_TRAFFIC_CLASS)((char*)&(newFlow-> TcObjects[0])+   sizeof(QOS_DS_CLASS));
      pTRClass-> ObjectHdr.ObjectType   =   QOS_OBJECT_TRAFFIC_CLASS;
      pTRClass-> ObjectHdr.ObjectLength   =   sizeof(QOS_TRAFFIC_CLASS);
      pTRClass-> TrafficClass   =   0x3;
      objHdr   =   (LPQOS_OBJECT_HDR)((char *)&(newFlow-> TcObjects[0])   +   sizeof(QOS_DS_CLASS)   +   sizeof   (QOS_TRAFFIC_CLASS));
      objHdr-> ObjectType   =   QOS_OBJECT_END_OF_LIST;
      objHdr-> ObjectLength   =   sizeof(QOS_OBJECT_HDR);
   // 添加Flow到打开的接口中。
   // 注意,FlowSpec设置错误会导致这里添加失败。相关规则请参见MSDN中FLOWSPEC的解释
      result = TcAddFlow( ifcHandle,   /*ClientHandle*/NULL,   0,   newFlow,   &flowHandle   );
      if( NO_ERROR != result )
      {
             //cout << "TcAddFlow Error::" << result << endl;
             return result;
      }

      // 创建Filter。
   // Flow设定了流量的限制,Filter设定需要限制流量的条件
      TC_GEN_FILTER   GenericFilter;
      IP_PATTERN   Pattern,   Mask;
      memset(&Pattern,0,sizeof(IP_PATTERN));   
      memset(&Mask,0,sizeof(IP_PATTERN));   
      GenericFilter.AddressType   =   NDIS_PROTOCOL_ID_TCP_IP;   // TCP/IP
      GenericFilter.PatternSize   =   sizeof(IP_PATTERN);   
      GenericFilter.Pattern   =   &Pattern;   //   pattern   to   match,   defined   below  
      GenericFilter.Mask   =   &Mask;   

      //  过滤器模式  
   // 根据源、目标ip和端口,我们可以过滤到一个特定的连接。
   // 如果是过滤一个网段,需要用到Mask参数。
      Pattern.Reserved1   =   0;   
      Pattern.Reserved2   =   0;   
      Pattern.SrcAddr   =   inet_addr( pzSrcIp );  // 源IP
      Pattern.DstAddr   =   inet_addr( pzDstIp );  // 目标IP
      Pattern.tcSrcPort   = htons( nSrcPort );      // 源端口
      Pattern.tcDstPort   = htons( nDstPort );      // 目标端口
      Pattern.ProtocolId   =   nProtocol;         // 协议类型。TCP or UDP or else
      Pattern.Reserved3[0]   =   0;
      Pattern.Reserved3[1]   =   0;
      Pattern.Reserved3[2]   =   0;

      // 掩码。设置Pattern中哪些位是有效的,也就是IP地址中的掩码
   // 如要限制212.73.0.0这个网段与本地之间的流量,掩码设置为255.255.0.0
      Mask.Reserved1   =   0;
      Mask.Reserved2   =   0;
      Mask.SrcAddr   =   htonl( 0xFFFFFFFF );
      Mask.DstAddr   =   htonl(0xFFFFFFFF);
      Mask.tcSrcPort   = htons( 0xFFFF );
      Mask.tcDstPort   = htons( 0xFFFF );
      Mask.ProtocolId   =   nProtocol;
      Mask.Reserved3[0]   =   0;
      Mask.Reserved3[1]   =   0;
      result   =   TcAddFilter(flowHandle,   &GenericFilter,   &FilterHandle);
      if( NO_ERROR != result )
      {
             //cout << "TcAddFilter error:" << result << endl;
             return result;
      }
      
      return result;
}


四、示例代码
是一个基于对话框的MFC工程,在Winxp + VC6 + Windows Server 2003 SP1 Platform SDK下编译、运行通过,其他平台未测试。
编译的时候需要安装Windows Platform SDK,我安装的是Windows Server 2003 SP1 Platform SDK。

五、附件

附件1                Htm          
附件2        Rar                  
附件3                Txt          
附件4        rar                 

六、结束语
以上内容是关于Windows系统中限制网络流量的方法的简单描述,并提供了完整的演示工程代码。
相关概念和函数的描述并不是很详细,不过大部分都可以从MSDN中找到。
实际运行效果以文档中提供的演示工程为准。

如有错误,欢迎指正。


----------------------完毕-------------
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-20 04:00 , Processed in 0.085870 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表