对GPSR代码的理解——gpsr_neighbor.h

1

该文件定义gpsr实现所使用的每个节点的邻居列表

  • 邻居列表中的每一项代表一个邻居节点,每个邻居节点有唯一的id,更新其地理位置信息((x,y)坐标),并记录其最近一次收到“hello”消息的时间。
  • 邻居列表中记录有该列表所属节点id、地理位置信息以及该表中所含有节点的个数。
    private中提供了列表更新的方法:在已知节点id的条件下可以对其对应表项进行查看和删除操作、及时清除超时表项、彻底释放当前邻居列表,此外还有三种方法在下面注释下做了标记,暂时不能理解其具体实现意义,等其他文件读到时再进行理解。
    public中则提供了更新当前节点位置信息、添加表项、计算两节点距离以及根据表项节点与目的节点的距离来选择下一跳的方法。
struct gpsr_neighbor { //邻居
  nsaddr_t id_; //唯一标识
  double x_;    //地理位置信息((x,y)坐标)
  double y_; 
  
  double ts_;     //该节点hello消息的最后一个time stamp(时间戳)
  struct gpsr_neighbor *next_;  
  struct gpsr_neighbor *prev_;
};

class GPSRNeighbors { //网络中每个节点的邻居列表
private:
  //the neighbors list
  struct gpsr_neighbor *head_;
  struct gpsr_neighbor *tail_;
  int nbSize_;     //邻居节点的个数 

  nsaddr_t my_id_; //当前节点的id 
  double my_x_;    //当前节点的地理位置信息((x,y)坐标)
  double my_y_;

  //根据提供的ID在邻居列表中查找记录
  struct gpsr_neighbor *getnb(nsaddr_t);

  //根据所提供ID删除邻居列表中的记录
  void delnb(nsaddr_t); 

  //直接删除记录 (作用?)
  void delnb(struct gpsr_neighbor *);

  //删除所有超时的记录
  void delalltimeout();

  //返回给定的邻居列表的大小
  int num_of_neighbors(struct gpsr_neighbor*);
  
  /* 用于周边路由计算的函数 */
  struct gpsr_neighbor *gg_planarize();  //GG 
  struct gpsr_neighbor *rng_planarize(); //RNG 
  void free_neighbors(struct gpsr_neighbor*); //释放给定的邻居列表

  double angle(double, double, double, double);
                                  //基于给定线相对角度计算绝对角度 (作用?)
  
  int intersect(nsaddr_t, double, double, double, double);
  //检查两条线是否在本地交叉 (作用?)
  
public:
  GPSRNeighbors();
  ~GPSRNeighbors();

  //更新当前节点的位置信息
  void myinfo(nsaddr_t, double, double);
  //返回邻居节点数量
  int nbsize();

  // (x1, y1, x2, y2)计算两节点(x1,y1)与(x2,y2)之间的距离
  double getdis(double, double, double, double);

  //向表中添加一个可能的邻居节点
  void newNB(nsaddr_t, double, double); 

  //根据 目的节点(x, y)来决定下一跳
  nsaddr_t gf_nexthop(double, double); //贪婪转发
  nsaddr_t peri_nexthop(int, nsaddr_t, 	double, double, 
			double, double);//周边转发
                                       

  //转储邻居列表(作用?) 
  void dump();
};

#endif 


你可能感兴趣的:(对GPSR代码的理解——gpsr_neighbor.h)