iostats.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:9k
源码类别:

通讯编程

开发平台:

Visual C++

  1. // 
  2. // iostats.cc      : Collect various statistics for Diffusion
  3. // authors         : Chalermek Intanagonwiwat and Fabio Silva
  4. //
  5. // Copyright (C) 2000-2003 by the University of Southern California
  6. // $Id: iostats.cc,v 1.2 2005/09/13 04:53:47 tomh Exp $
  7. //
  8. // This program is free software; you can redistribute it and/or
  9. // modify it under the terms of the GNU General Public License,
  10. // version 2, as published by the Free Software Foundation.
  11. //
  12. // This program is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. // GNU General Public License for more details.
  16. //
  17. // You should have received a copy of the GNU General Public License along
  18. // with this program; if not, write to the Free Software Foundation, Inc.,
  19. // 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  20. //
  21. // Linking this file statically or dynamically with other modules is making
  22. // a combined work based on this file.  Thus, the terms and conditions of
  23. // the GNU General Public License cover the whole combination.
  24. //
  25. // In addition, as a special exception, the copyright holders of this file
  26. // give you permission to combine this file with free software programs or
  27. // libraries that are released under the GNU LGPL and with code included in
  28. // the standard release of ns-2 under the Apache 2.0 license or under
  29. // otherwise-compatible licenses with advertising requirements (or modified
  30. // versions of such code, with unchanged license).  You may copy and
  31. // distribute such a system following the terms of the GNU GPL for this
  32. // file and the licenses of the other code concerned, provided that you
  33. // include the source code of that other code when and as the GNU GPL
  34. // requires distribution of source code.
  35. //
  36. // Note that people who make modified versions of this file are not
  37. // obligated to grant this special exception for their modified versions;
  38. // it is their choice whether to do so.  The GNU General Public License
  39. // gives permission to release a modified version without this exception;
  40. // this exception also makes it possible to release a modified version
  41. // which carries forward this exception.
  42. #include "iostats.hh"
  43. DiffusionStats::DiffusionStats(int id, int warm_up_time)
  44. {
  45.   // Zero various counters
  46.   num_bytes_recv_ = 0;
  47.   num_bytes_sent_ = 0;
  48.   num_packets_recv_ = 0;
  49.   num_packets_sent_ = 0;
  50.   num_bcast_bytes_recv_ = 0;
  51.   num_bcast_bytes_sent_ = 0;
  52.   num_bcast_packets_recv_ = 0;
  53.   num_bcast_packets_sent_ = 0;
  54.   num_new_messages_sent_ = 0;
  55.   num_new_messages_recv_ = 0;
  56.   num_old_messages_sent_ = 0;
  57.   num_old_messages_recv_ = 0;
  58.   num_interest_messages_sent_ = 0;
  59.   num_interest_messages_recv_ = 0;
  60.   num_data_messages_sent_ = 0;
  61.   num_data_messages_recv_ = 0;
  62.   num_exploratory_data_messages_sent_ = 0;
  63.   num_exploratory_data_messages_recv_ = 0;
  64.   num_pos_reinforcement_messages_sent_ = 0;
  65.   num_pos_reinforcement_messages_recv_ = 0;
  66.   num_neg_reinforcement_messages_sent_ = 0;
  67.   num_neg_reinforcement_messages_recv_ = 0;
  68.   // Initialize id and time
  69.   node_id_ = id;
  70.   warm_up_time_ = warm_up_time;
  71.   GetTime(&start_);
  72. }
  73. void DiffusionStats::logIncomingMessage(Message *msg)
  74. {
  75.   NeighborStatsEntry *neighbor;
  76.   // Ignore event if still warming up
  77.   if (ignoreEvent())
  78.     return;
  79.   // We don't consider messages from local apps/filters
  80.   if (msg->last_hop_ == LOCALHOST_ADDR)
  81.     return;
  82.   num_bytes_recv_ += (msg->data_len_ + sizeof(struct hdr_diff));
  83.   num_packets_recv_++;
  84.   if (msg->next_hop_ == BROADCAST_ADDR){
  85.     num_bcast_packets_recv_++;
  86.     num_bcast_bytes_recv_ += (msg->data_len_ + sizeof(struct hdr_diff));
  87.   }
  88.   if (msg->new_message_)
  89.     num_new_messages_recv_++;
  90.   else
  91.     num_old_messages_recv_++;
  92.   neighbor = getNeighbor(msg->last_hop_);
  93.   neighbor->recv_messages_++;
  94.   if (msg->next_hop_ == BROADCAST_ADDR)
  95.     neighbor->recv_bcast_messages_++;
  96.   switch (msg->msg_type_){
  97.   case INTEREST:
  98.     num_interest_messages_recv_++;
  99.     
  100.     break;
  101.   case DATA:
  102.     num_data_messages_recv_++;
  103.     break;
  104.   case EXPLORATORY_DATA:
  105.     num_exploratory_data_messages_recv_++;
  106.     break;
  107.   case POSITIVE_REINFORCEMENT:
  108.     num_pos_reinforcement_messages_recv_++;
  109.     break;
  110.   case NEGATIVE_REINFORCEMENT:
  111.     num_neg_reinforcement_messages_recv_++;
  112.     break;
  113.   default:
  114.     break;
  115.   }
  116. }
  117. void DiffusionStats::logOutgoingMessage(Message *msg)
  118. {
  119.   NeighborStatsEntry *neighbor;
  120.   // Ignore event if still warming up
  121.   if (ignoreEvent())
  122.     return;
  123.   num_bytes_sent_ += (msg->data_len_ + sizeof(struct hdr_diff));
  124.   num_packets_sent_++;
  125.   if (msg->next_hop_ == BROADCAST_ADDR){
  126.     num_bcast_packets_sent_++;
  127.     num_bcast_bytes_sent_ += (msg->data_len_ + sizeof(struct hdr_diff));
  128.   }
  129.   if (msg->new_message_)
  130.     num_new_messages_sent_++;
  131.   else
  132.     num_old_messages_sent_++;
  133.   if (msg->next_hop_ != BROADCAST_ADDR){
  134.     neighbor = getNeighbor(msg->next_hop_);
  135.     neighbor->sent_messages_++;
  136.   }
  137.   switch (msg->msg_type_){
  138.   case INTEREST:
  139.     num_interest_messages_sent_++;
  140.     
  141.     break;
  142.   case DATA:
  143.     num_data_messages_sent_++;
  144.     break;
  145.   case EXPLORATORY_DATA:
  146.     num_exploratory_data_messages_sent_++;
  147.     break;
  148.   case POSITIVE_REINFORCEMENT:
  149.     num_pos_reinforcement_messages_sent_++;
  150.     break;
  151.   case NEGATIVE_REINFORCEMENT:
  152.     num_neg_reinforcement_messages_sent_++;
  153.     break;
  154.   default:
  155.     break;
  156.   }
  157. }
  158. void DiffusionStats::printStats(FILE *output)
  159. {
  160.   NeighborStatsList::iterator itr;
  161.   NeighborStatsEntry *neighbor;
  162.   long seconds;
  163.   long useconds;
  164.   float total_time;
  165.   // Compute elapsed running time
  166.   GetTime(&finish_);
  167.   seconds = finish_.tv_sec - start_.tv_sec;
  168.   if (finish_.tv_usec < start_.tv_usec){
  169.     seconds--;
  170.     finish_.tv_usec += 1000000;
  171.   }
  172.   useconds = finish_.tv_usec - start_.tv_usec;
  173.   total_time = (float) (1.0 * seconds) + ((float) useconds / 1000000.0);
  174.   fprintf(output, "Diffusion Statsn");
  175.   fprintf(output, "---------------nn");
  176.   fprintf(output, "Node id : %dn", node_id_);
  177.   fprintf(output, "Running time : %f secondsnn", total_time);
  178.   fprintf(output, "Total bytes/packets sent    : %d/%dn",
  179.   num_bytes_sent_, num_packets_sent_);
  180.   fprintf(output, "Total bytes/packets recv    : %d/%dn",
  181.   num_bytes_recv_, num_packets_recv_);
  182.   fprintf(output, "Total BC bytes/packets sent : %d/%dn",
  183.   num_bcast_bytes_sent_, num_bcast_packets_sent_);
  184.   fprintf(output, "Total BC bytes/packets recv : %d/%dn",
  185.   num_bcast_bytes_recv_, num_bcast_packets_recv_);
  186.   fprintf(output, "n");
  187.   fprintf(output, "Messagesn");
  188.   fprintf(output, "--------n");
  189.   fprintf(output, "Old               - Sent : %d - Recv : %dn",
  190.   num_old_messages_sent_, num_old_messages_recv_);
  191.   fprintf(output, "New               - Sent : %d - Recv : %dn",
  192.   num_new_messages_sent_, num_new_messages_recv_);
  193.   fprintf(output, "n");
  194.   fprintf(output, "Interest          - Sent : %d - Recv : %dn",
  195.   num_interest_messages_sent_, num_interest_messages_recv_);
  196.   fprintf(output, "Data              - Sent : %d - Recv : %dn",
  197.   num_data_messages_sent_, num_data_messages_recv_);
  198.   fprintf(output, "Exploratory Data  - Sent : %d - Recv : %dn",
  199.   num_exploratory_data_messages_sent_, num_exploratory_data_messages_recv_);
  200.   fprintf(output, "Pos Reinforcement - Sent : %d - Recv : %dn",
  201.   num_pos_reinforcement_messages_sent_,
  202.   num_pos_reinforcement_messages_recv_);
  203.   fprintf(output, "Neg Reinforcement - Sent : %d - Recv : %dn",
  204.   num_neg_reinforcement_messages_sent_,
  205.   num_neg_reinforcement_messages_recv_);
  206.   fprintf(output, "n");
  207.   fprintf(output, "Neighbors Stats (in packets)n");
  208.   fprintf(output, "----------------------------n");
  209.   for (itr = nodes_.begin(); itr != nodes_.end(); ++itr){
  210.     neighbor = *itr;
  211.     if (neighbor){
  212.       fprintf(output, "Node : %d - Sent(U/B/T) : %d/%d/%d - Recv(U/B/T) : %d/%d/%dn",
  213.       neighbor->id_, neighbor->sent_messages_, num_bcast_packets_sent_,
  214.       (neighbor->sent_messages_ + num_bcast_packets_sent_),
  215.       (neighbor->recv_messages_ - neighbor->recv_bcast_messages_),
  216.       neighbor->recv_bcast_messages_,
  217.       neighbor->recv_messages_);
  218.     }
  219.   }
  220.   fprintf(output, "n");
  221.   fprintf(output, "Key: U - Unicastn");
  222.   fprintf(output, "     B - Broadcastn");
  223.   fprintf(output, "     T - Totaln");
  224.   fprintf(output, "n");
  225. }
  226. NeighborStatsEntry * DiffusionStats::getNeighbor(int id)
  227. {
  228.   NeighborStatsList::iterator itr;
  229.   NeighborStatsEntry *new_neighbor;
  230.   for (itr = nodes_.begin(); itr != nodes_.end(); ++itr){
  231.     if ((*itr)->id_ == id)
  232.       break;
  233.   }
  234.   if (itr == nodes_.end()){
  235.     // New neighbor
  236.     new_neighbor = new NeighborStatsEntry(id);
  237.     nodes_.push_front(new_neighbor);
  238.     return new_neighbor;
  239.   }
  240.   return (*itr);
  241. }
  242. bool DiffusionStats::ignoreEvent()
  243. {
  244.   struct timeval tv;
  245.   GetTime(&tv);
  246.   if ((start_.tv_sec + warm_up_time_) > tv.tv_sec)
  247.     return true;
  248.   return false;
  249. }