PCP协议实现详解

原创 2006年06月06日 12:13:00

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);

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Peercast中关于Gnutella包源码实现分析

一个Gnutella客户机通过与另一个当前在网络中的客户机建立连接来使自己与网络相连。一旦网络上的另一个客户机的地址被获取,一个与该客户机的TCP/IP连接将被创建,以下的Gnutella连接请求字符...

Peercast整体架构分析

现在的P2P流媒体主要有两种架构:1.基于树的架构。这是由流媒体的多播演化而来的,也就是播放同一频道的节点组成一棵树,提供广播的源节点为这棵树的根。每个节点可以为下层几个节点提供数据。但这种架构仍然会...

阅读Peercast源代码的一些经验

Peercast源代码是我第一次看超过2万行的代码,在这期间收获很大,也积累了一些经验。Peercast源代码是我第一次看超过2万行的代码,在这期间收获很大,也积累了一些经验,在此与大家分享,希望为大...

How to do Reseach

MASSACHUSETTS INSTITUTE OF TECHNOLOGY ARTIFICIAL INTELLIGENCE LABORATORYAI Working Paper 316 October...

Gnutella协议中文版

Gnutella2是一份关于发布检索的协议。虽然Gnutella协议也支持传统的客户端/中心服务器的检索规范,但Gnutella协议更主要是支持点对点的,没有中心的检索。在这个模型中,所有的客户端也是...

Peercast收听电台的源代码流程分析

以收听JOKV-FM(TEST)为例,在YP上点击Play,则其URL地址为peercast://pls/25838B9F1EAE27079B793C9FBA0E4156?tip=222.148.18...

Peercast的PUSH实现方式

防火墙后的客户机   并非总是在初始化一个文件下载后都可以与Gnutella客户机建立直接连接。客户机可能在防火墙后并不允许通过它的Gnutella端口进入的连接。如果一个直接连接不能建立,客户机若想...

关于Peercast一些观点的更新

Peercast原本是基于Gnutella协议的。但发展到现在,已经跟Gnutella没有多大关系了。相关的地方只是在广播机制上采用的仍然是泛洪机制。Gnutella协议是基于图的协议。 而现在的Pe...

Java Lombok @Data @Builder

常用的 lombok 注解@EqualsAndHashCode:实现equals()方法和hashCode()方法 @ToString:实现toString()方法 @Data :注解在类上;...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)