|
|
#include <stdlib.h>
#include "afxmt.h"
#include <iostream>
int MaxLength[100];
int max[100];
int min[100];
double maxp[100];
#define RAND_MAX 0x7fff
using namespace std;
int Test(int number,int PacketLength);
int RED(int number);
void Discard(char *packet);
double AverageRandom(double min,double max);
void QueueManage(char *packet,int PacketLength,int number);
struct Cdata
{
char *ptrpacket;
int length;
};
class Cnode
{
public:
Cdata *pack;
Cnode *next;
public:
Cnode(Cdata *pData);
~Cnode();
};
Cnode::Cnode(Cdata *pData){
this->pack=pData;
this->next=NULL;
};
Cnode::~Cnode(){
this->pack=NULL;
delete this->pack;
this->next=NULL;
delete this->next;
};
class Clist
{
private:
CSemaphore* ptrSemaphore;
public:
Cnode* Head;
Cnode* Tail;
int QueueLength;
public:
void AddNodeEnd(char *packet,int PacketLength);
void DelNodeSta();
Clist ();
~ Clist ();
};
Clist:: Clist ()
{
Head=Tail=NULL;
ptrSemaphore=new CSemaphore(1,1);
QueueLength=0;
};
Clist::~ Clist ()
{
Head=Tail=NULL;
delete ptrSemaphore;
delete Head;
delete Tail;
QueueLength=0;
};
void Clist::AddNodeEnd(char *packet,int PacketLength)
{
//将收到的数据包指针和队列长度构成节点插在数组元素Tail[number]后
//用信号量进行互斥操作
CSingleLock SingleLock(ptrSemaphore);
SingleLock.Lock();
if (Head==NULL && Tail==NULL)
{
Cdata *p=new Cdata;
p->ptrpacket=packet;
p->length=PacketLength;
// init data
Cnode *pNode ;
pNode=new Cnode(p);
Tail=pNode;
Head=pNode;
QueueLength=QueueLength+pNode->pack->length;
}
else
{
Cdata *p = new Cdata;
p->ptrpacket=packet;
p->length=PacketLength;
// init data
Cnode *pNode ;
pNode=new Cnode(p);
Tail->next=pNode;
Tail=pNode;
//改变当前队列长度数组ListArray[number]->QueueLength的值
QueueLength=QueueLength+pNode->pack->length;
};
SingleLock.Unlock();
};
void Clist:: DelNodeSta()
{
//删除number所指向队列中的头节点
Cnode *x;
CSingleLock SingleLock(ptrSemaphore);
SingleLock.Lock();
x=Head;
Head=x->next;
if (Head==NULL)
{
Tail=NULL;
};
x->next=NULL;
QueueLength= QueueLength-x->pack->length;
delete x;
SingleLock.Unlock();
};
Clist *ListArray=new Clist[100];
void QueueManage(char *packet,int PacketLength,int number)
{
//本模块的主程序,由收发模块调用
//调用Test函数
//若Test返回值为真,调用RED算法函数,若返回真(1)则调用AddNodeEnd函数,返回假(0)则调用Discard
函数
if (Test(number,PacketLength)==1)
{
if (RED(number)==1)
{
ListArray[number].AddNodeEnd(packet,PacketLength);
}
else Discard(packet);
}
//若Test返回值为假,则调用Discard函数
else Discard(packet);
};
int Test(int number,int PacketLength)
{
//由输入的队列号number获取最大的队列长度MaxLength
//若当前队列长度加上本次收到的包的长度即(ListArray[number]->QueueLength+PacketLength)大于最
大队列长度(MaxLength),则返回假
if ((ListArray[number].QueueLength+PacketLength)>MaxLength[number])
{
return 0;
}
//否则返回真
else return 1;
};
void Discard(char *packet)
{
//释放数据包的指针
delete packet;
};
int RED(int number)
{
double s,p;
//将当前队列长度ListArray[number]->QueueLength与max和min进行比较,若〉max则调用Discard函数,
若<则调用AddNodeEnd函数
if ((ListArray[number].QueueLength)>=(max[number]))
{return 0;}
if ((ListArray[number].QueueLength)<=(min[number])) {return 1;}
//若min[number]< ListArray[number]->QueueLength <max[number],则以概率p进行存储
if ((min[number]< ListArray[number].QueueLength) && (ListArray
[number].QueueLength<max[number]))
{
p=maxp[number]*(ListArray[number].QueueLength-min[number])/(max[number]-min
[number]);
//生成(0,1)之间的随机数s
s= AverageRandom(0,1);
if (s>=p)
{return 0;}
else return 1;
}
//TODO::
return 0;
};
double AverageRandom(double min,double max)
{
int minInteger=(int)(min*10000);
int maxInteger=(int)(max*10000);
int randInteger=rand()*rand();
int diffInteger=maxInteger-minInteger;
int resultInteger=randInteger%diffInteger+minInteger;
return resultInteger/10000.0;
};
void PacketSwitching(int number)
{
ListArray[number].DelNodeSta();
}
void main(){
char *p=new char[255];
strcpy(p,"abc123");
char *q=new char[255];
strcpy(q,"abc");
ListArray[50].QueueLength=80;
min[50]=20;
max[50]=70;
maxp[50]=0.9;
MaxLength[50]=200;
QueueManage(q,10,50);
QueueManage(p,10,50);
cout<<ListArray[50].QueueLength<<endl;
if( ListArray[50].Head )
cout<<ListArray[50].Head->pack->ptrpacket<<endl;
}
以上是我写的程序,谁能帮我改一下,谢谢了 |
|