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

通讯编程

开发平台:

Visual C++

  1. //
  2. // ping_receiver.cc : Ping Receiver Main File
  3. // author           : Fabio Silva
  4. //
  5. // Copyright (C) 2000-2002 by the University of Southern California
  6. // $Id: 2pp_ping_receiver.cc,v 1.3 2005/09/13 04:53:46 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 "2pp_ping_receiver.hh"
  43. #ifdef NS_DIFFUSION
  44. static class TPPPingReceiverAppClass : public TclClass {
  45. public:
  46.     TPPPingReceiverAppClass() : TclClass("Application/DiffApp/PingReceiver/TPP") {}
  47.     TclObject* create(int , const char*const* ) {
  48.     return(new TPPPingReceiverApp());
  49.     }
  50. } class_ping_receiver;
  51. int TPPPingReceiverApp::command(int argc, const char*const* argv) {
  52.   if (argc == 2) {
  53.     if (strcmp(argv[1], "subscribe") == 0) {
  54.       run();
  55.       return TCL_OK;
  56.     }
  57.    }
  58.   return DiffApp::command(argc, argv);
  59. }
  60. #endif // NS_DIFFUSION
  61. void TPPPingReceiverReceive::recv(NRAttrVec *data, NR::handle my_handle)
  62. {
  63.   app_->recv(data, my_handle);
  64. }
  65. void TPPPingReceiverApp::recv(NRAttrVec *data, NR::handle my_handle)
  66. {
  67.   NRSimpleAttribute<int> *counterAttr = NULL;
  68.   NRSimpleAttribute<void *> *timeAttr = NULL;
  69.   EventTime *probe_event;
  70.   long delay_seconds;
  71.   long delay_useconds;
  72.   float total_delay;
  73.   struct timeval tmv;
  74.   GetTime(&tmv);
  75.   counterAttr = AppCounterAttr.find(data);
  76.   timeAttr = TimeAttr.find(data);
  77.   if (!counterAttr || !timeAttr){
  78.     DiffPrint(DEBUG_ALWAYS, "Received a BAD packet !n");
  79.     PrintAttrs(data);
  80.     return;
  81.   }
  82.   // Calculate latency
  83.   probe_event = (EventTime *) timeAttr->getVal();
  84.   delay_seconds = tmv.tv_sec;
  85.   delay_useconds = tmv.tv_usec;
  86.   if ((delay_seconds < probe_event->seconds_) ||
  87.       ((delay_seconds == probe_event->seconds_) &&
  88.        (delay_useconds < probe_event->useconds_))){
  89.     // Time's not synchronized
  90.     delay_seconds = -1;
  91.     delay_useconds = 0;
  92.     DiffPrint(DEBUG_ALWAYS, "Error calculating delay !n");
  93.   }
  94.   else{
  95.     delay_seconds = delay_seconds - probe_event->seconds_;
  96.     if (delay_useconds < probe_event->useconds_){
  97.       delay_seconds--;
  98.       delay_useconds = delay_useconds + 1000000;
  99.     }
  100.     delay_useconds = delay_useconds - probe_event->useconds_;
  101.   }
  102.   total_delay = (float) (1.0 * delay_seconds) + ((float) delay_useconds / 1000000.0);
  103.   // Check if this is the first message received
  104.   if (first_msg_recv_ < 0){
  105.     first_msg_recv_ = counterAttr->getVal();
  106.   }
  107.   // Print output message
  108.   if (last_seq_recv_ >= 0){
  109.     if (counterAttr->getVal() < last_seq_recv_){
  110.       // Multiple sources detected, disabling statistics
  111.       last_seq_recv_ = -1;
  112.       DiffPrint(DEBUG_ALWAYS, "Node%d: Received data %d, total latency = %f!n",
  113. ((DiffusionRouting *)dr_)->getNodeId(),
  114. counterAttr->getVal(), total_delay);
  115.     }
  116.     else{
  117.       last_seq_recv_ = counterAttr->getVal();
  118.       num_msg_recv_++;
  119.       DiffPrint(DEBUG_ALWAYS, "Node%d: Received data: %d, total latency = %f, %% messages received: %f !n",
  120. ((DiffusionRouting *)dr_)->getNodeId(),
  121. last_seq_recv_, total_delay,
  122. (float) ((num_msg_recv_ * 100.00) /
  123.  ((last_seq_recv_ - first_msg_recv_) + 1)));
  124.     }
  125.   }
  126.   else{
  127.     DiffPrint(DEBUG_ALWAYS, "Node%d: Received data %d, total latency = %f !n",
  128.       ((DiffusionRouting *)dr_)->getNodeId(),
  129.       counterAttr->getVal(), total_delay);
  130.   }
  131. }
  132. handle TPPPingReceiverApp::setupSubscription()
  133. {
  134.   NRAttrVec attrs;
  135.   attrs.push_back(NRClassAttr.make(NRAttribute::IS, NRAttribute::INTEREST_CLASS));
  136.   attrs.push_back(NRAlgorithmAttr.make(NRAttribute::IS, NRAttribute::TWO_PHASE_PULL_ALGORITHM));
  137.   attrs.push_back(LatitudeAttr.make(NRAttribute::GT, 54.78));
  138.   attrs.push_back(LongitudeAttr.make(NRAttribute::LE, 87.32));
  139.   attrs.push_back(TargetAttr.make(NRAttribute::EQ, "F117A"));
  140.   handle h = dr_->subscribe(&attrs, mr_);
  141.   ClearAttrs(&attrs);
  142.   return h;
  143. }
  144. void TPPPingReceiverApp::run()
  145. {
  146.   subHandle_ = setupSubscription();
  147. #ifndef NS_DIFFUSION
  148.   // Do nothing
  149.   while (1){
  150.     sleep(1000);
  151.   }
  152. #endif // !NS_DIFFUSION
  153. }
  154. #ifdef NS_DIFFUSION
  155. TPPPingReceiverApp::TPPPingReceiverApp()
  156. #else
  157. TPPPingReceiverApp::TPPPingReceiverApp(int argc, char **argv)
  158. #endif // NS_DIFFUSION
  159. {
  160.   last_seq_recv_ = 0;
  161.   num_msg_recv_ = 0;
  162.   first_msg_recv_ = -1;
  163.   mr_ = new TPPPingReceiverReceive(this);
  164. #ifndef NS_DIFFUSION
  165.   parseCommandLine(argc, argv);
  166.   dr_ = NR::createNR(diffusion_port_);
  167. #endif // !NS_DIFFUSION
  168. }
  169. #ifndef NS_DIFFUSION
  170. int main(int argc, char **argv)
  171. {
  172.   TPPPingReceiverApp *app;
  173.   app = new TPPPingReceiverApp(argc, argv);
  174.   app->run();
  175.   return 0;
  176. }
  177. #endif // !NS_DIFFUSION