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

📄 vlink.cpp

📁 模拟P2P各种网络环境的,适合新手们的学习,不错的源码.
💻 CPP
字号:
#include "VLink.h"
#include "VConnection.h"

VLink::VLink(Agent *agent, Node *node)
{
	if(!agent || !node) {
		cout << "error: null pointer" << endl;
		exit(-1);
	}
	mAgent = agent;
	mNode = node;
}

void VLink::reset()
{
	mAvailableBandwidthIn = mBandwidthIn;
	mAvailableBandwidthOut = mBandwidthOut;
	mActiveConnectionIn.clear();
	mActiveConnectionOut.clear();
	mInactiveConnectionIn.clear();
	mInactiveConnectionOut.clear();
}

void VLink::addConnection(bool flag, VConnection *pc)
{
	if(flag)
		mInactiveConnectionIn.insert(pc);
	else
		mInactiveConnectionOut.insert(pc);
}

void VLink::removeConnection(bool flag, VConnection *pc)
{
	if(flag)
		mInactiveConnectionIn.erase(pc);
	else
		mInactiveConnectionOut.erase(pc);
}

void VLink::activateConnection(bool flag, VConnection *pc)
{
	if(flag) {
		mInactiveConnectionIn.erase(pc);
		mActiveConnectionIn.insert(pc);
		mAvailableBandwidthIn -= pc->getBandwidth();
		if(mAvailableBandwidthIn < 0) {
			cout << "error: negative available bandwidth" << endl;
			exit(-1);
		}
	}
	else {
		mInactiveConnectionOut.erase(pc);
		mActiveConnectionOut.insert(pc);
		mAvailableBandwidthOut -= pc->getBandwidth();
		if(mAvailableBandwidthOut < 0) {
			cout << "error: negative available bandwidth" << endl;
			exit(-1);
		}
	}
}

void VLink::inactivateConnection(bool flag, VConnection *pc)
{
	if(flag) {
		mActiveConnectionIn.erase(pc);
		mInactiveConnectionIn.insert(pc);
		mAvailableBandwidthIn += pc->getBandwidth();
		if(mAvailableBandwidthIn > mBandwidthIn) {
			cout << "error: greater available bandwidth" << endl;
			exit(-1);
		}
	}
	else {
		mActiveConnectionOut.erase(pc);
		mInactiveConnectionOut.insert(pc);
		mAvailableBandwidthOut += pc->getBandwidth();
		if(mAvailableBandwidthOut > mBandwidthOut) {
			cout << "error: greater available bandwidth" << endl;
			exit(-1);
		}
	}
}

void VLink::adjustUp(bool flag, VConnection *pc, unsigned long value)
{
	if(flag) {
		if(mActiveConnectionIn.find(pc) == mActiveConnectionIn.end())
			exit(-1);
		mAvailableBandwidthIn -= value;
		if(mAvailableBandwidthIn < 0) {
			cout << "error: negative bandwidth" << endl;
			exit(-1);
		}
	}
	else {
		if(mActiveConnectionOut.find(pc) == mActiveConnectionOut.end())
			exit(-1);
		mAvailableBandwidthOut -= value;
		if(mAvailableBandwidthOut < 0) {
			cout << "error: negative bandwidth" << endl;
			exit(-1);
		}
	}
}

void VLink::adjustDown(bool flag, VConnection *pc, unsigned long value)
{
	if(flag) {
		if(mActiveConnectionIn.find(pc) == mActiveConnectionIn.end())
			exit(-1);
		mAvailableBandwidthIn += value;
		if(mAvailableBandwidthIn > mBandwidthIn) {
			cout << "error: greater available bandwidth" << endl;
			exit(-1);
		}
	}
	else {
		if(mActiveConnectionOut.find(pc) == mActiveConnectionOut.end())
			exit(-1);
		mAvailableBandwidthOut += value;
		if(mAvailableBandwidthOut > mBandwidthOut) {
			cout << "error: greater available bandwidth" << endl;
			exit(-1);
		}
	}
}

void VLink::reallocate()
{
	if(!mActiveConnectionIn.empty()) {
		unsigned long average = mBandwidthIn / mActiveConnectionIn.size();
		set<VConnection *> leftConnection = mActiveConnectionIn;
		while(mAvailableBandwidthIn > 0 && !leftConnection.empty())
		{
			unsigned long min = UINT_MAX;
			VConnection *pc = NULL;
			set<VConnection *>::iterator it;
		
			for(it = leftConnection.begin(); it != leftConnection.end(); it++)
			{
				unsigned long temp = (**it).getBandwidth();
				if(min > temp) {
					min = temp;
					pc = *it;
				}
			}
		
			if(!pc) {
				cout << "error: impossible" << endl;
				exit(-1);
			}
		
			if(min < average)
				pc->adjustBandwidth(average - min);
			else
				pc->adjustBandwidth(mAvailableBandwidthIn);
		
			if(mAvailableBandwidthIn < 0) {
				cout << "error: the available bandwidth is less than 0" << endl;
				exit(-1);
			}
		
			leftConnection.erase(pc);
		}
	}
	else if(!mActiveConnectionOut.empty()){
		unsigned long average = mBandwidthOut / mActiveConnectionOut.size();
		set<VConnection *> leftConnection = mActiveConnectionOut;
		while(mAvailableBandwidthOut > 0 && !leftConnection.empty())
		{
			unsigned long min = UINT_MAX;
			VConnection *pc = NULL;
			set<VConnection *>::iterator it;
		
			for(it = leftConnection.begin(); it != leftConnection.end(); it++)
			{
				unsigned long temp = (**it).getBandwidth();
				if(min > temp) {
					min = temp;
					pc = *it;
				}
			}
		
			if(!pc) {
				cout << "error: impossible" << endl;
				exit(-1);
			}
		
			if(min < average)
				pc->adjustBandwidth(average - min);
			else
				pc->adjustBandwidth(mAvailableBandwidthOut);
		
			if(mAvailableBandwidthOut < 0) {
				cout << "error: the available bandwidth is less than 0" << endl;
				exit(-1);
			}
			
			leftConnection.erase(pc);
		}
	}
}

VConnection *VLink::getMaxConnection(bool flag)
{
	unsigned long max = 0;
	VConnection *pc = NULL;
	set<VConnection *>::iterator it;
	if(flag) {
		for(it = mActiveConnectionIn.begin(); it != mActiveConnectionIn.end(); it++)
			if(max < (*it)->getBandwidth()) {
				max = (*it)->getBandwidth();
				pc = *it;
			}
	}
	else
		for(it = mActiveConnectionOut.begin(); it != mActiveConnectionOut.end(); it++)
			if(max < (*it)->getBandwidth()) {
				max = (*it)->getBandwidth();
				pc = *it;
			}
	return pc;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -