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

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /* ====================================================================
  2.  * The Vovida Software License, Version 1.0 
  3.  * 
  4.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 
  10.  * 1. Redistributions of source code must retain the above copyright
  11.  *    notice, this list of conditions and the following disclaimer.
  12.  * 
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in
  15.  *    the documentation and/or other materials provided with the
  16.  *    distribution.
  17.  * 
  18.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  19.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  20.  *    not be used to endorse or promote products derived from this
  21.  *    software without prior written permission. For written
  22.  *    permission, please contact vocal@vovida.org.
  23.  *
  24.  * 4. Products derived from this software may not be called "VOCAL", nor
  25.  *    may "VOCAL" appear in their name, without prior written
  26.  *    permission of Vovida Networks, Inc.
  27.  * 
  28.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  29.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  30.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  31.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  32.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  33.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  34.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  35.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  37.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  39.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  40.  * DAMAGE.
  41.  * 
  42.  * ====================================================================
  43.  * 
  44.  * This software consists of voluntary contributions made by Vovida
  45.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  46.  * Inc.  For more information on Vovida Networks, Inc., please see
  47.  * <http://www.vovida.org/>.
  48.  *
  49.  */
  50. static const char* const udpTransport_cxx_Version =
  51.     "$Id: udpTransport.cxx,v 1.1 2001/03/30 02:49:23 icahoon Exp $";
  52. #include "StdAfx.h"
  53. #include <sys/types.h>
  54. #ifndef WIN32
  55. #include <sys/socket.h>
  56. #endif
  57. #include <string.h> // for memset
  58. #ifndef WIN32
  59. #include <netdb.h>
  60. #include <sys/errno.h>
  61. #endif
  62. #include "vovida-endian.h"
  63. #ifdef __sgi
  64. #include <errno.h>
  65. #define socklen_t int
  66. #endif
  67. #include <assert.h>
  68. #include <iostream>
  69. #include "MgcpUdpStack.hxx"
  70. #include "MgcpDebugManager.h"
  71. MgcpUdpPacket::MgcpUdpPacket(int payloadSize)
  72. {
  73.     data = NULL;
  74.     size = 0;
  75.     allocatedSize = 0;
  76.     //    assert( payloadSize > 0 );
  77.     //    assert( payloadSize < 8192 ); // some udp stacks will have problems with large data
  78.     //    assert( numSource >= 0 );
  79.     //    assert( numSource <= 15 );
  80.     //    assert( padBytes >= 0 );
  81.     //    assert( padBytes < 8192 );
  82.     //   assert( sizeof( MgcpUdpHeader ) == 12 );
  83.     size = payloadSize;
  84.     //sizeof( MgcpUdpHeader ) +
  85.     //       numSource*sizeof(u_int32_t) + payloadSize + padBytes;
  86.     data = new char[size];
  87.     assert( data );
  88.     allocatedSize = size;
  89.     //   memset( data, 0 , sizeof( MgcpUdpHeader ) );
  90.     //   MgcpUdpHeader* header = reinterpret_cast<MgcpUdpHeader*>(data);
  91.     //   header->version = 2;
  92.     //   header->paddingFlag = (padBytes>0)?1:0;
  93.     //header->extetionFlag = 0;
  94.     //   header->numSource = numSource;
  95.     //header->markerFlag = 0;
  96.     //header->payloadType = MgcpUdpPayloadUndefined;
  97.     //header->seqenceNumber =0;
  98.     //header->timeStamp = 0;
  99.     //header->ssrc = 0;
  100. }
  101. MgcpUdpPacket::~MgcpUdpPacket()
  102. {
  103.     delete [] data; data = NULL;
  104.     size = 0;
  105.     allocatedSize = 0;
  106. }
  107. char* MgcpUdpPacket::getMessageLocation()
  108. {
  109.     return data;
  110. }
  111. ostream& MgcpUdpPacket::print(ostream& s) const
  112. {
  113.     s << data;
  114.     return s;
  115. }
  116. int MgcpUdpPacket::getMessageSize()
  117. {
  118.     assert( size > 0 );
  119.     return size;
  120. }
  121. void
  122. MgcpUdpPacket::setMessageSize(int s)
  123. {
  124.     assert( s > 0 );
  125.     assert( s <= allocatedSize );
  126.     size = s;
  127. }
  128. MgcpUdpStack::MgcpUdpStack(const char* serverName /* null if this is the server */ ,
  129.                            int aPort )
  130. {
  131.     assert(0);
  132.     assert( aPort > 1024 );
  133.     assert( aPort < 65000 );
  134.     port = aPort;
  135.     //socketFd = socket(AF_INET,SOCK_DGRAM,0);
  136.     socketFd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
  137.     if ( socketFd < 0 )
  138.     {
  139.         // error
  140.         cerr << "Unable to bind to socket";
  141.         assert(0);
  142.     }
  143.     memset((char*) &rxAddress, 0, sizeof(rxAddress));
  144.     assert( port >= 1024 );  // don't use privliged ports
  145.     rxAddress.sin_family = AF_INET;
  146.     rxAddress.sin_port = htons(port);
  147.     rxAddress.sin_addr.s_addr = htonl(INADDR_ANY);
  148.     //   rxAddress.sin_len = sizeof(rxAddress);
  149.     if ( serverName )
  150.     {
  151.         // this is a client
  152.         //      struct hostent* host = gethostbyname (serverName);
  153.         assert(0);   // this code shouldn't be in use anymore
  154.         struct hostent host;
  155.         gethostbyname (serverName);
  156.         if (host == NULL)
  157.         {
  158.             cerr << "Can't lookup hostname "
  159.             << serverName
  160.             << endl;
  161.             throw MgcpUdpException(MgcpUdpErrorUnkownHost);
  162.             assert(0);
  163.         }
  164.         else
  165.         {
  166.             assert( host->h_addr_list[0] );
  167.             memcpy((char*)&rxAddress.sin_addr.s_addr,
  168.                    host->h_addr_list[0],  // take the first entry
  169.                    host->h_length);
  170.         }
  171.         if (connect(socketFd,
  172.                     (struct sockaddr*) &rxAddress,
  173.                     sizeof(rxAddress)))
  174.         {
  175.             cerr << "Unable to connect to socket";
  176.             assert(0);
  177.         }
  178.     }
  179.     else
  180.     {
  181.         // this is a server
  182.         if ( bind( socketFd,
  183.                    (struct sockaddr*) &rxAddress,
  184.                    sizeof(rxAddress))
  185.                 != 0 )
  186.         {
  187.             cerr << "Unable to bind to rx socket -- is another server running?n";
  188.             assert(0);
  189.         }
  190.     }
  191. }
  192. // MgcpUdpReceiver::MgcpUdpReceiver( int aPort=5004 , int jitterBufferMs = 50 ) :
  193. MgcpUdpReceiver::MgcpUdpReceiver( int aPort, int jitterBufferMs) :
  194.         MgcpUdpStack( NULL , aPort )
  195. {}
  196. int
  197. MgcpUdpReceiver::receive( char* buffer, int bufferSize)
  198. {
  199.     // form a RTP packet, do normal receive, copy data to buffer, free packet
  200.     return 0;
  201. }
  202. MgcpUdpPacket*
  203. MgcpUdpReceiver::receive()
  204. {
  205.     /*
  206.        This function needs to do much of the work for the stack. 
  207.        First all packets in the OS que for the port must be recieved
  208.        Packets must be reordered. 
  209.        Duplicate packets must be chucked out. 
  210.        
  211.        Next the jitter buffer control is implemented. If a packet is deamed to be 
  212.        still younger than the jitter buffer time, it is NOT returned to the user
  213.        until it is old enough. 
  214.        Missing packets are inserted using the provided algorithm. 
  215.        Packets are translated from network format to api format usings CODECs
  216.        
  217.        Statistics are collected, and may result in transmitting some RTCP info
  218.        Any RTCP info is received and used to update statitics
  219.        Error information is passed up to the user of the stack 
  220.     */
  221.     return getPacket();
  222. }
  223. MgcpUdpPacket*
  224. MgcpUdpReceiver::getPacket()
  225. {
  226.     /// xxx
  227.     MgcpUdpPacket* packet = new MgcpUdpPacket(512 /* buffer size */ );  // fix hard code here
  228.     //unsigned int fromLen = sizeof(txAddress);
  229.     //   int fromLen = sizeof(txAddress);
  230.     socklen_t fromLen = sizeof(txAddress);
  231.     //   int fromLen = sizeof(txAddress);
  232.     int len = recvfrom( socketFd,
  233.                         packet->getMessageLocation(),
  234.                         packet->getMessageSize(),
  235.                         0 /*flags */,
  236.                         (struct sockaddr*) & txAddress,
  237.                         &fromLen);
  238.     if ( len <= 0 )
  239.     {
  240.         assert(0);
  241.         delete packet;
  242.         packet = NULL;
  243.         return NULL;
  244.     }
  245.     packet->setMessageSize(len);
  246.     assert( fromLen <= sizeof(txAddress) );
  247.     MgcpDumpMessage("IN ", '*', packet);
  248.     return packet;
  249. }
  250. void MgcpUdpReceiver::addToFdSet( fd_set* set )
  251. {
  252.     FD_SET(socketFd, set);
  253. }
  254. bool MgcpUdpReceiver::checkIfSet( fd_set* set )
  255. {
  256.     // return static_cast<bool> FD_ISSET(socketFd, set);
  257.     return FD_ISSET(socketFd, set) != 0;
  258. }
  259. MgcpUdpTransmitter::MgcpUdpTransmitter( const char* destinationHostName,
  260.                                         int aPort ):
  261.         MgcpUdpStack(destinationHostName, aPort)
  262. {}
  263. void
  264. MgcpUdpTransmitter::transmit( char* data, int length )
  265. {
  266.     MgcpUdpPacket packet(length);
  267.     memcpy(packet.getMessageLocation() , data, length);
  268.     transmit(&packet);
  269. }
  270. void
  271. MgcpUdpTransmitter::transmit( MgcpUdpPacket* packet )
  272. {
  273.     /*
  274.       Much work needs to be done in this function. 
  275.       First the packet is translated to network format. 
  276.       Any FEC information is computed and saved for later transmition.
  277.       Previous FEC information is transmitted.
  278.       This packet is transmitted.
  279.       Statistics are updated and may send RTCP packets. 
  280.       RTCP info is received and statistics are update. 
  281.       Error are provided up to the stack user
  282.     */
  283.     //   assert( packet->getPayloadType() == apiFormat );
  284.     //   if ( apiFormat != networkFormat )
  285.     //   {
  286.     // need to translate packet using CODEC
  287.     //      assert(0);
  288.     //   }
  289.     //   packet->setSequenceNumber( nextSequenceNumber++ );
  290.     //   previousTimestamp = packet->getTimestamp();
  291.     MgcpDumpMessage("OUT", '-', packet);
  292.     int count = sendto( socketFd,
  293.                         packet->getMessageLocation(), packet->getMessageSize(),
  294.                         0 /* flags */ ,
  295.                         (struct sockaddr*) 0, 0);
  296. #if 0
  297.     int count = sendto( socketFd,
  298.                         packet->getMessageLocation(), packet->getMessageSize(),
  299.                         0 /* flags */ ,
  300.                         (struct sockaddr*) & rxAddress, sizeof(rxAddress) );
  301. #endif
  302.     if (count < 0)
  303.     {
  304.         // an error -- but what?
  305.         cerr << "Udp send error: " << errno << "n";
  306.     }
  307. }
  308. MgcpUdpPacket*
  309. MgcpUdpTransmitter::allocatePacket( int payloadLength )
  310. {
  311.     MgcpUdpPacket* packet = new MgcpUdpPacket( payloadLength );
  312.     assert( packet );
  313.     //   packet->setSSRC(SSRC);
  314.     //   packet->setPayloadType( apiFormat );
  315.     return packet;
  316. }
  317. MgcpUdpException::MgcpUdpException( MgcpUdpErrorType theErrorType ):
  318.         errorType(theErrorType)
  319. {}