PCP協議,也就是Peercast Protocol,是Peercast用來在節點間傳送資訊所定義的協議。
協議定義的欄位在pcp.h中,本文以如何在節點間傳遞節點資訊(也就是ChanHit)來解釋PCP協議的定義
、運行及如何編程。
//ChanHit資訊
static const ID4 PCP_HOST = "host";
static const ID4 PCP_HOST_ID = "id";
static const ID4 PCP_HOST_IP = "ip";
static const ID4 PCP_HOST_PORT = "port";
static const ID4 PCP_HOST_NUML = "numl";
static const ID4 PCP_HOST_NUMR = "numr";
static const ID4 PCP_HOST_UPTIME = "uptm";
static const ID4 PCP_HOST_TRACKER = "trkr";
static const ID4 PCP_HOST_CHANID = "cid";
static const ID4 PCP_HOST_VERSION = "ver";
static const ID4 PCP_HOST_FLAGS1 = "flg1";
static const ID4 PCP_HOST_OLDPOS = "oldp";
static const ID4 PCP_HOST_NEWPOS = "newp";
ID4是一個自訂類型,簡單理解為char[4]類型
這些資訊的發送和接收由AtomStream類來完成
這裡PCP_HOST代表主資訊,表明發送的資訊類別是主機資訊
以下的PCP_HOST_ID、PCP_HOST_IP均是PCP_HOST的子資訊,這些資訊類別都屬於主機資訊
發送時先發送主資訊,通過writeParent來發送即atom.writeParent(PCP_HOST,12),其中第二個參數12表
示這個主資訊以下將發送12個子資訊,這個參數是為讀取時用的。
然後依次發送子資訊,通過writeInt、writeBytes等來發送整型和字元型的資訊,例如atom.writeInt(PCP_HOST_IP,rhost[0].ip)
相當於索引值型,PCP_HOST_IP代表鍵,rhost[0].ip代表值
void ChanHit::writeAtoms(AtomStream &atom,GnuID &chanID)
{
bool addChan=chanID.isSet();
int fl1 = 0;
if (recv) fl1 |= PCP_HOST_FLAGS1_RECV;
if (relay) fl1 |= PCP_HOST_FLAGS1_RELAY;
if (direct) fl1 |= PCP_HOST_FLAGS1_DIRECT;
if (cin) fl1 |= PCP_HOST_FLAGS1_CIN;
if (tracker) fl1 |= PCP_HOST_FLAGS1_TRACKER;
if (firewalled) fl1 |= PCP_HOST_FLAGS1_PUSH;
atom.writeParent(PCP_HOST,12 + (addChan?1:0));
if (addChan)
atom.writeBytes(PCP_HOST_CHANID,chanID.id,16);
atom.writeBytes(PCP_HOST_ID,sessionID.id,16);
atom.writeInt(PCP_HOST_IP,rhost[0].ip);
atom.writeShort(PCP_HOST_PORT,rhost[0].port);
atom.writeInt(PCP_HOST_IP,rhost[1].ip);
atom.writeShort(PCP_HOST_PORT,rhost[1].port);
atom.writeInt(PCP_HOST_NUML,numListeners);
atom.writeInt(PCP_HOST_NUMR,numRelays);
atom.writeInt(PCP_HOST_UPTIME,upTime);
atom.writeInt(PCP_HOST_VERSION,version);
atom.writeChar(PCP_HOST_FLAGS1,fl1);
atom.writeInt(PCP_HOST_OLDPOS,oldestPos);
atom.writeInt(PCP_HOST_NEWPOS,newestPos);
}