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

📄 servmgr.cpp

📁 P2P应用 : Peercast的源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
						break;					ServHost sh = servMgr->getOutgoingServent(netID);					if (!servMgr->addOutgoing(sh.host,netID,false))						servMgr->deadHost(sh.host,ServHost::T_SERVENT);					sys->sleep(servMgr->tryoutDelay);					break;				}			}		}else{
#if 0			Servent *s = servMgr->servents;			while (s)			{				if (s->type == Servent::T_OUTGOING) 					s->thread.active = false;				s=s->next;			}
#endif		}		sys->sleepIdle();	}	thread->unlock();
#endif	return 0;}
// -----------------------------------
bool	ServMgr::acceptGIV(ClientSocket *sock)
{
	Servent *sv = servents;
	while (sv)
	{
		if (sv->type == Servent::T_COUT)
		{
			if (sv->acceptGIV(sock))
				return true;
		}
		sv=sv->next;
	}
	return false;
}

// -----------------------------------
int ServMgr::broadcastPushRequest(ChanHit &hit, Host &to, GnuID &chanID, Servent::TYPE type)
{
	ChanPacket pack;
	MemoryStream pmem(pack.data,sizeof(pack.data));
	AtomStream atom(pmem);

	atom.writeParent(PCP_BCST,7);
		atom.writeChar(PCP_BCST_GROUP,PCP_BCST_GROUP_ALL);
		atom.writeChar(PCP_BCST_HOPS,0);
		atom.writeChar(PCP_BCST_TTL,7);
		atom.writeBytes(PCP_BCST_DEST,hit.sessionID.id,16);
		atom.writeBytes(PCP_BCST_FROM,servMgr->sessionID.id,16);
		atom.writeInt(PCP_BCST_VERSION,PCP_CLIENT_VERSION);
		atom.writeParent(PCP_PUSH,3);
			atom.writeInt(PCP_PUSH_IP,to.ip);
			atom.writeShort(PCP_PUSH_PORT,to.port);
			atom.writeBytes(PCP_PUSH_CHANID,chanID.id,16);


	pack.len = pmem.pos;
	pack.type = ChanPacket::T_PCP;


	GnuID noID;
	noID.clear();

	return servMgr->broadcastPacket(pack,noID,servMgr->sessionID,hit.sessionID,type);
}

// --------------------------------------------------
void ServMgr::writeRootAtoms(AtomStream &atom, bool getUpdate)
{
	atom.writeParent(PCP_ROOT,5 + (getUpdate?1:0));
		atom.writeInt(PCP_ROOT_UPDINT,chanMgr->hostUpdateInterval);
		atom.writeString(PCP_ROOT_URL,"download.php");
		atom.writeInt(PCP_ROOT_CHECKVER,PCP_ROOT_VERSION);
		atom.writeInt(PCP_ROOT_NEXT,chanMgr->hostUpdateInterval);
		atom.writeString(PCP_MESG_ASCII,rootMsg.cstr());
		if (getUpdate)
			atom.writeParent(PCP_ROOT_UPDATE,0);

}
// --------------------------------------------------
void ServMgr::broadcastRootSettings(bool getUpdate)
{
	if (isRoot)
	{

		ChanPacket pack;
		MemoryStream mem(pack.data,sizeof(pack.data));
		AtomStream atom(mem);
		atom.writeParent(PCP_BCST,6);
			atom.writeChar(PCP_BCST_GROUP,PCP_BCST_GROUP_TRACKERS);
			atom.writeChar(PCP_BCST_HOPS,0);
			atom.writeChar(PCP_BCST_TTL,7);
			atom.writeBytes(PCP_BCST_FROM,sessionID.id,16);
			atom.writeInt(PCP_BCST_VERSION,PCP_CLIENT_VERSION);
			writeRootAtoms(atom,getUpdate);

		mem.len = mem.pos;
		mem.rewind();
		pack.len = mem.len;

		GnuID noID;
		noID.clear();

		broadcastPacket(pack,noID,servMgr->sessionID,noID,Servent::T_CIN);
	}
}
// --------------------------------------------------
int ServMgr::broadcastPacket(ChanPacket &pack,GnuID &chanID,GnuID &srcID, GnuID &destID, Servent::TYPE type)
{
	int cnt=0;
	
	Servent *sv = servents;
	while (sv)
	{
		if (sv->sendPacket(pack,chanID,srcID,destID,type))
			cnt++;
		sv=sv->next;
	}
	return cnt;
}

// --------------------------------------------------int ServMgr::idleProc(ThreadInfo *thread){//	thread->lock();	unsigned int lastPasvFind=0;	unsigned int lastBroadcast=0;	// nothing much to do for the first couple of seconds, so just hang around.	sys->sleep(2000);		unsigned int lastBWcheck=0;	unsigned int bytesIn=0,bytesOut=0;
	unsigned int lastBroadcastConnect = 0;
	unsigned int lastRootBroadcast = 0;

	unsigned int lastForceIPCheck = 0;
	while(thread->active)	{		stats.update();

		unsigned int ctime = sys->getTime();


		if (!servMgr->forceIP.isEmpty())
		{
			if ((ctime-lastForceIPCheck) > 60)
			{
				if (servMgr->checkForceIP())
				{
					GnuID noID;
					noID.clear();
					chanMgr->broadcastTrackerUpdate(noID,true);
				}
				lastForceIPCheck = ctime;
			}
		}


		if (chanMgr->isBroadcasting())
		{
			if ((ctime-lastBroadcastConnect) > 30)
			{
				servMgr->connectBroadcaster();
				lastBroadcastConnect = ctime;
			}
		}

		if (servMgr->isRoot)
		{
			if ((servMgr->lastIncoming) && ((ctime-servMgr->lastIncoming) > 60*60))
			{
				peercastInst->saveSettings();
				sys->exit();
			}

			if ((ctime-lastRootBroadcast) > chanMgr->hostUpdateInterval)
			{
				servMgr->broadcastRootSettings(true);
				lastRootBroadcast = ctime;
			}
		}
		// clear dead hits
		chanMgr->clearDeadHits(true);		if (servMgr->shutdownTimer)		{			if (--servMgr->shutdownTimer <= 0)			{				peercastInst->saveSettings();				sys->exit();			}		}
		// shutdown idle channels		if (chanMgr->numIdleChannels() > ChanMgr::MAX_IDLE_CHANNELS)
			chanMgr->closeOldestIdle();
		sys->sleep(500);	}

	sys->endThread(thread);
//	thread->unlock();	return 0;}// --------------------------------------------------int ServMgr::serverProc(ThreadInfo *thread){
//	thread->lock();	Servent *serv = servMgr->allocServent();	Servent *serv2 = servMgr->allocServent();	unsigned int lastLookupTime=0;	while (thread->active)	{		if (servMgr->restartServer)		{			serv->abort();		// force close			serv2->abort();		// force close
			servMgr->quit();			servMgr->restartServer = false;		}		if (servMgr->autoServe)		{			serv->allow = servMgr->allowServer1;			serv2->allow = servMgr->allowServer2;			if ((!serv->sock) || (!serv2->sock))			{				LOG_DEBUG("Starting servers");//				servMgr->forceLookup = true;				//if (servMgr->serverHost.ip != 0)				{					if (servMgr->forceNormal)						servMgr->setFirewall(ServMgr::FW_OFF);					else						servMgr->setFirewall(ServMgr::FW_UNKNOWN);					Host h = servMgr->serverHost;					if (!serv->sock)						serv->initServer(h);					h.port++;					if (!serv2->sock)						serv2->initServer(h);				}			}		}else{			// stop server			serv->abort();		// force close			serv2->abort();		// force close			// cancel incoming connectuions			Servent *s = servMgr->servents;			while (s)			{				if (s->type == Servent::T_INCOMING)					s->thread.active = false;				s=s->next;			}			servMgr->setFirewall(ServMgr::FW_ON);		}					sys->sleepIdle();	}
	sys->endThread(thread);
//	thread->unlock();	return 0;}
// -----------------------------------
void	ServMgr::setMaxRelays(int max)
{
	if (max < MIN_RELAYS)
		max = MIN_RELAYS;
	maxRelays = max;
}
// -----------------------------------XML::Node *ServMgr::createServentXML(){	return new XML::Node("servent agent=\"%s\" ",PCX_AGENT);}// --------------------------------------------------const char *ServHost::getTypeStr(TYPE t){	switch(t)	{		case T_NONE: return "NONE";		case T_STREAM: return "STREAM";		case T_CHANNEL: return "CHANNEL";		case T_SERVENT: return "SERVENT";		case T_TRACKER: return "TRACKER";
	}	return "UNKNOWN";}// --------------------------------------------------ServHost::TYPE ServHost::getTypeFromStr(const char *s){	if (stricmp(s,"NONE")==0)		return T_NONE;	else if (stricmp(s,"SERVENT")==0)		return T_SERVENT;	else if (stricmp(s,"STREAM")==0)		return T_STREAM;	else if (stricmp(s,"CHANNEL")==0)		return T_CHANNEL;	else if (stricmp(s,"TRACKER")==0)
		return T_TRACKER;
	return T_NONE;}

// --------------------------------------------------
bool	ServFilter::writeVariable(Stream &out, const String &var)
{
	char buf[1024];

	if (var == "network")
		strcpy(buf,(flags & F_NETWORK)?"1":"0");
	else if (var == "private")
		strcpy(buf,(flags & F_PRIVATE)?"1":"0");
	else if (var == "direct")
		strcpy(buf,(flags & F_DIRECT)?"1":"0");
	else if (var == "banned")
		strcpy(buf,(flags & F_BAN)?"1":"0");
	else if (var == "ip")
		host.IPtoStr(buf);
	else
		return false;


	out.writeString(buf);
	return true;
}
// --------------------------------------------------
bool	BCID::writeVariable(Stream &out, const String &var)
{
	char buf[1024];

	if (var == "id")
		id.toStr(buf);
	else if (var == "name")
		strcpy(buf,name.cstr());
	else if (var == "email")
		strcpy(buf,email.cstr());
	else if (var == "url")
		strcpy(buf,url.cstr());
	else if (var == "valid")
		strcpy(buf,valid?"Yes":"No");
	else
		return false;


	out.writeString(buf);
	return true;
}


// --------------------------------------------------
bool ServMgr::writeVariable(Stream &out, const String &var)
{
	char buf[1024];
	String str;

	if (var == "version")
		strcpy(buf,PCX_VERSTRING);
	else if (var == "uptime")
	{
		str.setFromStopwatch(getUptime());
		str.convertTo(String::T_HTML);
		strcpy(buf,str.cstr());
	}else if (var == "numRelays")
		sprintf(buf,"%d",numStreams(Servent::T_RELAY,true));
	else if (var == "numDirect")
		sprintf(buf,"%d",numStreams(Servent::T_DIRECT,true));
	else if (var == "totalConnected")
		sprintf(buf,"%d",totalConnected());
	else if (var == "numServHosts")
		sprintf(buf,"%d",numHosts(ServHost::T_SERVENT));		
	else if (var == "numServents")
		sprintf(buf,"%d",numServents());		
	else if (var == "serverPort")
		sprintf(buf,"%d",serverHost.port);		
	else if (var == "serverIP")
		serverHost.IPtoStr(buf);
	else if (var == "ypAddress")
		strcpy(buf,rootHost.cstr());
	else if (var == "password")
		strcpy(buf,password);
	else if (var == "isFirewalled")
		sprintf(buf,"%d",getFirewall()==FW_ON?1:0);
	else if (var == "firewallKnown")
		sprintf(buf,"%d",getFirewall()==FW_UNKNOWN?0:1);
	else if (var == "rootMsg")
		strcpy(buf,rootMsg);
	else if (var == "isRoot")
		sprintf(buf,"%d",isRoot?1:0);
	else if (var == "isPrivate")
		sprintf(buf,"%d",(PCP_BROADCAST_FLAGS&1)?1:0);
	else if (var == "forceYP")
		sprintf(buf,"%d",PCP_FORCE_YP?1:0);
	else if (var == "refreshHTML")
		sprintf(buf,"%d",refreshHTML?refreshHTML:0x0fffffff);
	else if (var == "maxRelays")
		sprintf(buf,"%d",maxRelays);
	else if (var == "maxDirect")
		sprintf(buf,"%d",maxDirect);
	else if (var == "maxBitrateOut")
		sprintf(buf,"%d",maxBitrateOut);
	else if (var == "maxControlsIn")
		sprintf(buf,"%d",maxControl);
	else if (var == "maxServIn")
		sprintf(buf,"%d",maxServIn);
	else if (var == "numFilters")
		sprintf(buf,"%d",numFilters+1);
	else if (var == "maxPGNUIn")
		sprintf(buf,"%d",maxGnuIncoming);
	else if (var == "minPGNUIn")
		sprintf(buf,"%d",minGnuIncoming);
	else if (var == "numActive1")
		sprintf(buf,"%d",numActiveOnPort(serverHost.port));
	else if (var == "numActive2")
		sprintf(buf,"%d",numActiveOnPort(serverHost.port+1));
	else if (var == "numPGNU")
		sprintf(buf,"%d",numConnected(Servent::T_PGNU));
	else if (var == "numCIN")
		sprintf(buf,"%d",numConnected(Servent::T_CIN));
	else if (var == "numCOUT")
		sprintf(buf,"%d",numConnected(Servent::T_COUT));
	else if (var == "numIncoming")
		sprintf(buf,"%d",numActive(Servent::T_INCOMING));
	else if (var == "numValidBCID")
	{
		int cnt = 0;
		BCID *bcid = validBCID;
		while (bcid)
		{
			cnt++;
			bcid=bcid->next;
		}
		sprintf(buf,"%d",cnt);
	}

	else if (var == "disabled")
		sprintf(buf,"%d",isDisabled);

	else if (var == "serverPort1")
		sprintf(buf,"%d",serverHost.port);
	else if (var == "serverLocalIP")
	{
		Host lh(ClientSocket::getIP(NULL),0);
		char ipStr[64];
		lh.IPtoStr(ipStr);
		strcpy(buf,ipStr);
	}else if (var == "upgradeURL")
		strcpy(buf,servMgr->downloadURL);
	else if (var == "serverPort2")
		sprintf(buf,"%d",serverHost.port+1);
	else if (var.startsWith("allow."))
	{
		if (var == "allow.HTML1")
			strcpy(buf,(allowServer1&Servent::ALLOW_HTML)?"1":"0");
		else if (var == "allow.HTML2")
			strcpy(buf,(allowServer2&Servent::ALLOW_HTML)?"1":"0");
		else if (var == "allow.broadcasting1")
			strcpy(buf,(allowServer1&Servent::ALLOW_BROADCAST)?"1":"0");
		else if (var == "allow.broadcasting2")
			strcpy(buf,(allowServer2&Servent::ALLOW_BROADCAST)?"1":"0");
		else if (var == "allow.network1")
			strcpy(buf,(allowServer1&Servent::ALLOW_NETWORK)?"1":"0");
		else if (var == "allow.direct1")
			strcpy(buf,(allowServer1&Servent::ALLOW_DIRECT)?"1":"0");
	}else if (var.startsWith("auth."))
	{
		if (var == "auth.useCookies")
			strcpy(buf,(authType==AUTH_COOKIE)?"1":"0");
		else if (var == "auth.useHTTP")
			strcpy(buf,(authType==AUTH_HTTPBASIC)?"1":"0");
		else if (var == "auth.useSessionCookies")
			strcpy(buf,(cookieList.neverExpire==false)?"1":"0");

	}else if (var.startsWith("log."))
	{
		if (var == "log.debug")
			strcpy(buf,(showLog&(1<<LogBuffer::T_DEBUG))?"1":"0");
		else if (var == "log.errors")
			strcpy(buf,(showLog&(1<<LogBuffer::T_ERROR))?"1":"0");
		else if (var == "log.gnet")
			strcpy(buf,(showLog&(1<<LogBuffer::T_NETWORK))?"1":"0");
		else if (var == "log.channel")
			strcpy(buf,(showLog&(1<<LogBuffer::T_CHANNEL))?"1":"0");
		else
			return false;
	}else if (var == "test")
	{
		out.writeUTF8(0x304b);		
		out.writeUTF8(0x304d);		
		out.writeUTF8(0x304f);		
		out.writeUTF8(0x3051);		
		out.writeUTF8(0x3053);	

		out.writeUTF8(0x0041);	
		out.writeUTF8(0x0042);	
		out.writeUTF8(0x0043);	
		out.writeUTF8(0x0044);	

		out.writeChar('a');
		out.writeChar('b');
		out.writeChar('c');
		out.writeChar('d');
		return true;

	}else
		return false;

	out.writeString(buf);
	return true;
}

⌨️ 快捷键说明

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