📄 bt.cpp
字号:
#include <stdlib.h>
#include "BT.h"
#include "BTTracker.h"
#include "BTPeer.h"
#include "BTTorrent.h"
#include "BTEvent.h"
#include "SimEventScheduler.h"
#include "Sysparameter.h"
#include "Topology.h"
#include "NodeProperty.h"
#include "Debug.h"
#include "Cache.h"
void BT::confAgent(void){
int nodeid = -1;
setAgentNum(AGENT_NUM);
//config tracker
BTTracker* tracker = new BTTracker();
mTracker = tracker;
setAgent(tracker, 0);
nodeid = pick();
tracker->attachTo( mTopology->getNode(nodeid));
DEBUG(BTDEBUGLEVEL)
printf( "tracker attatch to node %d\n", nodeid);
BTPeer* peer = NULL;
//config esp
peer = new BTPeer(superseed);
peer->setMaxOutBandwidth(ESP_OUT_BANDWIDTH);
mEspList.push_back(peer);
setAgent(peer, 1);
nodeid = pick();
peer->attachTo( mTopology->getNode( nodeid) );
DEBUG(BTDEBUGLEVEL)
printf("espserver attach to node %d\n", nodeid);
peer->setStateWork();
//config normal peer
for( unsigned int i = 2; i < mAgentNum; i ++){
peer = new BTPeer(normal);
float rate = (float)rand()/(float)RAND_MAX;
float downbandwidth = 0.0;
if( rate < 0.4)
downbandwidth = 50.0 + (float)rate/(float)0.4*50.0;
else if( rate >= 0.4){
if( rate < 0.7 )
downbandwidth =5+ (float)(rate-0.4)/(float)0.3*50.0;
else{
if( rate < 0.9)
downbandwidth = 100+ (float)(rate - 0.7)/(float)0.2*100.0;
else
downbandwidth = 200 + (float)(rate - 0.9)/(float)0.1*1000.0;
}
}
// peer->setMaxInBandwidth( MAX_IN_BANDWIDTH_PER_NODE);
// peer->setMaxOutBandwidth(MAX_OUT_BANDWIDTH_PER_NODE);
peer->setMaxInBandwidth( (unsigned long )downbandwidth*1024*2 );
peer->setMaxOutBandwidth( ( unsigned long )downbandwidth*1024);
setAgent(peer, i);
nodeid = pick();
peer->attachTo( mTopology->getNode( nodeid) );
DEBUG(BTDEBUGLEVEL)
printf("new btpeer %d attach to node %d downbandwidth%ld upbandwidht %ld\n", i, nodeid, peer->getInBandwidth(), peer->getOutBandwidth());
}
};
void BT::confDocument( void ){
BTPeer* peer = (BTPeer*)getAgent(1);
BTTracker* tracker = mTracker;
char buf[10] = {0};
for( unsigned int i = 0; i< FILE_NUM; i++){
sprintf(buf, "%d", i);
BTDocument* doc = new BTDocument( buf, FILE_SIZE);
doc->setWhole();
BTTorrent* tor = new BTTorrent(doc, tracker);
tracker->addTorrent(tor);
peer->ownDocument( doc);
tracker->addNodeAssociateWithDoc(tor->mKey, peer);
}
};
void BT::confEvents(void){
double t =0;
unsigned int i = 0, j = 0;
for( i = 2; i< mAgentNum;){
BTPeer* peer = (BTPeer*)getAgent(i);
int* serverId = new int(0);
BTEvent* event = new BTEvent( RANDOM_DOWNLOAD_FILE , t, peer, serverId);
Scheduler.enqueue(event);
if( ARRIVE_NUM <= 1){
i++;
t += ARRIVE_INTERVAL;
continue;
}
for( j = 1; j< ARRIVE_NUM; j++){
BTPeer* peer = (BTPeer*)getAgent(i +j);
int* serverId = new int(0);
BTEvent* event = new BTEvent( RANDOM_DOWNLOAD_FILE , t, peer, serverId);
Scheduler.enqueue(event);
}
t += ARRIVE_INTERVAL;
i = i+j;
}
};
int BT::pick( void){
int i = -1;
Node* node = NULL;
while(1){
i = (int)( mTopology->getNodeNumber() * ((float)rand()/(float)RAND_MAX) );
node = mTopology->getNode( i );
if( node->getType() == TRANSIT || node->getAgentList().size() > 0 )
continue;
break;
}
return i;
};
void BT::printEspInfo(void){
list<BTPeer*>::iterator aIt = mEspList.begin();
BTPeer* peer = NULL;
while( aIt != mEspList.end()){
peer = *(aIt++);
peer->mCache->printCache();
peer->mCache->printCacheTotolInfo();
// peer->printDownloadInfo();
}
}
float BT::getEspOutput(void){
Topology* topology = Topology::getInstance();
float mount = mEspList.front()->getOutBandwidth() - topology->getAvailableBandwidth(false, mEspList.front() );
return mount;
};
unsigned int BT::getEspFileCon( string filename ){
return mEspList.front()->getSessionActConNum( filename );
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -