网上基本都是这个了。呵呵。
重要的是接口的调用顺序和规则基本是一样的,关键的是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;
}