各位大侠:
小弟有一个问题最近一直没有搞明白,就是我使用微软的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;
}
小弟有一个问题最近一直没有搞明白,就是我使用微软的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;
}
解决方案 »
- vc++ 向SQL中写入数据时异常
- 关于Kodak空间显示图片
- 根据url,怎么获取xml?
- 1如何在一个项目中引入两个.lib文件,并且release.2project->settings->link->object/library modules中可否多个.lib文件,如何写?
- Windows托盘区编程的经验汇总-最小化,响应,退出处理
- 如何使用MFC定制word模板
- 用了ActiveSkin换了皮肤的程序,怎样才能在没有安装过该软件的系统上运行?
- 一个模态对话框和非模态对话框的问题。
- 哪位高手有在局域网内查看某台机器屏幕的原代码,要是有电子教室的原代码就更好了。
- 使用treecontrol的问题,怎么判定了选中那个节点
- FAT长文件名校验和问题
- 问ATL中用socket通信的问题
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的参数该怎么配置??希望懂的能不吝赐教