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

通讯编程

开发平台:

Visual C++

  1. #ifndef lint
  2. static const char rcsid[] =
  3.     "@(#) $Header: /cvsroot/nsnam/ns-2/common/messpass.cc,v 1.3 2003/11/27 23:27:19 xuanc Exp $";
  4. #endif
  5. #include "messpass.h"
  6. #include "rtp.h"
  7. #include "random.h"
  8. #include "address.h"
  9. #include "ip.h"
  10. static class MessagePassingAgentClass : public TclClass {
  11. public:
  12. MessagePassingAgentClass() : TclClass("Agent/MessagePassing") {}
  13. TclObject* create(int, const char*const*) {
  14. return (new MessagePassingAgent());
  15. }
  16. } class_message_passing_agent;
  17. MessagePassingAgent::MessagePassingAgent() : Agent(PT_MESSAGE), seqno_(-1)
  18. {
  19. bind("packetSize_", &size_);
  20. }
  21. MessagePassingAgent::MessagePassingAgent(packet_t type) : Agent(type)
  22. {
  23. bind("packetSize_", &size_);
  24. }
  25. void MessagePassingAgent::sendmsg(int nbytes, AppData* data, const char* flags)
  26. {
  27. Packet *p;
  28. if (nbytes == -1) {
  29. printf("Error:  sendmsg() for MessagePassingAgent should not be -1n");
  30. return;
  31. }
  32. // check packet size (we don't fragment packets)
  33. if (nbytes > size_) {
  34. printf("Error: packet greater than maximum MessagePassingAgent packet sizen");
  35. return;
  36. }
  37. double local_time = Scheduler::instance().clock();
  38. p = allocpkt();
  39. hdr_cmn::access(p)->size() = nbytes;
  40. hdr_rtp* rh = hdr_rtp::access(p);
  41. rh->flags() = 0;
  42. rh->seqno() = ++seqno_;
  43. hdr_cmn::access(p)->timestamp() = 
  44.     (u_int32_t)(SAMPLERATE*local_time);
  45. p->setdata(data);
  46. target_->recv(p);
  47. idle();
  48. }
  49. void MessagePassingAgent::sendto(int nbytes, AppData *data, const char* flags, ns_addr_t dst)
  50. {
  51. Packet *p;
  52. if (nbytes == -1) {
  53. printf("Error: packet size for MessagePassingAgent should not be -1n");
  54. return;
  55. }
  56. // check packet size (we don't fragment packets)
  57. if (nbytes > size_) {
  58. printf("Error: packet greater than maximum MessagePassingAgent packet sizen");
  59. return;
  60. }
  61. double local_time = Scheduler::instance().clock();
  62. p = allocpkt();
  63. hdr_ip* iph = hdr_ip::access(p);
  64. iph->daddr() = dst.addr_;
  65. iph->dport() = dst.port_;
  66. hdr_cmn::access(p)->size() = nbytes;
  67. hdr_rtp* rh = hdr_rtp::access(p);
  68. rh->flags() = 0;
  69. rh->seqno() = ++seqno_;
  70. hdr_cmn::access(p)->timestamp() = 
  71.     (u_int32_t)(SAMPLERATE*local_time);
  72. p->setdata(data);
  73. target_->recv(p);
  74. idle();
  75. }
  76. void MessagePassingAgent::recv(Packet* pkt, Handler*)
  77. {
  78. if (app_ ) {
  79. // If an application is attached, pass the data to the app
  80. hdr_cmn* h = hdr_cmn::access(pkt);
  81. app_->process_data(h->size(), pkt->userdata());
  82. } else if (pkt->userdata() && pkt->userdata()->type() == PACKET_DATA) {
  83. // otherwise if it's just PacketData, pass it to Tcl
  84. PacketData* data = (PacketData*)pkt->userdata();
  85. hdr_ip* iph = hdr_ip::access(pkt);
  86.                 Tcl& tcl = Tcl::instance();
  87. tcl.evalf("%s recv %d %d %d {%s}", name(),
  88.   iph->saddr(), iph->sport(),
  89.   hdr_cmn::access(pkt)->size(), data->data());
  90. } else {
  91. // It wasn't PacketData, or userdata() was NULL
  92. // so pass an empty string to Tcl
  93. hdr_ip* iph = hdr_ip::access(pkt);
  94.                 Tcl& tcl = Tcl::instance();
  95. tcl.evalf("%s recv %d %d %d {}", name(),
  96.   iph->saddr(), iph->sport(),
  97.   hdr_cmn::access(pkt)->size());
  98. }
  99. Packet::free(pkt);
  100. }
  101. int MessagePassingAgent::command(int argc, const char*const* argv)
  102. {
  103. PacketData* data;
  104. ns_addr_t dst;
  105. if (argc == 4) {
  106. if (strcmp(argv[1], "send") == 0) {
  107. data = new PacketData(1 + strlen(argv[3]));
  108. strcpy((char*)data->data(), argv[3]);
  109. sendmsg(atoi(argv[2]), data);
  110. return TCL_OK;
  111. }
  112. } else if (argc == 5) {
  113. if (strcmp(argv[1], "sendmsg") == 0) {
  114. data = new PacketData(1 + strlen(argv[3]));
  115. strcpy((char*)data->data(), argv[3]);
  116. sendmsg(atoi(argv[2]), data, argv[4]);
  117. return TCL_OK;
  118. } else if (strcmp(argv[1], "sendto") == 0) {
  119. dst.addr_ = atoi(argv[3]);
  120. dst.port_ = atoi(argv[4]);
  121. if (dst.port_ == 0) dst.port_ = here_.port_;
  122. sendto(atoi(argv[2]), 0, dst);
  123. return TCL_OK;
  124. }
  125. } else if (argc == 6) {
  126. if (strcmp(argv[1], "sendto") == 0) {
  127. data = new PacketData(1 + strlen(argv[3]));
  128. strcpy((char*)data->data(), argv[3]);
  129. dst.addr_ = atoi(argv[4]);
  130. dst.port_ = atoi(argv[5]);
  131. if (dst.port_ == 0) dst.port_ = here_.port_;
  132. sendto(atoi(argv[2]), data, 0, dst);
  133. return TCL_OK;
  134. } else if (strcmp(argv[1], "sendmsgto") == 0) {
  135. dst.addr_ = atoi(argv[3]);
  136. dst.port_ = atoi(argv[4]);
  137. if (dst.port_ == 0) dst.port_ = here_.port_;
  138. sendto(atoi(argv[2]), argv[5], dst);
  139. return TCL_OK;
  140. }
  141. } else if (argc == 7) {
  142. if (strcmp(argv[1], "sendmsgto") == 0) {
  143. data = new PacketData(1 + strlen(argv[3]));
  144. strcpy((char*)data->data(), argv[3]);
  145. dst.addr_ = atoi(argv[4]);
  146. dst.port_ = atoi(argv[5]);
  147. if (dst.port_ == 0) dst.port_ = here_.port_;
  148. sendto(atoi(argv[2]), argv[6], dst);
  149. return TCL_OK;
  150. }}
  151. return (Agent::command(argc, argv));
  152. }