⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genericlink.java

📁 一个小型网络仿真器的实现
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
          theSim.enqueue(e); //loopback to me until the actual time!
        }
        else {
          schedule_next_checkpoint((Integer)paramlist[1]);
        }
        break;
    }
  }

////compInfo of GenericLink
////(refer constant definitions near the beginning of the class declaration)
  public Object compInfo(int infoid,SimComponent src,Object paramlist) {
    switch(infoid) {
      case GET_CAPACITY:
        return new Double(ln_speed.getValue());
      case GET_OTHER_END:
        if(neighborCount()<2) return null;
        if(neighbor(0)==(SimComponent)paramlist) return neighbor(1);
        else if(neighbor(1)==(SimComponent)paramlist) return neighbor(0);
        else return null;
      case LINK_ANIM:
        Object [] params=(Object [])paramlist;
        draw_anim((Graphics)params[0],((Boolean)params[1]).booleanValue(),
                    ((Double)params[2]).doubleValue());
        break;
    }
    return null;
  }

///////////////////// private methods ////////////////////////////////

  private void ln_create() {
    link_neighbors=new java.util.ArrayList();
    animPackets=new java.util.HashMap();

    //Initialize the parameters
    ln_speed=new SimParamDouble("Link Speed (MBits/sec)",this,theSim.now(),false,true,10);
    ln_distance=new SimParamDouble("Distance (km)",this,theSim.now(),false,true,0.1);
    ln_prop_speed=new SimParamDouble("Propagation Speed (km/s)",this,theSim.now(),false,true,200000);
    ln_ai=new SimParamDouble("Averaging Interval (usec)",this,theSim.now(),false,true,100000.0);

    ln_fail=new SimParamBool("Enable Link Fail",this,theSim.now(),false,true,false);
    ln_fail_start=new SimParamDouble("Fail start time (s)",this,theSim.now(),false,true,0);
    ln_fail_len=new SimParamDouble("Fail duration (s) (0=inf)",this,theSim.now(),false,true,0);
    ln_fail_repeat=new SimParamInt("Fail repeat times (-1=inf)",this,theSim.now(),false,true,-1);
    ln_fail_delay=new SimParamDouble("Delay between fails (s)",this,theSim.now(),false,true,0);
    ln_fail_random_len=new SimParamBool("Random fail duration",this,theSim.now(),false,true,false);
    ln_fail_random_delay=new SimParamBool("Random delay bet. fails",this,theSim.now(),false,true,false);
    ln_fail_start_delay=new SimParamBool("Fail start delay",this,theSim.now(),false,true,false);
    ln_fail_notify=new SimParamBool("Fail Notification",this,theSim.now(),false,true,true);

    ln_name_seed=new SimParamBool("Use name as seed",this,theSim.now(),false,true,false);
    ln_anim=new SimParamBool("Enable Animation",this,theSim.now(),false,true,false);
    ln_checkpoint=new SimParamInt("Animation Detail (>0)",this,theSim.now(),false,true,5);
    ln_anim_delay=new SimParamDouble("Animation Delay (msec/km)",this,theSim.now(),false,true,5000);
    ln_log_factor=new SimParamInt("Logging every (ticks) (e.g. 1, 100)",this,theSim.now(),false,true,0);

    addParameter(ln_speed);
    addParameter(ln_distance);
    addParameter(ln_prop_speed);
    addParameter(ln_ai);
    addParameter(ln_fail);
    addParameter(ln_fail_start);
    addParameter(ln_fail_len);
    addParameter(ln_fail_repeat);
    addParameter(ln_fail_delay);
    addParameter(ln_fail_random_len);
    addParameter(ln_fail_random_delay);
    addParameter(ln_fail_start_delay);
    addParameter(ln_fail_notify);
    addParameter(ln_anim);
    addParameter(ln_checkpoint);
    addParameter(ln_anim_delay);
    addParameter(ln_name_seed);
    addParameter(ln_log_factor);
  }

  private void ln_averaging_interval() {
    double interval;

    for(int i=0;i<link_neighbors.size();i++) {
      LinkNeighbor n=(LinkNeighbor)link_neighbors.get(i);
      interval=SimClock.Tick2USec(theSim.now()-n.prev_sample);
      if(interval>0) {
        n.c_rate.setValue(n.curbits/interval,theSim.now(),ln_log_factor.getValue());
        n.totalbits+=n.curbits;
        n.l_rate.setValue(n.totalbits/SimClock.Tick2USec(theSim.now()),theSim.now(),ln_log_factor.getValue());
        n.curbits=0;
        n.prev_sample=theSim.now();
      }
    }
  }

  private void ln_ready(SimEvent e) {
    theSim.enqueue(new SimEvent(SimProvider.EV_READY,this,e.getSource(),theSim.now(),null));

    if(fail_state) return; //don't do animation during link failure

    if(ln_anim.getValue()==true && neighborCount()==2) {
      schedule_checkpoints(e);
    }
  }

  private void ln_receive(SimEvent e) {
    Bits bits=(Bits)e.getParams();
    long ticks,eta;

    ticks= SimClock.USec2Tick(bits.length()/ln_speed.getValue());
    eta=theSim.now() + ticks;
    theSim.enqueue(new SimEvent(MY_READY,e.getSource(),this,eta,null));

  //NOTE: if link is in fail state, READY is still sent back to neighbor,
  //      but delivery is not done

    ticks=ticks + SimClock.Sec2Tick(ln_distance.getValue()/ln_prop_speed.getValue());
    eta=theSim.now() + ticks;

    SimComponent to_link=null;
    for(int i=0;i<link_neighbors.size();i++) {
      LinkNeighbor n=(LinkNeighbor)link_neighbors.get(i);
      if(n.to_link != e.getSource()) {
        if(fail_state) {
          n.packet_drop.setValue(n.packet_drop.getValue()+1,theSim.now(),ln_log_factor.getValue());
          n.bits_drop.setValue(n.bits_drop.getValue()+bits.length(),theSim.now(),ln_log_factor.getValue());
          return;
        }
        else {
          n.curbits+=bits.length();
          theSim.enqueue(new SimEvent(SimProvider.EV_RECEIVE,this,n.to_link,eta,bits));
  
          to_link=n.to_link;
          break;
        }
      }
    }

    //for Analyzer
    if(analyzer != null) {
      analyzer.update(bits,(SimComponent)e.getSource(),to_link);
    }
  }

  private long getFailDelay() {
    double delay=ln_fail_delay.getValue();
    if(ln_fail_random_delay.getValue()) {
      delay= -delay * Math.log(1.0 - randgen.nextDouble());
    }
    return SimClock.Sec2Tick(delay);
  }

  private long getFailLen() {
    double len=ln_fail_len.getValue();
    if(ln_fail_random_len.getValue()) {
      len= -len * Math.log(1.0 - randgen.nextDouble());
    }
    return SimClock.Sec2Tick(len);
  }

  private void ln_do_fail() {
    fail_state=true;

    //schedule end of fail
    if(ln_fail_len.getValue()>0) {
      long tick=getFailLen();
      theSim.enqueue(new SimEvent(EV_END_FAIL,this,this,theSim.now()+tick,null));
    }

    //notify both neighbors
    if(ln_fail_notify.getValue()==true) {
      for(int i=0;i<neighborCount();i++) {
        theSim.enqueue(new SimEvent(SimProvider.EV_LINK_DOWN,this,neighbor(i),theSim.now(),null));
      }
    }
  }

  private void ln_end_fail() {
    fail_state=false;

    //schedule next fail
    fail_time++;
    if(fail_time<ln_fail_repeat.getValue() || ln_fail_repeat.getValue()<0) {
      long tick=getFailDelay();
      theSim.enqueue(new SimEvent(EV_DO_FAIL,this,this,theSim.now()+tick,null));
    }

    //notify both neighbors
    if(ln_fail_notify.getValue()==true) {
      for(int i=0;i<neighborCount();i++) {
        theSim.enqueue(new SimEvent(SimProvider.EV_LINK_UP,this,neighbor(i),theSim.now(),null));
      }
    }
  }

  private synchronized void schedule_checkpoints(SimEvent e) {
    //schedule the next checkpoint
    Object [] paramlist=new Object[2];
    paramlist[0]=new Long(System.currentTimeMillis()); //next expected time
    paramlist[1]=new Integer(last_id++); //asign new id
    theSim.enqueue(new SimEvent(MY_CHECK_POINT,this,this,theSim.now(),paramlist));

    //add new packet info
    AnimPacket anim=new AnimPacket();
    anim.checkpoint=0;
    anim.neighbor_index=(e.getSource()==neighbor(0))?0:1;
    animPackets.put(paramlist[1],anim);
  }

  private synchronized void schedule_next_checkpoint(Integer id) {
    AnimPacket anim=(AnimPacket)animPackets.get(id);
    if(anim==null) return;

    anim.checkpoint++;
    int chk_points=ln_checkpoint.getValue() * 2;
    if(anim.checkpoint>chk_points) {
      animPackets.remove(id);
      return;
    }

    //schedule the next checkpoint
    long segment_time=(long)(ln_distance.getValue()*ln_anim_delay.getValue()/chk_points);
    long segment_ticks=SimClock.Sec2Tick((ln_distance.getValue()/ln_prop_speed.getValue())/chk_points);
    Object [] paramlist=new Object[2];
    paramlist[0]=new Long(System.currentTimeMillis()+segment_time); //next expected time
    paramlist[1]=id;
    theSim.enqueue(new SimEvent(MY_CHECK_POINT,this,this,theSim.now()+segment_ticks,paramlist));
  }

  private synchronized void draw_anim(Graphics g,boolean isZooming,double zoomFactor) {
    if(animPackets.isEmpty()) return;

    int n0,n1,x,y;
    double ratio;

    java.util.Iterator i=animPackets.values().iterator();
    while(i.hasNext()) {
      AnimPacket anim=(AnimPacket)i.next();

      if(anim.neighbor_index==0) {
        n0=0; n1=1;
      }
      else {
        n0=1; n1=0;
      }

      if(anim.checkpoint > ln_checkpoint.getValue()) {
        ratio=((double)anim.checkpoint-ln_checkpoint.getValue())/ln_checkpoint.getValue();
        x=(int)(ratio*(neighbor(n1).getX()-this.getX()) + this.getX());
        y=(int)(ratio*(neighbor(n1).getY()-this.getY()) + this.getY());
      }
      else {
        ratio=((double)anim.checkpoint)/ln_checkpoint.getValue();
        x=(int)(ratio*(this.getX()-neighbor(n0).getX()) + neighbor(n0).getX());
        y=(int)(ratio*(this.getY()-neighbor(n0).getY()) + neighbor(n0).getY());
      }

      g.setColor(ANIM_NEIGHBOR_COL[anim.neighbor_index]);
      if(isZooming)
        g.fillRect((int)(x*zoomFactor-3),(int)(y*zoomFactor-3),6,6);
      else
        g.fillRect(x-3,y-3,6,6);
    }
  }

////////////////////// SimCommand services ///////////////////////

  public void analyzerUp(Analyzer a) {
    analyzer=a;
  }

  public void analyzerDown(Analyzer a) {
    analyzer=null;
  }

  public SimCommand querySimCommand(int selectedCount) {
    if(selectedCount==1) { //only allow one at a time...
      if(analyzer!=null) return analyzer;
      return new Analyzer(this,this);
    }
    else return null;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -