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

📄 channel.cpp

📁 这是和p2p相关的一份源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		rhost[0].toStr(buf);
	else if (var == "rhost1")
		rhost[1].toStr(buf);
	else if (var == "numHops")
		sprintf(buf,"%d",numHops);
	else if (var == "numListeners")
		sprintf(buf,"%d",numListeners);
	else if (var == "numRelays")
		sprintf(buf,"%d",numRelays);
	else if (var == "uptime")
	{
		String timeStr;
		timeStr.setFromStopwatch(upTime);
		strcpy(buf,timeStr.cstr());
	}else if (var == "update")
	{
		String timeStr;
		if (timeStr)
			timeStr.setFromStopwatch(sys->getTime()-time);
		else
			timeStr.set("-");
		strcpy(buf,timeStr.cstr());
	}else if (var == "isFirewalled")
		sprintf(buf,"%d",firewalled?1:0);
	else if (var == "agent")
		strcpy(buf,agentStr);
	else
		return false;

	out.writeString(buf);
	return true;
}

// -----------------------------------
int ChanHitList::getTotalListeners()
{
	int cnt=0;
	for(int i=0; i<MAX_HITS; i++)
		if (hits[i].host.ip)
			cnt+=hits[i].numListeners;
	return cnt;
}
// -----------------------------------
int ChanHitList::getTotalRelays()
{
	int cnt=0;
	for(int i=0; i<MAX_HITS; i++)
		if (hits[i].host.ip)
			cnt+=hits[i].numRelays;
	return cnt;
}
// -----------------------------------
int ChanHitList::getTotalFirewalled()
{
	int cnt=0;
	for(int i=0; i<MAX_HITS; i++)
		if (hits[i].host.ip)
			if (hits[i].firewalled)
				cnt++;
	return cnt;
}

// -----------------------------------
int ChanHitList::contactTrackers(bool connected, int numl, int nums, int uptm)
{
	return 0;
}
// -----------------------------------ChanHit *ChanHitList::addHit(ChanHit &h){	int i;

	char ip0str[64],ip1str[64];
	h.rhost[0].toStr(ip0str);
	h.rhost[1].toStr(ip1str);
	LOG_DEBUG("Add hit: %s/%s",ip0str,ip1str);

	// dont add our own hits
	if (servMgr->sessionID.isSame(h.sessionID))
		return NULL;

	lastHitTime = sys->getTime();	h.time = lastHitTime;	for(i=0; i<MAX_HITS; i++)
	{
		ChanHit &ch = hits[i];
		if ((ch.rhost[0].ip == h.rhost[0].ip) && (ch.rhost[0].port == h.rhost[0].port))			if (((ch.rhost[1].ip == h.rhost[1].ip) && (ch.rhost[1].port == h.rhost[1].port)) || (!ch.rhost[1].isValid()))
			{				if (!hits[i].dead)
					hits[i] = h;				return &hits[i];			}
	}
	// clear hits with same session ID (IP may have changed)
	if (h.sessionID.isSet())
	{
		for(i=0; i<MAX_HITS; i++)
		{
			ChanHit &ch = hits[i];
			if (ch.host.ip)
				if (ch.sessionID.isSame(h.sessionID))
					ch.init();
		}
	}


	for(i=0; i<MAX_HITS; i++)		if (hits[i].host.ip == 0)		{
			hits[i] = h;
			hits[i].chanID = info.id;
			return &hits[i];		}	return NULL;}// -----------------------------------int	ChanHitList::clearDeadHits(unsigned int timeout, bool clearTrackers){	int cnt=0;	unsigned int ctime = sys->getTime();	for(int i=0; i<MAX_HITS; i++)		if (hits[i].host.ip)		{
			if (hits[i].dead || ((ctime-hits[i].time) > timeout) && (clearTrackers || (!clearTrackers & !hits[i].tracker)))
				hits[i].init();
			else
				cnt++;		}	return cnt;}// -----------------------------------void	ChanHitList::deadHit(ChanHit &h){	char ip0str[64],ip1str[64];
	h.rhost[0].toStr(ip0str);
	h.rhost[1].toStr(ip1str);
	LOG_DEBUG("Dead hit: %s/%s",ip0str,ip1str);

	for(int i=0; i<MAX_HITS; i++)
		if (hits[i].host.ip)			if (hits[i].rhost[0].isSame(h.rhost[0]) && hits[i].rhost[1].isSame(h.rhost[1]))
			{
				hits[i].dead = true;
			}}// -----------------------------------
void	ChanHitList::delHit(ChanHit &h)
{
	char ip0str[64],ip1str[64];
	h.rhost[0].toStr(ip0str);
	h.rhost[1].toStr(ip1str);
	LOG_DEBUG("Del hit: %s/%s",ip0str,ip1str);

	for(int i=0; i<MAX_HITS; i++)
		if (hits[i].host.ip)
			if (hits[i].rhost[0].isSame(h.rhost[0]) && hits[i].rhost[1].isSame(h.rhost[1]))
			{
				hits[i].init();
			}
}
// -----------------------------------int	ChanHitList::numHits(){	int cnt=0;	for(int i=0; i<MAX_HITS; i++)		if (hits[i].host.ip && !hits[i].dead)
			cnt++;	return cnt;}
// -----------------------------------int	ChanHitList::numListeners(){	int cnt=0;	for(int i=0; i<MAX_HITS; i++)		if (hits[i].host.ip && !hits[i].dead)			cnt += hits[i].numListeners;	return cnt;}// -----------------------------------
int	ChanHitList::numTrackers()
{
	int cnt=0;
	for(int i=0; i<MAX_HITS; i++)
		if ((hits[i].host.ip && !hits[i].dead) && (hits[i].tracker))
			cnt++;

	return cnt;
}
// -----------------------------------int	ChanHitList::numFirewalled(){	int cnt=0;	for(int i=0; i<MAX_HITS; i++)		if (hits[i].host.ip && !hits[i].dead)
			cnt += hits[i].firewalled?1:0;	return cnt;}// -----------------------------------int	ChanHitList::closestHit(){	unsigned int hop=10000;	for(int i=0; i<MAX_HITS; i++)		if (hits[i].host.ip && !hits[i].dead)			if (hits[i].numHops < hop)				hop = hits[i].numHops;	return hop;}// -----------------------------------int	ChanHitList::furthestHit(){	unsigned int hop=0;	for(int i=0; i<MAX_HITS; i++)		if (hits[i].host.ip && !hits[i].dead)			if (hits[i].numHops > hop)				hop = hits[i].numHops;	return hop;}// -----------------------------------unsigned int	ChanHitList::newestHit(){	unsigned int time=0;	for(int i=0; i<MAX_HITS; i++)		if (hits[i].host.ip && !hits[i].dead)			if (hits[i].time > time)				time = hits[i].time;	return time;}// -----------------------------------int ChanHitList::pickHits(ChanHitSearch &chs)
{
	ChanHit best,*bestP=NULL;
	best.init();
	best.numHops = 255;
	best.time = 0;

	unsigned int ctime = sys->getTime();

	for(int i=0; i<MAX_HITS; i++)		{		ChanHit *c = &hits[i];		if (c->host.ip && !c->dead)
		{
			if (!chs.excludeID.isSame(c->sessionID))
			if ((chs.waitDelay==0) || ((ctime-c->lastContact) >= chs.waitDelay))
			if ((c->numHops<best.numHops))	// (c->time>=best.time))
			if (c->relay || (!c->relay && chs.useBusyRelays))
			if (c->cin || (!c->cin && chs.useBusyControls))
			{

				if (chs.trackersOnly && c->tracker)
				{
					if (chs.matchHost.ip)
					{
						if ((c->rhost[0].ip == chs.matchHost.ip) && c->rhost[1].isValid())
						{
							bestP = c;
							best = *c;
							best.host = best.rhost[1];	// use lan ip
						}
					}else if (c->firewalled == chs.useFirewalled)
					{
						bestP = c;
						best = *c;
						best.host = best.rhost[0];			// use wan ip
					}
				}else if (!chs.trackersOnly && !c->tracker)
				{					if (chs.matchHost.ip)
					{
						if ((c->rhost[0].ip == chs.matchHost.ip) && c->rhost[1].isValid())
						{
							bestP = c;
							best = *c;
							best.host = best.rhost[1];	// use lan ip
						}
					}else if (c->firewalled == chs.useFirewalled)
					{
						bestP = c;
						best = *c;
						best.host = best.rhost[0];			// use wan ip
					}
				}
			}
		}	}


	if (bestP)
	{
		if (chs.numResults < ChanHitSearch::MAX_RESULTS)
		{
			if (chs.waitDelay)
				bestP->lastContact = ctime;
			chs.best[chs.numResults++] = best;
			return 1;
		}

	}

	return 0;
}// -----------------------------------const char *ChanInfo::getTypeStr(TYPE t){	switch (t)	{		case T_RAW: return "RAW";		case T_MP3: return "MP3";		case T_OGG: return "OGG";		case T_WMA: return "WMA";		case T_MOV: return "MOV";		case T_MPG: return "MPG";		case T_NSV: return "NSV";		case T_WMV: return "WMV";		case T_PLS: return "PLS";		case T_ASX: return "ASX";		default: return "UNKNOWN";	}}// -----------------------------------const char *ChanInfo::getProtocolStr(PROTOCOL t){	switch (t)	{		case SP_PEERCAST: return "PEERCAST";		case SP_HTTP: return "HTTP";		case SP_FILE: return "FILE";		case SP_MMS: return "MMS";		case SP_PCP: return "PCP";
		default: return "UNKNOWN";	}}// -----------------------------------ChanInfo::PROTOCOL ChanInfo::getProtocolFromStr(const char *str){	if (stricmp(str,"PEERCAST")==0)		return SP_PEERCAST;	else if (stricmp(str,"HTTP")==0)		return SP_HTTP;	else if (stricmp(str,"FILE")==0)		return SP_FILE;	else if (stricmp(str,"MMS")==0)		return SP_MMS;	else if (stricmp(str,"PCP")==0)
		return SP_PCP;
	else 		return SP_UNKNOWN;}// -----------------------------------const char *ChanInfo::getTypeExt(TYPE t){	switch(t)	{		case ChanInfo::T_OGG:			return ".ogg";		case ChanInfo::T_MP3:			return ".mp3";		case ChanInfo::T_MOV:			return ".mov";		case ChanInfo::T_NSV:			return ".nsv";		case ChanInfo::T_WMV:			return ".wmv";		case ChanInfo::T_WMA:			return ".wma";		default:			return "";	}}// -----------------------------------ChanInfo::TYPE ChanInfo::getTypeFromStr(const char *str){	if (stricmp(str,"MP3")==0)		return T_MP3;	else if (stricmp(str,"OGG")==0)		return T_OGG;	else if (stricmp(str,"RAW")==0)		return T_RAW;	else if (stricmp(str,"NSV")==0)		return T_NSV;	else if (stricmp(str,"WMA")==0)		return T_WMA;	else if (stricmp(str,"WMV")==0)		return T_WMV;	else if (stricmp(str,"PLS")==0)		return T_PLS;	else if (stricmp(str,"M3U")==0)		return T_PLS;	else if (stricmp(str,"ASX")==0)		return T_ASX;	else 		return T_UNKNOWN;}// -----------------------------------
bool	ChanInfo::matchNameID(ChanInfo &inf)
{
	if (inf.id.isSet())
		if (id.isSame(inf.id))
			return true;

	if (!inf.name.isEmpty())
		if (name.contains(inf.name))
			return true;

	return false;
}
// -----------------------------------bool	ChanInfo::match(ChanInfo &inf){	bool matchAny=true;	if (inf.status != S_UNKNOWN)	{		if (status != inf.status)			return false;	}	if (inf.bitrate != 0)	{		if (bitrate == inf.bitrate)			return true;		matchAny = false;	}	if (inf.id.isSet())	{		if (id.isSame(inf.id))			return true;		matchAny = false;	}	if (inf.contentType != T_UNKNOWN)	{		if (contentType == inf.contentType)			return true;		matchAny = false;	}	if (!inf.name.isEmpty())	{		if (name.contains(inf.name))			return true;		matchAny = false;	}	if (!inf.genre.isEmpty())	{		if (genre.contains(inf.genre))			return true;		matchAny = false;	}	return matchAny;}// -----------------------------------
bool TrackInfo::update(TrackInfo &inf)
{
	bool changed = false;

	if (!contact.isSame(inf.contact))
	{
		contact = inf.contact;
		changed = true;
	}

	if (!title.isSame(inf.title))
	{
		title = inf.title;
		changed = true;
	}

	if (!artist.isSame(inf.artist))
	{
		artist = inf.artist;
		changed = true;
	}

	if (!album.isSame(inf.album))
	{
		album = inf.album;
		changed = true;
	}

	if (!genre.isSame(inf.genre))
	{
		genre = inf.genre;
		changed = true;
	}


	return changed;
}

// -----------------------------------bool ChanInfo::update(ChanInfo &info){	bool changed = false;



	// check valid id
	if (!info.id.isSet())
		return false;

	// only update from chaninfo that has full name etc..	if (info.name.isEmpty())		return false;
	// check valid broadcaster key
	if (bcID.isSet())
		if (!bcID.isSame(info.bcID))
		{
			LOG_ERROR("ChanInfo BC key not valid");
			return false;
		}

	bcID = info.bcID;

	if (bitrate != info.bitrate)
	{
		bitrate = info.bitrate;
		changed = true;
	}

	if (contentType != info.contentType)
	{
		contentType = info.contentType;
		changed = true;
	}

	if (!name.isSame(info.name))
	{
		name = info.name;
		changed = true;
	}

	if (!comment.isSame(info.comment))
	{
		comment = info.comment;
		changed = true;
	}

	if (!genre.isSame(info.genre))
	{
		genre = info.genre;
		changed = true;
	}
	
	if (!url.isSame(info.url))
	{
		url = info.url;
		changed = true;
	}

	if (track.update(info.track))
		changed = true;

	return changed;}// -----------------------------------void ChanInfo::initNameID(const char *n){	init();	id.fromStr(n);	if (!id.isSet())		name.set(n);}// -----------------------------------void ChanInfo::init(){	status = S_UNKNOWN;	name.clear();	bitrate = 0;	contentType = T_UNKNOWN;	srcProtocol = SP_UNKNOWN;	id.clear();	url.clear();	genre.clear();	comment.clear();	track.clear();	lastPlayStart = 0;
	lastPlayEnd = 0;	numSkips = 0;
	bcID.clear();
	createdTime = 0;
}// -----------------------------------void ChanInfo::readTrackXML(XML::Node *n){	track.clear();	readXMLString(track.title,n,"title");	readXMLString(track.contact,n,"contact");	readXMLString(track.artist,n,"artist");	readXMLString(track.album,n,"album");	readXMLString(track.genre,n,"genre");}// -------------------

⌨️ 快捷键说明

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