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

通讯编程

开发平台:

Visual C++

  1. //
  2. // rmst_sink.cc    : RmstSink Class Methods
  3. // authors         : Fred Stann
  4. //
  5. // Copyright (C) 2003 by the University of Southern California
  6. // $Id: rmst_sink.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 "rmst_sink.hh"
  43. #ifdef NS_DIFFUSION
  44. static class RmstSnkClass : public TclClass {
  45. public:
  46.   RmstSnkClass() : TclClass("Application/DiffApp/RmstSink") {}
  47.     TclObject* create(int , const char*const* ) {
  48.     return(new RmstSink());
  49.     }
  50. } class_rmst_sink;
  51. int RmstSink::command(int argc, const char*const* argv) 
  52. {
  53.   if (argc == 2) {
  54.     if (strcmp(argv[1], "subscribe") == 0) {
  55.       run();
  56.       return TCL_OK;
  57.     }
  58.    }
  59.   return DiffApp::command(argc, argv);
  60. }
  61. #endif // NS_DIFFUSION
  62. void RmstSnkReceive::recv(NRAttrVec *data, NR::handle my_handle)
  63. {
  64.   NRSimpleAttribute<int> *rmst_id_attr = NULL;
  65.   NRSimpleAttribute<void *> *data_buf_attr = NULL;
  66.   timeval cur_time;
  67.   int rmst_no;
  68.   int size;
  69.   void *blob_ptr;
  70.   printf("RMST-SNK::recv callback got an NRAttrVec.n");
  71.   GetTime (&cur_time);
  72.   printf("  time: sec = %dn", (unsigned int) cur_time.tv_sec);
  73.   rmst_id_attr = RmstIdAttr.find(data);
  74.   data_buf_attr = RmstDataAttr.find(data);
  75.   rmst_no = rmst_id_attr->getVal();
  76.   blob_ptr = data_buf_attr->getVal();
  77.   size = data_buf_attr->getLen();
  78.   printf("  Got a blob, rmstId = %d, size = %dn", rmst_no, size);
  79.   snk_->recv((void *)blob_ptr, size);
  80. }
  81. void RmstSink::run() {
  82.   rmst_handle_ = setupInterest();
  83. #ifndef NS_DIFFUSION
  84.   while (1){
  85.       sleep (1000);
  86.   }
  87. #endif // !NS_DIFFUSION
  88. }  
  89. void RmstSink::recv(void *blob, int size) {
  90.   int i;
  91.   char *tmpPtr = (char*)blob;
  92.   printf("  Sink received a large blob - size = %dn", size);
  93.   for(i=0; i<size; i+=50){
  94.     printf("%sn", &tmpPtr[i]);
  95.   }
  96.   no_rec_++;
  97.   if(no_rec_ >= blobs_to_rec_){
  98.     printf("  Sink unsubscribesn");
  99.     dr_->unsubscribe(rmst_handle_);
  100.   }
  101. }
  102. handle RmstSink::setupInterest()
  103. {
  104.   NRAttrVec attrs;
  105.   printf("RMST-SNK::subscribing to all PCM_SAMPLEsn");
  106.   attrs.push_back(NRClassAttr.make(NRAttribute::IS, NRAttribute::INTEREST_CLASS));
  107.   attrs.push_back(RmstTsprtCtlAttr.make(NRAttribute::EQ, RMST_RESP));
  108.   attrs.push_back(RmstTargetAttr.make(NRAttribute::EQ, "PCM_SAMPLE"));
  109.   handle h = dr_->subscribe(&attrs, mr);
  110.   ClearAttrs(&attrs);
  111.   return h;
  112. }
  113. #ifdef NS_DIFFUSION
  114. RmstSink::RmstSink() : blobs_to_rec_(4) {
  115. #else
  116. RmstSink::RmstSink(int argc, char **argv) : blobs_to_rec_(4) {
  117. #endif // NS_DIFFUSION
  118.   
  119.   mr = new RmstSnkReceive(this);  
  120.   
  121. #ifndef NS_DIFFUSION
  122.   parseCommandLine(argc, argv);
  123.   dr_ = NR::createNR(diffusion_port_);
  124. #endif // !NS_DIFFUSION
  125.   no_rec_ = 0;
  126. }
  127. #ifndef NS_DIFFUSION
  128. int main(int argc, char **argv){
  129.   RmstSink *app;
  130.   app = new RmstSink(argc, argv);
  131.   app->run();
  132.   return 0;
  133. }
  134. #endif // !NS_DIFFUSION