sipudp2tcp.pl
上传用户: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. # simple script to manage UDP to TCP for SIP connections
  41. use IO::Socket;
  42. #use LWP;
  43. use Socket;
  44. require "getopts.pl";
  45. &Getopts("p");
  46. if($opt_p) {
  47.     $print = 1;
  48. }
  49. # multiplex based on To:, From:, and Call-Id:
  50. &mkudpsocket(5060, S1);
  51. #$tcp_socket = &create_connection("", 5060) || die "can't create connection to host: $!";
  52. print "nextn";
  53. while(1) {
  54.     $rin = '';
  55.     $max_fh = -1;
  56.     vec($rin, fileno(S1), 1) = 1;
  57.     vec($rin, fileno($tcp_socket), 1) = 1;
  58.     print "wheel!n" if ($print);
  59.     if(select($rin, undef, undef, undef)) {
  60. @bits = split(//, unpack("b*", $rin));
  61. undef($data);
  62. undef($new_data);
  63. print "inn" if ($print);
  64. if($bits[fileno(S1)]) {
  65.     $his_address = &handle_udp(S1, $tcp_socket);
  66. }
  67. if($bits[fileno($tcp_socket)]) {
  68.     &handle_tcp($tcp_socket, S1, $his_address);
  69. }
  70.     }
  71. }
  72. sub handle_udp {
  73.     my($udp_socket, $tcp_socket) = @_;
  74.     my($his_address);
  75.     my($data);
  76.     print "handling udpn" if ($print);
  77.     $his_address = recv($udp_socket, $data, 60000, 0);
  78.     if($data) {
  79.         if($print) {
  80. print "---------- UDP ----------n";
  81. print $data;
  82. print "---------- --- ----------n";
  83.         }
  84. open(JUNK, ">junk.txt");
  85. print JUNK $data;
  86. close(JUNK);
  87.     }
  88.     &post_data_tcp($tcp_socket, $data);
  89.     return $his_address;
  90. }
  91. sub handle_tcp {
  92.     my($tcp_socket, $udp_socket, $udp_address) = @_;
  93.     my($data);
  94.     print "handling tcpn" if ($print);
  95.     $data = &recv_data_tcp($tcp_socket);
  96.     if($data) {
  97.         if($print) {
  98. print "++++++++++ TCP ++++++++++n";
  99. print $data;
  100. print "---------- --- ----------n";
  101.         }
  102. open(JUNK, ">junk.txt");
  103. print JUNK $data;
  104. close(JUNK);
  105.     }
  106. #    &post_data_udp($udp_socket, $data, $udp_address);
  107. }
  108. sub post_data_udp {
  109.     my($socket, $data, $his_address) = @_;
  110.     ($hisport, $hisiaddr) = sockaddr_in($his_address);
  111.     $hishost = inet_ntoa($hisiaddr);
  112.     print "returns: $hishost:$hisport:n----$datan----n" if ($print);
  113.     ($sin) = pack_sockaddr_in(5060, $hisiaddr);
  114.     
  115. # defined(send(S1,$return_data,0,$sin)) || die $!;
  116.     defined(send($socket, $data, 0,$sin)) || die "send: $!";
  117.     $them_S2 = pack($sockaddr,PF_INET, 5060, 192.168);
  118.     print "returns: donen" if ($print);
  119.     return;
  120. }
  121. sub recv_data_tcp {
  122.     my($socket) = @_;
  123.     my($headers) = "";
  124.     my($body) = "";
  125.     my($got_full_msg);
  126.     my($msg);
  127.     # wait for the appropriate line
  128.     # message states:
  129.     # 0 -- headers
  130.     # 1 -- got all headers
  131.     my($msg_state) = 0; 
  132.     my($buf);
  133.     while(($msg_state == 0)  && ($_ = <$socket>)) {
  134. $headers .= $_;
  135. if(/^s*$/) {
  136.     $msg_state = 1;
  137. }
  138.     }
  139.     if(!$msg_state) {
  140. print "at eol: error!n";
  141.     } else {
  142. if($print) {
  143. print "got headers!n";
  144. print "----------n";
  145. print $headers;
  146. print "----------n";
  147. }
  148.     }
  149.     # get the body if there's still data
  150.     # get content-length
  151.     my($body_length) = 0;
  152.     if($headers =~ /(^|[rn])content-length:s*([0-9]+)/i) {
  153. print $2, "n" if ($print);
  154. $body_length = $2;
  155.     } elsif ($headers =~ /(^|[rn])l:s*([0-9]+)/i) {
  156. print $2, "n" if($print);
  157. $body_length = $2;
  158.     }
  159.     print "TCP: getting $body_length bytes of bodyn" if($print);
  160.     my($bytes_to_read) = $body_length;
  161.     my($actual_bytes_read);
  162.     while($bytes_to_read) {
  163. $actual_bytes_read = read($socket, $data, $bytes_to_read);
  164. if(!$actual_bytes_read) {
  165.     print "no bytes in body: error!n";
  166.     $bytes_to_read = 0;
  167. } else {
  168.     $bytes_to_read = $bytes_to_read - $actual_bytes_read;
  169. }
  170.     }
  171.     $body = $data;
  172.     if($print) {
  173.     print "got body!n";
  174.     print "----------n";
  175.     print $body;
  176.     print "----------n";
  177.     }
  178.     $msg = $headers . $body;
  179.     return $msg;
  180. }
  181. # usage $socket = create_connection("hostname", port);
  182. sub create_connection {
  183.     my($addr, $port) = @_;
  184.     my($remote);
  185.     $remote = IO::Socket::INET->new( Proto     => "tcp",
  186.      PeerAddr  => $addr,
  187.      PeerPort  => $port,
  188.    );
  189.     return ($remote);
  190. }
  191. sub post_data_tcp {
  192.     my($socket, $request) = @_;
  193.     if($print) {
  194.     print "TCP:n";
  195.     print "----n$requestn----n";
  196.     print "sending: startn";
  197.     }
  198.     if($socket) {
  199.         my($bytes) = print $socket $request;
  200.     }
  201.     if(!$bytes) {
  202. # print "write error: $!n";
  203.     } else {
  204. print "bytes written: $bytesn" if ($print);
  205.     }
  206.     print "sending: donen" if($print);
  207. }
  208. sub mkudpsocket {
  209.   local($port, $socket) = @_;
  210.   
  211.   ($name,$aliases,$proto) = getprotobyname('udp');
  212.   socket($socket, PF_INET, SOCK_DGRAM, $proto) || die "socket: $!";
  213.   $paddr = sockaddr_in($port, INADDR_ANY); # 0 means let kernel pick
  214.   bind($socket , $paddr) || die "died with port $port $!";
  215.   
  216. }