proxyudp
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:9k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #!/usr/bin/perl
  2. # ====================================================================
  3. # The Vovida Software License, Version 1.0 
  4. # Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5. # Redistribution and use in source and binary forms, with or without
  6. # modification, are permitted provided that the following conditions
  7. # are met:
  8. # 1. Redistributions of source code must retain the above copyright
  9. #    notice, this list of conditions and the following disclaimer.
  10. # 2. Redistributions in binary form must reproduce the above copyright
  11. #    notice, this list of conditions and the following disclaimer in
  12. #    the documentation and/or other materials provided with the
  13. #    distribution.
  14. # 3. The names "VOCAL", "Vovida Open Communication Application Library",
  15. #    and "Vovida Open Communication Application Library (VOCAL)" must
  16. #    not be used to endorse or promote products derived from this
  17. #    software without prior written permission. For written
  18. #    permission, please contact vocal@vovida.org.
  19. # 4. Products derived from this software may not be called "VOCAL", nor
  20. #    may "VOCAL" appear in their name, without prior written
  21. #    permission of Vovida Networks, Inc.
  22. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  23. # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  24. # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  25. # NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  26. # NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  27. # IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  28. # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  29. # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  30. # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  31. # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  32. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  33. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  34. # DAMAGE.
  35. # ====================================================================
  36. # This software consists of voluntary contributions made by Vovida
  37. # Networks, Inc. and many individuals on behalf of Vovida Networks,
  38. # Inc.  For more information on Vovida Networks, Inc., please see
  39. # <http://www.vovida.org/>.
  40. use Socket;
  41. require "getopts.pl";
  42. &Getopts("n:");
  43. $number = $opt_n;
  44. if($#ARGV < 1) {
  45.   print "Usage:n";
  46.   print "$0 host1:<local_port1>:<remote_port1> host2:<local_port2>:<remote_port2> [filter_file]n";
  47.   exit(-1);
  48. }
  49. open(F, $ARGV[0]);
  50. while(<F>) {
  51.   chomp;
  52.   if(/^listener/) {
  53.     #listener  name        port     filter            default-sender
  54.     ($file, $in_name, $in_port, $in_filter_name, $in_default_sender) = split(/s+/);
  55.     &mksocket($in_port, "IN_$in_name");
  56.     $in_port{$in_name} = $in_port;
  57.     $in_filter{$in_name} = $in_filter_name;
  58.     $in_sender{$in_name} = $in_default_sender;
  59.     
  60.   } elsif(/^sender/) {
  61.     #sender   sender-name   destination-ip   destination-port   listener-name
  62.     ($file, $in_name, $in_port, $in_filter_name, $in_default_sender) = split(/s+/);
  63.   }
  64. }
  65. close(F);
  66. ($host1, $local_port1, $remote_port1) = split(/:/, $ARGV[0]);
  67. ($host2, $local_port2, $remote_port2) = split(/:/, $ARGV[1]);
  68. &mksocket($local_port1, S1);
  69. &mksocket($local_port2, S2);
  70. ($name,$aliases,$type,$len,$host1_addr) = gethostbyname($host1);
  71. ($name,$aliases,$type,$len,$host2_addr) = gethostbyname($host2);
  72. $them_S1 = pack($sockaddr,PF_INET, $remote_port1, $host1_addr);
  73. $them_S2 = pack($sockaddr,PF_INET, $remote_port2, $host2_addr);
  74. ($name,$aliases,$type,$len,$host3_addr) = gethostbyname("192.168.10.12");
  75. $them_agent1 = pack($sockaddr,PF_INET, "5010", $host3_addr);
  76. $them_agent2= pack($sockaddr,PF_INET, "5011", $host3_addr);
  77. sub mksocket {
  78.   local($port, $socket) = @_;
  79.   
  80.   $sockaddr = "S n a4 x8";($name,$aliases,$proto) = getprotobyname('udp');
  81.   chomp($hostname  = `hostname`);
  82.   #$hostname  = "192.168.10.12";
  83.   
  84.   ($name,$aliases,$type,$len,$myaddr) = gethostbyname($hostname);
  85.   
  86.   $me   = pack($sockaddr,PF_INET, $port, $myaddr);
  87.   
  88. #  print "myaddr: $myaddrn";
  89. #  print "port: $portn";
  90.   
  91.   socket($socket, PF_INET, SOCK_DGRAM, $proto) || die $!;
  92.   bind($socket , $me) || die "died with port $port $!";
  93.   
  94. }
  95. while(1) {
  96.   $rin = '';
  97.   vec($rin, fileno(S1), 1) = 1;
  98.   vec($rin, fileno(S2), 1) = 1;
  99.   #        @bits = split(//, unpack("b*", $rin));
  100.   # if($bits[fileno(S)]) {
  101.   # print "got Sn";
  102.   # }
  103.   if(select($rin, undef, undef, undef)) {
  104.     @bits = split(//, unpack("b*", $rin));
  105.     undef($data);
  106.     undef($new_data);
  107.     if($bits[fileno(S1)]) {
  108.       print "got S1n";
  109.       $data = "";
  110.       $his_address = recv(S1, $data, 60000, 0);
  111.       if($data) {
  112. print "-----------------------------n";
  113. print "$data";
  114. print "-----------------------------n";
  115.         $new_data = &rewrite_S1($data);
  116.         if($new_data) {
  117.   print "$new_data";
  118.   print "-----------------------------n";
  119.   defined(send(S2,$new_data,0,$them_S1)) || die $!;
  120.         }
  121.       }
  122.     } elsif($bits[fileno(S2)]) {
  123.       print "got S2n";
  124.       $data = "";
  125.       $his_address = recv(S2, $data, 60000, 0);
  126.       if($data) {
  127. print "-----------------------------n";
  128. print "$data";
  129. print "-----------------------------n";
  130.         $new_data = &rewrite_S2($data);
  131.         if($new_data) {
  132.   print "$new_data";
  133.   print "-----------------------------n";
  134.   defined(send(S1,$new_data,0,$them_S2)) || die $!;
  135.         }
  136.       }
  137.     }
  138.   }
  139. }
  140. #$them = pack($sockaddr,PF_INET, $port, $myaddr);
  141. #send(S,$msg,0,$them) || die $!;
  142. sub renumber_S2 {
  143.   local($_) = $_[0];
  144.   
  145.   s/^([0-9]*)s([0-9]*)s/$1 $map{$2} /;
  146.   $map{$number} = $2;
  147.   
  148.   
  149.   return $_;
  150. }
  151. sub renumber_S1 {
  152.   local($_) = $_[0];
  153.   if(s/^([a-zA-Z]*)s([0-9]*)s/$1 $number /) {
  154.     $map{$number} = $2;
  155.     $number++;
  156.   }
  157.   return $_;
  158. }
  159. sub rewrite_S1 {
  160.   local($_) = $_[0];
  161.   s/auep/AUEP/;
  162.   s/rqnt/RQNT/;
  163.   s/crcx/CRCX/;
  164.   s/mdcx/MDCX/;
  165.   s/dlcx/DLCX/;
  166.   s/mgcp/MGCP/;
  167.   s/MGCP 0.1/MGCP 0.1 NCS 1.0/;
  168.   s/testID/aaln/1@vovida.com/;
  169.   s/d/x(d)/[0-9*#T](D), T(N)/;
  170.   s/nd:.*/nD: (x)/;
  171.   s/,/, /g;
  172.   s/l/hf(n), //;
  173. #  s/nr:.*//;
  174. #  s/nd:.*//;
  175. #  s/l/dl/dl/;
  176. #  s/(ns:.*)//;
  177. #  $s_param = $1;
  178. #  s/(nx:.*)/$1$s_param/;
  179.   return $_;
  180. }
  181. sub rewrite_S2 {
  182.   local($_) = $_[0];
  183.   local($nosend) = 0;
  184.   
  185.   if(s/^nosend //) {
  186.     $nosend = 1;
  187.   }
  188.   
  189.   s/o=.*ns=.*n//;
  190.   s/v=0/nv=0/;
  191.   s/aaln/*@vovida.com/testid/;
  192.   s/aaln/1@vovida.com/testid/;
  193.   s/ NCS 1.0//;
  194.   #    $_ = &renumber_S1($_);
  195.   
  196.   if(/^([a-z]{4,4})s+([0-9]+)/i) {
  197.     $x = $2;
  198.     print "sawn";
  199.     if(/ep0/) {
  200.       print "got: $xn";
  201.       $host{$x} = 1;
  202.     }
  203.     if(/ep1/) {
  204.       print "got: $xn";
  205.       $host{$x} = 2;
  206.     }
  207.   }
  208.   
  209.   if(/^([0-9]*) ([0-9]*)/) {
  210.     if($fake{$2}) {
  211.       print " xx faken";
  212.       $_ = "";
  213.     }
  214.   }
  215.   
  216.   if(/^auep ([0-9]+)/) {
  217.     $ti = $1;
  218.     $_ = "200 $ti oknn";
  219.     if(/ep1/) {
  220.       defined(send(S2,$_,0,$them_agent1)) || die $!;
  221.     } elsif(/ep2/) {
  222.       defined(send(S2,$_,0,$them_agent2)) || die $!;
  223.     }
  224.   }
  225.   if(/^mdcx/i) {
  226.     print "got mdcxn";
  227.     if(/ep1/i) {
  228.       $eid = "gw0/ep1@gg1.sylantro.com";
  229.     } elsif(/ep2/i) {
  230.       $eid = "gw0/ep2@gg1.sylantro.com";
  231.     }
  232.     
  233.     $xyz = "RQNT 8088 $eid MGCP 0.1nr: l/hu(n)nx: 7072n";
  234.     print "fake-sending $xyz";
  235.     
  236.     defined(send(S1,$xyz,0,$them_S2)) || die $!;
  237.   }
  238.   
  239.   
  240.   s/auep/AUEP/;
  241.   s/rqnt/RQNT/;
  242.   s/crcx/CRCX/;
  243.   s/mdcx/MDCX/;
  244.   s/dlcx/DLCX/;
  245.   s/mgcp/MGCP/;
  246.   s/*/ep1/;
  247.   
  248.   s/nO:/nO: /i;
  249.   s/nX:/nX: /i;
  250.   s/hd/l/hd/;
  251.   s/hu/l/hu/;
  252.   s/,l/hf(n)//ig;
  253.   if(y///d) {
  254.     print "killed \0!n";
  255.   }
  256.   
  257.   s/ns+n/nn/g;
  258.   y/r//d;
  259.   s/n+$/n/;
  260.   s/nn$/n/g;
  261.   #    s/n+/n/g; 
  262.   s/n/rn/g;
  263.   if(s/([^rn])(rn)+$/$1rn/g) {
  264.     print "2 ate \r\nn";
  265.   }
  266.   
  267.   if(/^rqnt/i) {
  268.     s/,d/x(n)//i;
  269.    }
  270.    if(/^crcx/i) {
  271. if(!/v=0/i) {
  272. s/sendrecv/recvonly/;
  273. }
  274.    }
  275.   s/ep1@vovida.com/testid@newton.private.vovida.com/;
  276.   s/RM:restart//;
  277.    if($nosend) {
  278. print "nosend:n$_----------n";
  279. $_ = "";
  280.     }
  281.     return $_;
  282. }
  283. __END__
  284.   
  285.   #    $_ = &renumber_S2($_);
  286.   
  287.   s/nO: hd/nO: l/hd/;
  288.   s/nO: hu/nO: l/hu/;
  289.   s/auep/AUEP/;
  290.   s/rqnt/RQNT/;
  291.   s/crcx/CRCX/;
  292.   s/mdcx/MDCX/;
  293.   s/dlcx/DLCX/;
  294.   s/mgcp/MGCP/;
  295.   
  296.   
  297.   if(/c=in ip4 ([0-9.]+)/i) {
  298.     $x = $1;
  299.     s/(v=0.*n)/$1o=- 0 0 in ip4 $xns=Vovida Gatewayn/i;
  300.   }
  301.   s/(m=.*n)/$1n/i;
  302.   
  303.   if(/^fake [a-zA-Z]+ ([0-9]+)/i) {
  304.     $fake{$1} = 1;
  305.     s/^fake //;
  306.   }
  307.   
  308.   
  309. #  y/A-Z/a-z/;
  310.   
  311.   s#r##g;
  312.   
  313.   if(/ep0@/) {
  314.     print "sending port 1:n$_----------";
  315.     defined(send(S2,$_,0,$them_agent1)) || die $!;
  316.   } elsif(/ep1@/) {
  317.     print "sending port 2:n$_----------";
  318.     defined(send(S2,$_,0,$them_agent2)) || die $!;
  319.   }
  320.   
  321.   if(/^[0-9]/)  {
  322.     /^([0-9]+)s+([0-9]+)s/;
  323.     print "xyz $2n";
  324.     if($host{$2} == 1) {
  325.       print "tar: $host{$2}n";
  326.       defined(send(S2,$_,0,$them_agent1)) || die $!;
  327.     }
  328.     if($host{$2} == 2) {
  329.       print "tar: $host{$2}n";
  330.       defined(send(S2,$_,0,$them_agent2)) || die $!;
  331.     }
  332.     
  333.   }
  334.   $_ = "";