⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bt.cpp

📁 模拟P2P各种网络环境的,适合新手们的学习,不错的源码.
💻 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 + -