udp2tcp.pl
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:4k
源码类别:

流媒体/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. # multiplex based on To:, From:, and Call-Id:
  45. &mksocket(5060, S1);
  46. while(1) {
  47.     $rin = '';
  48.     vec($rin, fileno(S1), 1) = 1;
  49.     
  50.     if(select($rin, undef, undef, undef)) {
  51. @bits = split(//, unpack("b*", $rin));
  52. undef($data);
  53. undef($new_data);
  54. if($bits[fileno(S1)]) {
  55.     $data = "";
  56.     $his_address = recv(S1, $data, 60000, 0);
  57.     if($data) {
  58. open(JUNK, ">junk.txt");
  59. print JUNK $data;
  60. close(JUNK);
  61. $new_data = &post_data_tcp($data);
  62. &post_data_udp(S1, $new_data, $his_address);
  63.     }
  64. }
  65.     }
  66. }
  67. sub post_data_udp {
  68.     my($socket, $data, $his_address) = @_;
  69.     ($hisport, $hisiaddr) = sockaddr_in($his_address);
  70.     $hishost = inet_ntoa($hisiaddr);
  71.     print "returns: $hishost:$hisport:n----$datan----n";
  72.     ($sin) = pack_sockaddr_in(5060, $hisiaddr);
  73.     
  74. # defined(send(S1,$return_data,0,$sin)) || die $!;
  75.     defined(send($socket, $data, 0,$sin)) || die "send: $!";
  76.     $them_S2 = pack($sockaddr,PF_INET, 5060, 192.168);
  77.     print "returns: donen";
  78.     return;
  79. }
  80. sub post_data_tcp {
  81.     my($request) = $_[0];
  82.     my($content) = "";
  83.     print "sending:n";
  84.     print "----n$requestn----n";
  85.     print "sending: startn";
  86.     $remote = IO::Socket::INET->new( Proto     => "tcp",
  87.      PeerAddr  => "newton",
  88.      PeerPort  => "5060",
  89.    );
  90.     print $remote $request;
  91.     while(<$remote>) {
  92. $content .= $_;
  93.     }
  94.     close($remote);
  95.     print "sending: donen";
  96.     print "----n$contentn----n";
  97.     return $content;
  98. }
  99. sub mksocket {
  100.   local($port, $socket) = @_;
  101.   
  102.   ($name,$aliases,$proto) = getprotobyname('udp');
  103.   socket($socket, PF_INET, SOCK_DGRAM, $proto) || die "socket: $!";
  104.   $paddr = sockaddr_in($port, INADDR_ANY); # 0 means let kernel pick
  105.   bind($socket , $paddr) || die "died with port $port $!";
  106.   
  107. }