代码改变世界

WCF 第十二章 对等网 限制一条消息的跳数

2011-05-19 21:41  DanielWise  阅读(861)  评论(0编辑  收藏  举报
基于消息洪水的对等网提供一个限制一条消息在网络上传输距离的方式。一条消息的传输距离通常是指这条消息在网络上传输过程中的跳数。中转点数目通过计算一条消息在邻近节点间传输的次数确定。对那些熟悉套接字编程的人来说,这类似于在TCP协议上设置活跃时间(Time-to-Live, TTL),确定了一个包可以在被丢弃前最大的传输路由器个数。图片12.7通过显示连接的节点来描述了时间点。四个节点分别是A,B,C和D。 由节点A发出的消息A在被节点D接收之前要经过三次跳转。当在整个互联网范围工作时跳转数据是非常重要的。当我们遇到这些情况时我们寻找限制跳转次数的方法。
图片12.7 在连接点之间的跳数。
  WCF通过限制一条消息在网状网络中传输的跳数的消息契约来提供一个非常简单的结构。列表12.8显示了为一个分布式搜索发送请求的SearchRequest消息契约。其中的一个契约与PeerHopCount属性一起作为一个属性。PeerHopCount属性可以与一个整型值关联。当消息发送到一个不同节点时这个值每次都递减。当消息已经经过很多节点的传输且计数值已经减为0的时候,消息不会再向邻居节点传输。一个跳转计数必须在消息可以传输的节点数量上设置一个停止条件。在我们的例子中跳转数据设置为3.
列表12.8 使用PeerHopCount的消息契约
    [MessageContract]
    public class SearchRequest
    {
        [PeerHopCount]
        private int hopCount;

        [MessageBodyMember]
        private string query;

        public string Query
        {
            get { return query; }
            set { query = value; }
        }

        [MessageBodyMember]
        private PeerInstance participant;

        public PeerInstance Participant
        {
            get { return participant; }
            set { participant = value; }
        }

        public SearchRequest()
        {
        }

        public SearchRequest(string query)
        {
            hopCount = 3;
            this.query = query;
            participant = new PeerInstance();
        }

        public SearchRequest(int hopCount, string query)
            : this(query)
        {
            this.hopCount = hopCount;
        }
    }