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

通讯编程

开发平台:

Visual C++

  1. #include "tp.h"
  2. #include "rtp.h"
  3. #include "random.h"
  4. #include "address.h"
  5. #include "ip.h"
  6. static class TPAgentClass : public TclClass {
  7. public:
  8. TPAgentClass() : TclClass("Agent/TP") {}
  9. TclObject* create(int, const char*const*) {
  10. return (new TPAgent());
  11. }
  12. } class_tp_agent;
  13. TPAgent::TPAgent() : Agent(PT_MESSAGE), seqno_(-1) {
  14.   size_ = 2000;
  15. }
  16. TPAgent::TPAgent(packet_t type) : Agent(type) {
  17.   //bind("packetSize_", &size_);
  18. }
  19. void TPAgent::sendto(int nbytes, unsigned int saddr, int sport, unsigned int daddr, int dport) {
  20.   double local_time = Scheduler::instance().clock();
  21.   printf("send %f %u %d %u %d %dn",
  22.    local_time, saddr, sport, daddr, dport, nbytes);
  23.   if (nbytes == -1) {
  24.     printf("Error: packet size for TPAgent should not be -1n");
  25.     return;
  26.   }
  27.   
  28.   // check packet size (we don't fragment packets)
  29.   if (nbytes > size_) {
  30.     printf("Error: packet greater than maximum TPAgent packet sizen");
  31.     return;
  32.   }
  33.   
  34.   Packet *p = allocpkt();
  35.   // fill IP header
  36.   hdr_ip* iph = hdr_ip::access(p);
  37.   iph->saddr() = saddr;
  38.   iph->sport() = sport;
  39.   iph->daddr() = daddr;
  40.   iph->dport() = dport;
  41.   hdr_cmn::access(p)->size() = nbytes;
  42.   hdr_rtp* rh = hdr_rtp::access(p);
  43.   rh->flags() = 0;
  44.   rh->seqno() = ++seqno_;
  45.   
  46.   hdr_cmn::access(p)->timestamp() = 
  47.     (u_int32_t)(SAMPLERATE*local_time);
  48.   target_->recv(p);
  49.   idle();
  50. }
  51. void TPAgent::recv(Packet* pkt, Handler*) {
  52.   if (app_ ) {
  53.     // If an application is attached, pass the data to the app
  54.     hdr_cmn* h = hdr_cmn::access(pkt);
  55.     app_->process_data(h->size(), pkt->userdata());
  56.   }
  57.   hdr_ip* iph = hdr_ip::access(pkt);
  58.   printf("recv %f %d %u %d %u %d %dn",
  59.          Scheduler::instance().clock(), addr(),
  60.          iph->saddr(), iph->sport(),
  61.          iph->daddr(), iph->dport(),
  62.          hdr_cmn::access(pkt)->size());
  63.   // recyle packets received
  64.   Packet::free(pkt);
  65. }
  66. int TPAgent::command(int argc, const char*const* argv) {
  67.   if (argc == 7) {
  68.     if (strcmp(argv[1], "sendto") == 0) {
  69.       sendto(atoi(argv[6]), atoi(argv[2]), atoi(argv[3]),
  70.              atoi(argv[4]), atoi(argv[5]));
  71.       return TCL_OK;
  72.     }
  73.   }
  74.   
  75.   return (Agent::command(argc, argv));
  76. }