亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mspastryprotocol.java

?? pastry 協議在peersim下的仿真環境。測試無誤。在eclipse下打開源文件夾為工程即可使用和做仿真實驗。
?? JAVA
?? 第 1 頁 / 共 2 頁
字號:
package peersim.pastry;

/**
 *
 *
 * <p>Title: MSPASTRY</p>
 *
 * <p>Description: MsPastry implementation for PeerSim</p>
 *
 * <p>Copyright: Copyright (c) 2007</p>
 *
 * <p>Company: The Pastry Group</p>
 *
 * @author Elisa Bisoffi, Manuel Cortella
 * @version 1.0
 */

import java.math.*;

import peersim.config.*;
import peersim.core.*;
import peersim.edsim.*;
import peersim.transport.*;
import java.util.Comparator;

//__________________________________________________________________________________________________
public class MSPastryProtocol implements Cloneable, EDProtocol {
    //______________________________________________________________________________________________
    /**
     * Event Handler container for managing the receiving of a message
     *
     * <p>Title: MSPASTRY</p>
     *
     * <p>Description: MsPastry implementation for PeerSim</p>
     *
     * <p>Copyright: Copyright (c) 2007</p>
     *
     * <p>Company: The Pastry Group</p>
     *
     * @author Elisa Bisoffi, Manuel Cortella
     * @version 1.0
     */
    public static interface Listener {
        /**
         * This method is called every time a message is received
         * @param m Message
         */
        public void receive(Message m);
    }

    /**
     * Listener assingned to the receiving of a message. If null it is not called
     */
    private Listener listener;

    //______________________________________________________________________________________________
    /**
     * allows to change/clear the listener
     * @param l Listener
     */
    public void setListener(Listener l) {
    	listener = l;
    }

    //______________________________________________________________________________________________
    private static final String PAR_TRANSPORT = "transport";
    private static String prefix = null;
    private UnreliableTransport transport;
    private int tid;
    private int mspastryid;
    private boolean cleaningScheduled = false;

    /**
     * allow to call the cleaning service initializer only once
     */
    private static boolean _ALREADY_INSTALLED = false;

    //______________________________________________________________________________________________
    /**
     * nodeId of this pastry node
     */
    public BigInteger nodeId;

    /**
     * routing table of this pastry node
     */
    public RoutingTable routingTable;

    /**
     * leaf set of this pastry node
     */
    public LeafSet leafSet;


    //______________________________________________________________________________________________
    /**
     * Replicate this object by returning an identical copy.
     * it put the eye on the fact that only the peersim initializer call this
     * method and we expects to replicate every time a non-initialized table.
     * Thus the method clone() do not fill any particular field;
     * @return Object
     */
    public Object clone() {

        MSPastryProtocol dolly = new MSPastryProtocol(MSPastryProtocol.prefix);
        dolly.routingTable = (RoutingTable)this.routingTable.clone();
        dolly.leafSet = (LeafSet)this.leafSet.clone();
        //dolly.nodeId is not copied, because ID is unique!
        return dolly;
    }


    //______________________________________________________________________________________________
    /**
     * Used only by the initializer when creating the prototype Every other instance call CLONE to
     * create the new object. clone could not use this constructor, preferring a more quick
     * constructor
     *
     * @param prefix String
     */
    public MSPastryProtocol(String prefix) {
        this.nodeId = null;              // empty nodeId
        MSPastryProtocol.prefix = prefix;

        _init();

        routingTable = new RoutingTable(MSPastryCommonConfig.BITS / MSPastryCommonConfig.B, Util.pow2(MSPastryCommonConfig.B));
        leafSet = new LeafSet(BigInteger.ZERO, MSPastryCommonConfig.L);

        tid = Configuration.getPid(prefix + "." + PAR_TRANSPORT);

    }

    //______________________________________________________________________________________________
    /**
     * This subrouting is called only once and allow to inizialize the internal state of the
     * MSPastreyProtocol. Every node shares the same configuration, so it is sufficient caling
     * ont this this sub in order to set up the configuration
     */
    private void _init() {
        if (_ALREADY_INSTALLED) return;

        int b=0, l=0, base=0;
        final String PAR_B = "B";
        final String PAR_L = "L";


        b = Configuration.getInt(prefix + "." + PAR_B, 4);
        l = Configuration.getInt(prefix + "." + PAR_L, MSPastryCommonConfig.BITS / b);
        base = Util.pow2(b);

        MSPastryCommonConfig.B = b;
        MSPastryCommonConfig.L = l;
        MSPastryCommonConfig.BASE = base;

        e(MSPastryCommonConfig.info()+"\n");

        _ALREADY_INSTALLED = true;
    }

    //______________________________________________________________________________________________
    /**
     * called when a Lookup message is ready to be passed through the upper/application level, by
     * calling the "message received" event handler (listener). It also provide some statistical
     * update
     * @param m Message
     */
    private void deliver(Message m) {
        //statistiche utili all'observer
        MSPastryObserver.hopStore.add(m.nrHops-1);
        long timeInterval = (CommonState.getTime())-(m.timestamp);
        MSPastryObserver.timeStore.add(timeInterval);

        if (listener != null) {
            listener.receive(m);
        }

    }

    //______________________________________________________________________________________________
    /**
     * given one nodeId, it search through the network its node reference, by performing binary serach
     * (we concern about the ordering of the network).
     * @param searchNodeId BigInteger
     * @return Node
     */
    private Node nodeIdtoNode(BigInteger searchNodeId) {
        if (searchNodeId==null) return null;

        int inf = 0;
        int sup = Network.size() - 1;
        int m;

        while (inf <= sup) {
            m = (inf + sup) / 2;

            BigInteger mId = ((MSPastryProtocol) Network.get(m).getProtocol(mspastryid)).nodeId;

            if (mId.equals(searchNodeId))
                return Network.get(m);

            if (mId.compareTo(searchNodeId) < 0)
                inf = m + 1;
            else
                sup = m - 1;
        }

        /**
         * La ricerca binaria ? veloce ed efficiente, ma qualche volta pu? capitare che l'array dei
         * nodi di Network non sia ordinato, quindi si applica ora la ricerca sequenziale.
         * Se nemmeno la ricerca sequenziale trova il nodo cercato, viene ritornato null
         */
        BigInteger mId;
        for (int i= Network.size()-1; i >= 0 ; i--) {
              mId = ((MSPastryProtocol) Network.get(i).getProtocol(mspastryid)).nodeId;
             if  (mId.equals(searchNodeId))
                    return Network.get(i);
        }

        return null;
    }

    //______________________________________________________________________________________________
    /**
     * see MSPastry protocol "ReceiveRoute" primitive
     * @param m Message
     */
    public void receiveRoute(Message m) {
        switch (m.messageType) {
        case Message.MSG_LOOKUP:
            deliver(m);
            o(" [rr] Delivered message [m.id="+m.id+"] [src=dest=" + RoutingTable.truncateNodeId(nodeId) + "[in "+ ((CommonState.getTime())-(m.timestamp))+" msecs] ["+m.nrHops+" hops]");
            break;
        case Message.MSG_JOINREQUEST:

            m.messageType = Message.MSG_JOINREPLY;
            // ((Message.BodyJoinRequestReply)m.body).joiner = null; //not necessary anymore
            ((Message.BodyJoinRequestReply)m.body).ls = this.leafSet;
            //  ((Message.BodyJoinRequestReply)m.body).rt = ...LEAVE AS IS...

            transport = (UnreliableTransport) (Network.prototype).getProtocol(tid);
            transport.send(nodeIdtoNode(this.nodeId), nodeIdtoNode(m.dest), m, mspastryid);
            break;

        }
    }

    //______________________________________________________________________________________________
    /**
     * see MSPastry protocol "Route" primitive
     * @param m Message
     * @param srcNode Node
     */
    private void route(Message m, Node srcNode) {

        // u("["+RoutingTable.truncateNodeId(nodeId)+"] received msg:[" + m.id + "] to route, with track: <");        o(m.traceToString(false) + ">");

        BigInteger nexthop = null;

        //leave a track of the transit of the message over this node
        m.nrHops++;
        if(m.trackSize<m.tracks.length)
            m.trackSize++;
        m.tracks[m.trackSize-1]= this.nodeId;

        BigInteger curdist;
        BigInteger[] allNodes;
        BigInteger mindist;



        if (leafSet.encompass(m.dest)) {
            // il nodeID j in Li t.c. |k-j| ? minimo
            int near = 0;
            allNodes = leafSet.listAllNodes();

            if (allNodes.length != 0)  {

                mindist = m.dest.subtract(allNodes[near]).abs();
                for (int i = 1; i < allNodes.length; i++) {
                    curdist = m.dest.subtract(allNodes[i]).abs();
                    if (mindist.compareTo(curdist) > 0) {
                        mindist = curdist;
                        near = i;
                    }
                }
                nexthop = allNodes[near];
            } else  nexthop = this.nodeId;

        }
        else {
            int r = Util.prefixLen(m.dest, this.nodeId);
            if (r == MSPastryCommonConfig.DIGITS) {
                deliver(m);
                o("  [route]   Delivered message src=dest=" + RoutingTable.truncateNodeId(nodeId));
                return;
            }

            nexthop = this.routingTable.get(r, Util.charToIndex(Util.put0(m.dest).charAt(r))  );

            if (nexthop == null) {
                //il nodeID j in (Li U Ri) t.c. |k-j| < |k-i| && prefixLen(k,j)>=r

                BigInteger[] l = this.leafSet.listAllNodes();


                for (int jrow = 0; jrow < routingTable.rows; jrow++) {
                    for (int jcol = 0; jcol < routingTable.cols; jcol++) {
                        BigInteger nodejj = routingTable.get(jrow, jcol);
                        if (nodejj!=null)
                         if (cond1(m.dest, this.nodeId,nodejj) &&
                             cond2(m.dest, nodejj, r)) {
                            nexthop = nodejj;
                            break;
                        }
                    }
                }

                if (nexthop == null)
                for (int j = 0; j < l.length; j++) {
                    if (cond1(m.dest, this.nodeId, l[j]) &&
                        cond2(m.dest, l[j], r)) {
                        nexthop = l[j];
                        break;
                    }
                }


            } // end if (nexthop==null)
        }


        o(String.format("[%s].route([type=%s][src:%s][dest:%s][m.id=%d]): [nexthop:%s]",
            RoutingTable.truncateNodeId(nodeId),
            m.messageTypetoString(),
            "", // RoutingTable.truncateNodeId(src.nodeId),
            RoutingTable.truncateNodeId(m.dest),
            m.id,
            RoutingTable.truncateNodeId(nexthop)
                ));

        if ( m.body instanceof Message.BodyJoinRequestReply && false)
         o("m.RT "+((Message.BodyJoinRequestReply)(m.body)).rt);




        /** !!!
         *  (this.nodeId.equals(m.dest)) ? troppo limitativo, noi vogliamo vedere se "io" sono
         * quello pi? (numericammente) vicino possibile.
         * Poich? supponiamo di avvicinarci progressivamente, questo si traduce nel controllare
         * se sono pi? vicino dell'ultimo nodo attraversato (m.traks[last])
         *
         * l'hop lo facciamo solo se facendolo... ridurremo la distanza,
         * la distanza tra destinatario e me
         *   rispetto alla distanza fra destinatario e precedente
         */
        if ((m.trackSize > 0) && (nexthop != null)) {
            BigInteger src = m.tracks[m.trackSize-1]; if (!Util.nearer(m.dest,nexthop,src))
            //if (!Util.nearer(m.dest,nexthop,src.nodeId))
             nexthop = this.nodeId;
        }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产综合久久福利| 国产精品久久久久三级| 91精品国产综合久久久蜜臀粉嫩 | 国产成人精品亚洲日本在线桃色| 日本欧美在线看| 日本成人中文字幕在线视频| 日本成人中文字幕在线视频| 免费欧美在线视频| 久久国产精品72免费观看| 久久99久久精品| 国产乱码精品一区二区三区av | 日韩一级大片在线| 日韩免费观看高清完整版 | 日本一区二区免费在线| 欧美国产一区二区在线观看| 国产精品天干天干在线综合| 国产精品久久久久久久久图文区| 综合激情网...| 亚洲一区免费视频| 青青草原综合久久大伊人精品 | 国产成人午夜高潮毛片| www.欧美色图| 欧亚洲嫩模精品一区三区| 欧美日韩不卡一区二区| 日韩你懂的电影在线观看| 久久亚洲精精品中文字幕早川悠里| 国产亚洲一本大道中文在线| 亚洲欧美中日韩| 日韩精品一级中文字幕精品视频免费观看 | 日韩欧美色电影| 欧美激情中文字幕| 一区二区三区小说| 奇米综合一区二区三区精品视频 | 欧美日本高清视频在线观看| 日韩精品资源二区在线| 欧美国产一区在线| 午夜精品久久久久久| 九九九精品视频| 99热99精品| 欧美一区二区网站| 中文字幕乱码亚洲精品一区| 亚洲图片欧美视频| 国产精品一卡二卡| 欧美性做爰猛烈叫床潮| 久久精品一区二区三区不卡牛牛 | 一本到三区不卡视频| 91精品欧美一区二区三区综合在| 久久久精品2019中文字幕之3| 一二三四区精品视频| 免费观看30秒视频久久| 91麻豆免费在线观看| 日韩欧美久久久| 亚洲欧美视频一区| 精品综合久久久久久8888| 97se亚洲国产综合在线| 精品久久人人做人人爰| 亚洲一区国产视频| 国产成人在线视频网站| 欧美亚洲尤物久久| 国产精品乱人伦中文| 日韩av午夜在线观看| 色又黄又爽网站www久久| 欧美大片日本大片免费观看| 亚洲精品国产无天堂网2021| 国产精品一区二区91| 宅男噜噜噜66一区二区66| 最新欧美精品一区二区三区| 狠狠色2019综合网| 欧美色涩在线第一页| 成人免费一区二区三区在线观看| 精品一区二区av| 欧美日韩精品欧美日韩精品一| 国产精品午夜在线| 国内精品视频666| 欧美一区二区三区视频在线 | 日韩在线观看一区二区| 欧亚一区二区三区| 亚洲欧洲另类国产综合| 国产精一品亚洲二区在线视频| 欧美精品免费视频| 亚洲一线二线三线视频| av在线这里只有精品| 国产婷婷一区二区| 国模一区二区三区白浆| 欧美一级欧美三级在线观看| 亚洲综合久久久久| 色婷婷国产精品| 亚洲天堂成人网| 成人av中文字幕| 中文字幕av在线一区二区三区| 国产一区欧美日韩| xf在线a精品一区二区视频网站| 麻豆成人av在线| 日韩欧美在线一区二区三区| 日韩福利电影在线| 8x福利精品第一导航| 青青草伊人久久| 欧美一区二区啪啪| 日本亚洲最大的色成网站www| 宅男在线国产精品| 麻豆精品视频在线观看免费| 欧美一级片免费看| 狠狠色综合日日| 国产午夜精品一区二区三区四区| 韩国精品主播一区二区在线观看| 2020日本不卡一区二区视频| 国产九九视频一区二区三区| 欧美经典一区二区三区| 成人sese在线| 一区二区三区在线播放| 欧美日韩视频在线一区二区| 亚洲第一搞黄网站| 欧美一卡2卡三卡4卡5免费| 蜜桃视频一区二区| 久久久久综合网| 成人av在线一区二区三区| 亚洲日本韩国一区| 欧美三区在线视频| 日韩激情中文字幕| 欧美本精品男人aⅴ天堂| 国产精品一区二区免费不卡 | 国产精品456| 国产精品无遮挡| 色欧美片视频在线观看在线视频| 亚洲成人久久影院| 日韩一级精品视频在线观看| 国产精品一区二区在线观看不卡| 国产精品久久久久久久午夜片| 在线亚洲一区二区| 日本伊人精品一区二区三区观看方式| 精品久久久久久久久久久久久久久久久 | 天堂va蜜桃一区二区三区漫画版| 91精品国产91久久久久久最新毛片| 久久激情综合网| 欧美国产日韩精品免费观看| 色偷偷久久人人79超碰人人澡 | 在线视频综合导航| 奇米精品一区二区三区在线观看| 久久久久久久久久久99999| 99精品视频在线免费观看| 亚州成人在线电影| 久久久www成人免费毛片麻豆| 91免费版在线| 看片网站欧美日韩| 亚洲欧洲日本在线| 日韩免费福利电影在线观看| 不卡一区中文字幕| 美女免费视频一区| 亚洲天堂2016| 亚洲精品一区二区三区99| 99久久国产综合精品女不卡| 日韩电影在线观看电影| 中文av一区特黄| 欧美一区二区三区在线观看| 成人免费不卡视频| 日韩不卡一区二区| 亚洲欧美一区二区三区孕妇| 欧美mv和日韩mv的网站| 欧美在线一区二区| 粉嫩绯色av一区二区在线观看| 午夜免费欧美电影| 国产精品污网站| 日韩美女在线视频| 欧美亚洲综合一区| 成人av综合在线| 国产一区久久久| 午夜精品久久久久久久久久| 国产精品国产自产拍在线| 精品入口麻豆88视频| 欧美亚洲综合色| 99久久久国产精品| 国产精品18久久久久久久网站| 偷拍一区二区三区| 亚洲人成网站色在线观看| 久久久亚洲国产美女国产盗摄| 欧美一级一级性生活免费录像| 91蜜桃在线观看| 不卡在线视频中文字幕| 国产精品中文字幕欧美| 秋霞电影网一区二区| 亚洲第一电影网| 亚洲一区中文日韩| 亚洲免费观看在线观看| 中文字幕不卡三区| 国产性天天综合网| 久久久精品黄色| 欧美精品一区二区在线观看| 欧美一级一区二区| 91精品国产综合久久久久久 | 国产日韩欧美精品一区| 日韩一级二级三级| 欧美一区二区三区四区五区 | 日本一区二区三区国色天香| 久久一夜天堂av一区二区三区| 欧美老肥妇做.爰bbww视频| 91国内精品野花午夜精品 | 国产女人18毛片水真多成人如厕| 日韩手机在线导航| 日韩欧美国产午夜精品| 欧美一区二区三区思思人|