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

通讯编程

开发平台:

Visual C++

  1. //
  2. // rmst_source.cc  : RmstSource Class Methods
  3. // authors         : Fred Stann
  4. //
  5. // Copyright (C) 2003 by the University of Southern California
  6. // $Id: rmst_source.cc,v 1.4 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 "rmst_source.hh"
  43. #include <unistd.h>
  44. #ifdef NS_DIFFUSION
  45. static class RmstSrcClass : public TclClass {
  46. public:
  47.   RmstSrcClass() : TclClass("Application/DiffApp/RmstSource") {}
  48.     TclObject* create(int , const char*const* ) {
  49.     return(new RmstSource());
  50.     }
  51. } class_rmst_source;
  52. void RmstSendDataTimer::expire(Event *e) {
  53.   a_->send();
  54. }
  55. void RmstSource::send()
  56. {
  57.   int sleep_interval;
  58.   bool sent_first_blob = false;
  59.   if (num_subscriptions_ > 0){
  60.       if (!sent_first_blob){
  61.         sendBlob();
  62.         sent_first_blob = true;
  63.         sleep_interval = 100;
  64.       }
  65.       else
  66.         printf("RMST-SRC::sees subscriptionsn");
  67.     }
  68.     else{
  69.       printf("RMST-SRC::sees no subscriptionsn");
  70.       sleep_interval = 10;
  71.     }
  72.   // re-schedule the timer 
  73.   sdt_.resched(sleep_interval);
  74. }
  75. int RmstSource::command(int argc, const char*const* argv) 
  76. {
  77.   if (argc == 2) {
  78.     if (strcmp(argv[1], "subscribe") == 0) {
  79.       run();
  80.       return TCL_OK;
  81.     }
  82.    }
  83.   return DiffApp::command(argc, argv);
  84. }
  85. #endif // NS_DIFFUSION
  86. void RmstSrcReceive::recv(NRAttrVec *data, NR::handle my_handle)
  87. {
  88.   NRSimpleAttribute<char*> *rmst_target_attr = NULL;
  89.   NRSimpleAttribute<int> *nr_class = NULL;
  90.   NRSimpleAttribute<int> *tsprt_ctl_attr = NULL;
  91.   timeval cur_time;
  92.   printf("RMST-SRC::recv got an attr vector.");
  93.   GetTime(&cur_time);
  94.   printf("  time: sec = %dn", (unsigned int) cur_time.tv_sec);
  95.   nr_class = NRClassAttr.find(data);
  96.   tsprt_ctl_attr = RmstTsprtCtlAttr.find(data);
  97.   if (nr_class){
  98.     switch (nr_class->getVal()){
  99.     case NRAttribute::INTEREST_CLASS:
  100.       if (tsprt_ctl_attr && (tsprt_ctl_attr->getVal() == RMST_RESP)){
  101.         printf("  Source received an INTEREST messagen");
  102.         src_->num_subscriptions_++;
  103.       }
  104.       break;
  105.     case NRAttribute::DISINTEREST_CLASS:
  106.       src_->num_subscriptions_--;
  107.       rmst_target_attr = RmstTargetAttr.find(data);
  108.       if (rmst_target_attr){
  109.         printf("  Source received a DISINTEREST for %sn",
  110.             rmst_target_attr->getVal());
  111.       }
  112.       else
  113.         printf("  Source received a Disinterest message for unknown Interest!n");
  114.       break;
  115.     default:
  116.       printf("  Source received an unknown or inappropriate class!(%d)!n",
  117.           nr_class->getVal());
  118.       break;
  119.     }
  120.   }
  121.   if (tsprt_ctl_attr){
  122.     switch (tsprt_ctl_attr->getVal()){
  123.     case RMST_RESP:
  124.       break;
  125.     case RMST_CONT:
  126.       printf("  Source received a RMST_CONT messagen");
  127.       if(src_->blobs_to_send_ > 0){
  128.         printf ("  Source sending another blobn");
  129.         src_->sendBlob();
  130.       }
  131.       else
  132.         printf ("  Source done sending blobsn");
  133.       break;
  134.     default:
  135.       printf("  Source received an unexpected RmstTsprtCtlAttr (%d)!n",
  136.            tsprt_ctl_attr->getVal());
  137.       break;
  138.     }
  139.   }
  140. }
  141. #ifdef NS_DIFFUSION
  142. RmstSource::RmstSource() : blobs_to_send_(4), sdt_(this)
  143. #else
  144. RmstSource::RmstSource(int argc, char **argv) : blobs_to_send_(4)
  145. #endif // NS_DIFFUSION
  146. {
  147.   mr = new RmstSrcReceive(this);
  148. #ifndef NS_DIFFUSION
  149.   parseCommandLine(argc, argv);
  150.   dr_ = NR::createNR(diffusion_port_);
  151. #endif // NS_DIFFUSION
  152.   
  153.   ck_val_ = 100;
  154. }
  155. #ifndef NS_DIFFUSION
  156. int main(int argc, char **argv)
  157. {
  158.   RmstSource *app;
  159.   app = new RmstSource(argc, argv);
  160.   app->run();
  161.   return 0;
  162. }
  163. #endif // NS_DIFFUSION
  164. void RmstSource::run()
  165. {
  166. #ifndef NS_DIFFUSION
  167.   int sleep_interval;
  168.   bool sent_first_blob = false;
  169. #endif // !NS_DIFFUSION
  170.   
  171.   // Let diffusion know what kinds of interests we "latch." 
  172.   subscribe_handle_ = setupRmstInterest();
  173.   // Let diffusion know what we intend to publish.
  174.   send_handle_ = setupRmstPublication();
  175. #ifndef NS_DIFFUSION
  176.   while(1){
  177.     if (num_subscriptions_ > 0){
  178.       if (!sent_first_blob){
  179.         sendBlob();
  180.         sent_first_blob = true;
  181.         sleep_interval = 100;
  182.       }
  183.       else
  184.         printf("RMST-SRC::sees subscriptionsn");
  185.     }
  186.     else{
  187.       printf("RMST-SRC::sees no subscriptionsn");
  188.       sleep_interval = 10;
  189.     }
  190.     sleep(sleep_interval);
  191.   } //while loop
  192. #else
  193.   send();
  194. #endif // !NS_DIFFUSION
  195. }
  196. handle RmstSource::setupRmstInterest()
  197. {
  198.   NRAttrVec attrs;
  199.   printf("RMST-SRC::sets up local subscription for PCM_SAMPLEsn");
  200.   attrs.push_back(NRClassAttr.make(NRAttribute::NE, NRAttribute::DATA_CLASS));
  201.   attrs.push_back(NRScopeAttr.make(NRAttribute::IS,
  202.    NRAttribute::NODE_LOCAL_SCOPE));
  203.   attrs.push_back(RmstTargetAttr.make(NRAttribute::IS, "PCM_SAMPLE"));
  204.   attrs.push_back(RmstTsprtCtlAttr.make(NRAttribute::IS, RMST_RESP));
  205.   attrs.push_back(RmstTsprtCtlAttr.make(NRAttribute::IS, RMST_CONT));
  206.   handle h = dr_->subscribe(&attrs, mr);
  207.   ClearAttrs(&attrs);
  208.   return h;
  209. }
  210. handle RmstSource::setupRmstPublication()
  211. {
  212.   NRAttrVec attrs;
  213.   printf("RMST-SRC::publishes PCM_SAMPLEn");
  214.   attrs.push_back(NRClassAttr.make(NRAttribute::IS, NRAttribute::DATA_CLASS));
  215.   attrs.push_back(RmstTargetAttr.make(NRAttribute::IS, "PCM_SAMPLE"));
  216.   handle h = dr_->publish(&attrs);
  217.   ClearAttrs(&attrs);
  218.   return h;
  219. }
  220. char* RmstSource::createBlob (int ck_val)
  221. {
  222.   char *tmpPtr = new char[2500];
  223.   for (int i = 0; i < 50; i++){
  224.     sprintf(&tmpPtr[i*50], "PCM FragNo: %d of ck_val %d", i, ck_val); 
  225.   }
  226.   return tmpPtr;
  227. }
  228. void RmstSource::sendBlob() {
  229.   char *blob;
  230.   int retval;
  231.   NRAttrVec src_attrs;
  232.   // Retrieve rmsb from the local cache to get pointer to it.
  233.   blob = createBlob(ck_val_);
  234.   ck_val_++;
  235.   src_attrs.push_back(RmstDataAttr.make(NRAttribute::IS, blob, 2500));
  236.   retval = ((DiffusionRouting *)dr_)->sendRmst(send_handle_,
  237.        &src_attrs, PAYLOAD_SIZE);
  238.   blobs_to_send_--;
  239.   delete blob;
  240. }