LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 550|回复: 1

求助[急]

[复制链接]
发表于 2006-5-25 19:40:46 | 显示全部楼层 |阅读模式
#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;
}
以上是我写的程序,谁能帮我改一下,谢谢了
 楼主| 发表于 2006-5-25 19:47:31 | 显示全部楼层
愿意帮忙的加我qq276894732
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表