各位大侠:
  小弟有一个问题最近一直没有搞明白,就是我使用微软的TC API 编写一个DSCP的标记程序,该程序运行在路由器上面,可以实现为通过路由器的数据包做标记的工作
数据包的过滤规则为ip数据头的5元组决定,即源,目的地址,源目的端口号 ,协议类型;
  然而我发现我的这个程序可以标记从本机发出去的数据包,但是对于路由器转发的数据包,比如说从另外机器A发到路由器,由路由器转发到机器B的数据包,当然我们
在路由器上的过滤规则定义为机器A,B的ip地址和端口号,和他们使用的协议,这看起来很清楚,我也想肯定能够标记上,但是为什么从我测试到的数据包来看,这些数据包
都没有得到标记.
不知那位大侠能够帮忙解决一下 ,小弟不胜感谢!
  // anothertc.cpp : Defines the entry point for the console application.
//#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= "192.168.1.35";   //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];   
        PTC_IFC_DESCRIPTOR  pCurrentIfc;
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  ");   
}   
pCurrentIfc=pInterfaceBuffer;
TCHAR   interfaceName[500];   
// WideCharToMultiByte(CP_ACP,0,InterfaceBuffer[0].pInterfaceName,   -1,(LPSTR)interfaceName,   sizeof(interfaceName),   0,   0   ); 
result   =   TcOpenInterface(   pCurrentIfc->pInterfaceName,   ClientHandle,   (HANDLE)1,   &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);    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   error   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   =  inet_addr( "192.168.0.36"); 
Pattern.DstAddr   =  inet_addr(destAddress);   
Pattern.tcSrcPort   =   0;//htons(0); 
Pattern.tcDstPort   =   0;//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   =  htonl(0xFFFFFFFF);   
Mask.DstAddr   =  htonl(0xFFFFFFFF);   
Mask.tcSrcPort   =   0;//htons(0);//0xFFFF; 
Mask.tcDstPort   =   0;   
Mask.ProtocolId   =   0;   
Mask.Reserved3[0]   =   0; 
Mask.Reserved3[1]   =   0;   
retCode   =   TcAddFilter(flowHandle,   &GenericFilter,   &FilterHandle);   
if(retCode   ==   NO_ERROR)   {   
printf( "no   error   TcAddFilter.  ");   
}   
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  ");   
}    
WSACleanup();   
return   0;   



return   0; 

解决方案 »

  1.   

    唉 我也在做这个 最近遇到个问题 就是在设置
    typedef struct _flowspec {  
    ULONG TokenRate;  
    ULONG TokenBucketSize;  
    ULONG PeakBandwidth;  
    ULONG Latency;  
    ULONG DelayVariation; 
    SERVICETYPE ServiceType;
    ULONG MaxSduSize;  
    ULONG MinimumPolicedSize;
    } FLOWSPEC,  *PFLOWSPEC,  *LPFLOWSPEC;
    这个flow结构体参数时该怎么设置才能将带宽限定在特定的值 比如说:我现在想将p2p下载的带宽限制在100K以内 那此时这个flow的参数该怎么配置??希望懂的能不吝赐教
      

  2.   

    我在做毕设,也碰到FLOWSPEC的设置问题,有熟悉的请迅速赐教。不过百度这个结构可以看到msdn上面的文档,因为全部是英文的,现在还未全部理解,看懂这个文档应该可以知道怎么设置了吧?