📄 servmgr.cpp
字号:
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 + -