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

流媒体/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 a:b:c d:e:f gn";
  47.   print "where,n";
  48.   print "a = agent host e.g. 192.168.5.1n";
  49.   print "b = gateway sends to this port e.g. 2427n";
  50.   print "c = agent listens to this port e.g. 5010n";
  51.   print "d = gateway host e.g. 192.168.5.171n";
  52.   print "e = agent sends to this port e.g. 5050n";
  53.   print "f = gateway listens to this port e.g. 2427n";
  54.   print "g = filter filen";
  55.   print "e.g.n$0 192.168.5.1:2427:5011 192.168.5.171:5051:2427n";
  56.   print "$0 192.168.5.1:2427:5012 192.168.5.171:5052:2427n";
  57.   exit(-1);
  58. }
  59. open(F, $ARGV[0]);
  60. while(<F>) {
  61.   chomp;
  62.   if(/^listener/) {
  63.     #listener  name        port     filter            default-sender
  64.     ($file, $in_name, $in_port, $in_filter_name, $in_default_sender) = split(/s+/);
  65.     &mksocket($in_port, "IN_$in_name");
  66.     $in_port{$in_name} = $in_port;
  67.     $in_filter{$in_name} = $in_filter_name;
  68.     $in_sender{$in_name} = $in_default_sender;
  69.     
  70.   } elsif(/^sender/) {
  71.     #sender   sender-name   destination-ip   destination-port   listener-name
  72.     ($file, $in_name, $in_port, $in_filter_name, $in_default_sender) = split(/s+/);
  73.   }
  74. }
  75. close(F);
  76. ($host1, $local_port1, $remote_port1) = split(/:/, $ARGV[0]);
  77. ($host2, $local_port2, $remote_port2) = split(/:/, $ARGV[1]);
  78. &mksocket($local_port1, S1);
  79. &mksocket($local_port2, S2);
  80. ($name,$aliases,$type,$len,$host1_addr) = gethostbyname($host1);
  81. ($name,$aliases,$type,$len,$host2_addr) = gethostbyname($host2);
  82. $them_S1 = pack($sockaddr,PF_INET, $remote_port1, $host1_addr);
  83. $them_S2 = pack($sockaddr,PF_INET, $remote_port2, $host2_addr);
  84. # ($name,$aliases,$type,$len,$host3_addr) = gethostbyname("192.168.5.1");
  85. # $them_agent1 = pack($sockaddr,PF_INET, "5012", $host3_addr);
  86. # $them_agent2= pack($sockaddr,PF_INET, "5011", $host3_addr);
  87. sub mksocket {
  88.   local($port, $socket) = @_;
  89.   
  90.   $sockaddr = "S n a4 x8";($name,$aliases,$proto) = getprotobyname('udp');
  91.   chomp($hostname  = `hostname`);
  92.   #$hostname  = "192.168.10.12";
  93.   
  94.   ($name,$aliases,$type,$len,$myaddr) = gethostbyname($hostname);
  95.   
  96.   $me   = pack($sockaddr,PF_INET, $port, $myaddr);
  97.   
  98.   print "myaddr: $myaddrn";
  99.   print "port: $portn";
  100.   
  101.   socket($socket, PF_INET, SOCK_DGRAM, $proto) || die $!;
  102.   bind($socket , $me) || die "died with port $port $!";
  103.   
  104. }
  105. while(1) {
  106.   $rin = '';
  107.   vec($rin, fileno(S1), 1) = 1;
  108.   vec($rin, fileno(S2), 1) = 1;
  109.   #        @bits = split(//, unpack("b*", $rin));
  110.   # if($bits[fileno(S)]) {
  111.   # print "got Sn";
  112.   # }
  113.   if(select($rin, undef, undef, undef)) {
  114.     @bits = split(//, unpack("b*", $rin));
  115.     undef($data);
  116.     undef($new_data);
  117.     if($bits[fileno(S1)]) {
  118.       print "got S1n";
  119.       $data = "";
  120.       $his_address = recv(S1, $data, 60000, 0);
  121.       if($data) {
  122. print "-----------------------------n";
  123. print "$data";
  124. print "-----------------------------n";
  125.         $new_data = &rewrite_S1($data);
  126.         if($new_data) {
  127.   print "$new_data";
  128.   print "-----------------------------n";
  129.   defined(send(S2,$new_data,0,$them_S1)) || die $!;
  130.         }
  131.       }
  132.     } elsif($bits[fileno(S2)]) {
  133.       print "got S2n";
  134.       $data = "";
  135.       $his_address = recv(S2, $data, 60000, 0);
  136.       if($data) {
  137. print "-----------------------------n";
  138. print "$data";
  139. print "-----------------------------n";
  140.         $new_data = &rewrite_S2($data);
  141.         if($new_data) {
  142.   print "$new_data";
  143.   print "-----------------------------n";
  144.   defined(send(S1,$new_data,0,$them_S2)) || die $!;
  145.         }
  146.       }
  147.     }
  148.   }
  149. }
  150. #$them = pack($sockaddr,PF_INET, $port, $myaddr);
  151. #send(S,$msg,0,$them) || die $!;
  152. sub renumber_S2 {
  153.   local($_) = $_[0];
  154.   
  155.   s/^([0-9]*)s([0-9]*)s/$1 $map{$2} /;
  156.   $map{$number} = $2;
  157.   
  158.   return $_;
  159. }
  160. sub renumber_S1 {
  161.   local($_) = $_[0];
  162.   if(s/^([a-zA-Z]*)s([0-9]*)s/$1 $number /) {
  163.     $map{$number} = $2;
  164.     $number++;
  165.   }
  166.   return $_;
  167. }
  168. # incoming messages to the call agent
  169. sub rewrite_S1
  170. {
  171.   local($_) = $_[0];
  172. #  if(y///d) {
  173. #    print "killed \0!n";
  174. #  }
  175.   # pretend a wild card is actually for the first endpoint
  176. #  s/*@ubr/aaln/0@ubr/;
  177.   # Use _ instead of / due to parsing problems (also change ubr924 to galileo)
  178.   s/*@ubr924/aaln_0@galileo/;
  179. #  s/aaln/0@ubr924/aaln_0@galileo/g;
  180.   s/aaln/([0-1])@ubr924/aaln_1@galileo/g;
  181.   # split up dialed digits
  182. #  s/O: D/9/o: d/5,d/0,d/0,d//;
  183.   s/O: D/9([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])/o: d/9,d/1,d/2,d/3,d/4,d/5,d/6,d/7/;
  184.   s/O: D/([0-9])([0-9])([0-9])([0-9])/o: d/1,d/2,d/3,d/4/;
  185.   return $_;
  186. }
  187. # outgoing messages to the MGCP gateways
  188. sub rewrite_S2 
  189. {
  190.   local($_) = $_[0];
  191.   if(y///d)
  192.   {
  193.     print "killed \0!n";
  194.   }
  195. #  s/#[0-9]/5/;
  196. #  s/[0-9]/x/g;
  197. #  s/[2-9]/9/;
  198.   # Change _ back to /   (also change galileo back to ubr924)
  199.   s/aaln_([0-1])@galileo/aaln/1@ubr924/g;
  200.   # change the use of wildcard x to explicit [0-9#*T], but it T needed here?
  201.   s/d/x(d)/d/[0-9#*T](D)/;
  202.   if (/crcx/)
  203.   {
  204.       if (!/v=0/)
  205.       {
  206.           s/M: sendrecv/M: recvonly/;
  207.       }
  208.   }
  209. #  if (/mdcx/)
  210. #  {
  211. #      s/v=0/rnv=0/;
  212. #  }
  213.   return $_;
  214. }