现在的位置: 首页 > 综合 > 正文

Qos 接口编程使用 网络带宽(流量)控制 例子

2012年11月27日 ⁄ 综合 ⁄ 共 6815字 ⁄ 字号 评论关闭

网上基本都是这个了。呵呵。

重要的是接口的调用顺序和规则基本是一样的,关键的是FlOWSPEC结构的设置,这个可以参照MSDN上面对该结构的说明来进行设置。注意,流量TokenRate不可以为0.至于你自己应用的需要,那就自己适当的修改代码和增删接口吧。

 

环境配置的时候,如果是VC6.0似乎好几个头文件和traffic.lib都没有,不过到vs2003,vs2005,vs2008这些环境下就有了,在C盘搜索一下就有了。

 

#include   "stdafx.h "
#include   <winsock2.h>
#include   <ws2tcpip.h>
#include   <qos.h>
#include   <ntddndis.h>
#include   <traffic.h>
#include   <Qossp.h>
#include   <tcerror.h>  
#include <STDIO.H>
#pragma   comment(lib, "ws2_32.lib ")
#pragma   comment(lib, "Traffic.lib ")

void   MyClNotifyHandler(   HANDLE   ClRegCtx,HANDLE   ClIfcCtx,ULONG   Event,HANDLE   SubCode,ULONG   BufSize,PVOID   Buffer   )  
{  
}  

int   _tmain(int   argc,   _TCHAR*   argv[])
{
DWORD   destPort;  
PCHAR   destAddress;  
destAddress= "172.18.62.34 ";   //IP_ADDRESS;  
destPort   =   0x50;//5000;  
int   err;  
WSADATA   WSAData;  
err   =   WSAStartup(MAKEWORD(2,2),   &WSAData);  
if   (err)   {  
printf( "WSAStartup   Failed   (%d)   Exiting  ",   err);  
exit(err);  
}  
HANDLE   ClientHandle;  
HANDLE   ifcHandle;  
HANDLE   flowHandle;  
HANDLE   FilterHandle;
TCI_CLIENT_FUNC_LIST   QoSFunctions;  
QoSFunctions.ClAddFlowCompleteHandler   =   NULL;  
QoSFunctions.ClDeleteFlowCompleteHandler   =   NULL;
QoSFunctions.ClModifyFlowCompleteHandler   =   NULL;  
QoSFunctions.ClNotifyHandler   =   (TCI_NOTIFY_HANDLER)MyClNotifyHandler;  
long   result   =   TcRegisterClient(CURRENT_TCI_VERSION,   NULL,   &QoSFunctions   ,   &ClientHandle);  
if   (result   ==   NO_ERROR)   {  
printf( "no   error   TcRegisterClient.  ");
TC_IFC_DESCRIPTOR   InterfaceBuffer[40];  
PTC_IFC_DESCRIPTOR   pInterfaceBuffer   =   &InterfaceBuffer[0];  
ULONG   BufferSize   =   40*   sizeof(TC_IFC_DESCRIPTOR);  
result   =   TcEnumerateInterfaces(ClientHandle,   &BufferSize,   pInterfaceBuffer);  
if   (result   ==   NO_ERROR)   {  
printf( "no   error   TcEnumerateInterfaces     "   );  
if   (BufferSize   ==   0)   {  
printf( "no   traffic   control   interfaces   are   available  ");  
}  
TCHAR   interfaceName[500];  
WideCharToMultiByte(CP_ACP,0,InterfaceBuffer[0].pInterfaceName,   -1,(LPSTR)interfaceName,   sizeof(interfaceName),   0,   0   );
result   =   TcOpenInterface(   interfaceName,   ClientHandle,   NULL,   &ifcHandle   );  
if(   result   ==   NO_ERROR   )   {  
printf( "no   error   OpenInterfaces.  ");
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;  
newFlow-> ReceivingFlowspec.DelayVariation   =   QOS_NOT_SPECIFIED;
newFlow-> ReceivingFlowspec.Latency   =   QOS_NOT_SPECIFIED;
newFlow-> ReceivingFlowspec.MaxSduSize   =   QOS_NOT_SPECIFIED;
newFlow-> ReceivingFlowspec.MinimumPolicedSize   =   QOS_NOT_SPECIFIED;
newFlow-> ReceivingFlowspec.PeakBandwidth   =   QOS_NOT_SPECIFIED;
newFlow-> ReceivingFlowspec.ServiceType   =QOS_NOT_SPECIFIED;
newFlow-> ReceivingFlowspec.TokenBucketSize   =   QOS_NOT_SPECIFIED;
newFlow-> ReceivingFlowspec.TokenRate   =   QOS_NOT_SPECIFIED;
newFlow-> SendingFlowspec.DelayVariation   =   QOS_NOT_SPECIFIED;
newFlow-> SendingFlowspec.Latency   =   QOS_NOT_SPECIFIED;
newFlow-> SendingFlowspec.MaxSduSize   =   QOS_NOT_SPECIFIED;
newFlow-> SendingFlowspec.MinimumPolicedSize   =   QOS_NOT_SPECIFIED;
newFlow-> SendingFlowspec.PeakBandwidth   =   QOS_NOT_SPECIFIED;
newFlow-> SendingFlowspec.ServiceType   =SERVICETYPE_BESTEFFORT;
newFlow-> SendingFlowspec.TokenBucketSize   =   QOS_NOT_SPECIFIED;
newFlow-> SendingFlowspec.TokenRate   =   QOS_NOT_SPECIFIED;  
newFlow-> TcObjectsLength   =   sizeof(QOS_DS_CLASS)   +   sizeof(QOS_TRAFFIC_CLASS)   +   sizeof(QOS_OBJECT_HDR);  
[CHAIRAT   Youssef   -   EXT]  
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);
int   retCode   =   TcAddFlow(   ifcHandle,   /*ClientHandle*/NULL,   0,   newFlow,   &flowHandle   );  
if(retCode   ==   NO_ERROR)   {  
printf( "no   err or   TcAddFlow  ");
}  
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;  
GenericFilter.PatternSize   =   sizeof(IP_PATTERN);  
GenericFilter.Pattern   =   &Pattern;   //   pattern   to   match,   defined   below  
GenericFilter.Mask   =   &Mask;  
//   Filter   pattern.  
Pattern.Reserved1   =   0;  
Pattern.Reserved2   =   0;  
Pattern.SrcAddr   =   0;//inet_addr( "172.18.100.38 ");
Pattern.DstAddr   =   0;//inet_addr(destAddress);  
Pattern.tcSrcPort   =   0;//htons(0);
Pattern.tcDstPort   =   htons(0x50);//destPort;
Pattern.ProtocolId   =   0;//IPPROTO_UDP;  
Pattern.Reserved3[0]   =   0;  
Pattern.Reserved3[1]   =   0;
Pattern.Reserved3[2]   =   0;  
//   Patterns   mask  
Mask.Reserved1   =   0;  
Mask.Reserved2   =   0;  
Mask.SrcAddr   =   0;//htonl(0xFFFFFFFF);  
Mask.DstAddr   =   0;//htonl(0xFFFFFFFF);  
Mask.tcSrcPort   =   0;//htons(0);//0xFFFF;
Mask.tcDstPort   =   htons(0xFFFF);  
Mask.ProtocolId   =   0xFF;  
Mask.Reserved3[0]   =   0;
Mask.Reserved3[1]   =   0;  
retCode   =   TcAddFilter(flowHandle,   &GenericFilter,   &FilterHandle);  
if(retCode   ==   NO_ERROR)   {  
printf( "no   error   TcAddFilter.  ");  
}  
//   UDP   MULTICAST
SOCKET   hSocket   =   socket(AF_INET,SOCK_DGRAM,0);
if   (hSocket   ==   INVALID_SOCKET)   {  
err   =   GetLastError();  
printf( " "Socket "   failed   with   error   %d  ",   err);  
return   1;  
}  
SOCKADDR   add;
SOCKADDR_IN   addr_dest;
addr_dest.sin_family   =   AF_INET;
addr_dest.sin_addr.s_addr   =   inet_addr(GROUP_ADDR);
addr_dest.sin_port   =   htons(0x50);
IN_ADDR   interfaceAddr;
interfaceAddr.S_un.S_un_b.s_b1   =   204;
interfaceAddr.S_un.S_un_b.s_b2   =  1;
interfaceAddr.S_un.S_un_b.s_b3   =   1;
interfaceAddr.S_un.S_un_b.s_b4   =   148;
unsigned   char   ttl   =   1;
setsockopt(hSocket   ,   IPPROTO_IP,   IP_MULTICAST_TTL,   (char   *)&ttl,   sizeof(ttl));
setsockopt(hSocket,IPPROTO_IP,IP_MULTICAST_IF,(const   char   *)&interfaceAddr,   sizeof(interfaceAddr));
sendto(   hSocket,   "TEST   QOS   Milticast ",   20   ,   0,   (sockaddr*)&addr_dest,sizeof(SOCKADDR_IN));
result   =   TcDeleteFilter(FilterHandle);  
if   (result   ==   NO_ERROR)   {  
printf( "no   error   TcDeleteFilter  ");
}
result   =   TcDeleteFlow(flowHandle);  
if   (result   ==   NO_ERROR)   {  
printf( "no   error   TcCloseInterface  ");
}  
result   =   TcDeregisterClient(ClientHandle);  
if   (result   ==   NO_ERROR)   {  
printf( "no   error   TcDeregisterClient  ");  
}
shutdown(hSocket,   SD_BOTH);  
closesocket(hSocket);  
WSACleanup();  
return   0;  
}
}
}
return   0;
}

抱歉!评论已关闭.