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

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