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

📄 dvgraph.c

📁 P2P模拟器
💻 C
字号:
/* * Copyright (c) 2003-2005 Jinyang Li *                    Massachusetts Institute of Technology *  * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: *  * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. *  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */#include "dvgraph.h"#include <stdio.h>#include <iostream>#include <assert.h>using namespace std;DVGraph::DVGraph()  : _n(0), _links(0), _initialized(0), _routes(0){}DVGraph::~DVGraph(){  if(_links)    free(_links);  if(_routes)    free(_routes);}// return the latency along the path from n1 to n2.TimeDVGraph::latency(IPAddress a, IPAddress b, bool reply){  dv();#if 0  assert(_ip2i.find(a) != _ip2i.end());  assert(_ip2i.find(b) != _ip2i.end());#endif  int i = _ip2i[a];  int j = _ip2i[b];  assert(i < _n && j < _n && i >= 0 && j >= 0);  int m = routes(i, j)._metric;  assert(m >= 0 && m < 30000);  return m;}voidDVGraph::add_node(IPAddress a){  if(_ip2i.find(a) != _ip2i.end()){    cerr << "DVGraph: node with ip=" << a << " already added!" << endl;    exit(1);  }  _ip2i[a] = _n;  _i2ip.push_back(a);  assert(_i2ip[_n] == a);  _n++;}// compute routes between all nodes.voidDVGraph::dv(){  int i, j;  if(_initialized)    return;  _initialized = 1;  _routes = (Entry *) malloc(sizeof(Entry) * _n * _n);  assert(_routes);  for(i = 0; i < _n; i++){    for(j = 0; j < _n; j++){      routes(i, j)._next = -1;      routes(i, j)._metric = 30000; // infinity      routes(i, j)._hops = 30000;    }    routes(i, i)._next = i;    routes(i, i)._metric = 0;    routes(i, i)._hops = 0;  }  // run distance-vector until it converges.  int iters;  for(iters = 0; ; iters++){    bool done = true;    for(i = 0; i < _n; i++){      for(j = 0; j < _n; j++){        int m = links(i, j);        if(m >= 0){          // there is a link from i to j with metric m.          // send i's routing table to j.          int k;          for(k = 0; k < _n; k++){            if(routes(i, k)._next != -1 &&               routes(i, k)._metric + m < routes(j, k)._metric){              routes(j, k)._next = i;              routes(j, k)._metric = routes(i, k)._metric + m;              routes(j, k)._hops = routes(i, k)._hops + 1;#if 0              printf("%d to %d via %d metric %d\n",                     j, k, i, routes(j, k)._metric);#endif              done = false;            }          }        }      }    }    if(done)      break;  }  // check that the network is connected.  // and find the average path length in milliseconds.  double hop_sum = 0;  double metric_sum = 0;  double neighbors_sum = 0;  for(i = 0; i < _n; i++){    for(j = 0; j < _n; j++){      if(routes(i, j)._next == -1){        fprintf(stderr, "DVGraph: not connected!\n");        exit(1);      }      metric_sum += routes(i, j)._metric;      hop_sum += routes(i, j)._hops;      if(routes(i, j)._next == j && i != j)        neighbors_sum += 1;    }  }  fprintf(stderr, "DVGraph: %d iters, avg metric %.1f, hops %.1f, degree %.1f\n",          iters,          metric_sum / (_n * _n),          hop_sum / (_n * _n),          neighbors_sum / _n);}

⌨️ 快捷键说明

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