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

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #ifndef UDPTRANSPORT_HXX_
  2. #define UDPTRANSPORT_HXX_
  3. /* ====================================================================
  4.  * The Vovida Software License, Version 1.0 
  5.  * 
  6.  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  7.  * 
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 
  15.  * 2. Redistributions in binary form must reproduce the above copyright
  16.  *    notice, this list of conditions and the following disclaimer in
  17.  *    the documentation and/or other materials provided with the
  18.  *    distribution.
  19.  * 
  20.  * 3. The names "VOCAL", "Vovida Open Communication Application Library",
  21.  *    and "Vovida Open Communication Application Library (VOCAL)" must
  22.  *    not be used to endorse or promote products derived from this
  23.  *    software without prior written permission. For written
  24.  *    permission, please contact vocal@vovida.org.
  25.  *
  26.  * 4. Products derived from this software may not be called "VOCAL", nor
  27.  *    may "VOCAL" appear in their name, without prior written
  28.  *    permission of Vovida Networks, Inc.
  29.  * 
  30.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  31.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  32.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  33.  * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  34.  * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  35.  * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  36.  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  37.  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  38.  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  39.  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  40.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  41.  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  42.  * DAMAGE.
  43.  * 
  44.  * ====================================================================
  45.  * 
  46.  * This software consists of voluntary contributions made by Vovida
  47.  * Networks, Inc. and many individuals on behalf of Vovida Networks,
  48.  * Inc.  For more information on Vovida Networks, Inc., please see
  49.  * <http://www.vovida.org/>.
  50.  *
  51.  */
  52. static const char* const udpTransportHeaderVersion =
  53.     "$Id: udpTransport.hxx,v 1.1 2001/03/30 02:49:23 icahoon Exp $";
  54. #include "global.h"
  55. #include <sys/types.h>
  56. #include <sys/select.h>
  57. #ifndef WIN32
  58. #include <sys/socket.h>
  59. #include <netinet/in.h> // for struct sockaddr_in
  60. #endif
  61. #include <vector>
  62. #include <iostream>
  63. ///
  64. typedef enum
  65. {
  66.     MgcpUdpErrorNone = 0,
  67.     MgcpUdpErrorUnkownHost = 100,
  68.     MgcpUdpErrorConnectionLost,
  69.     MgcpUdpErrorUndefined = -1
  70. } ///
  71. MgcpUdpErrorType;
  72. ///
  73. typedef void* MgcpUdpPacketPtr;
  74. ///
  75. typedef void* MgcpUdpReceiverPtr;
  76. ///
  77. typedef void* MgcpUdpTransmitterPtr;
  78. /// class to hold a single RTP packet
  79. class MgcpUdpPacket
  80. {
  81.         // Curently header extentions are not supported
  82.     public:
  83.         /// Create a packet and allocate data space on heap
  84.         MgcpUdpPacket(int payloadSize);
  85.         /// Free space allocated on heap
  86.         ~MgcpUdpPacket();
  87.         /// Get UDP messsage location
  88.         char* getMessageLocation();
  89.         /// Get UDP messsage length in bytes
  90.         int getMessageSize();
  91.         /// Set UDP messsage lenght in bytes
  92.         void setMessageSize(int size);
  93.         /// Print minimal info about packet, type, destination, timestamp
  94.         // friend ostream& operator<<(ostream& s, const MgcpUdpPacket& x) {
  95.         friend ostream& operator<<(ostream& s, MgcpUdpPacket& x)
  96.         {
  97.             x.print(s);
  98.             return s;
  99.         }
  100.         /// Print minimal info about packet, type, destination, timestamp
  101.         ostream& print( ostream& stream ) const;
  102.         /// Print all info about a packet including hex version of payload data
  103.         void printVerbose( ostream& stream );
  104.     private:
  105.         /// pointer to the the raw data for the packet (including header)
  106.         char* data;
  107.         /// size of all the raw data for the packet (including header)
  108.         int size;
  109.         /// allocated size of data buffer
  110.         int allocatedSize;
  111. };
  112. ///
  113. class MgcpUdpStack
  114. {
  115.     public:
  116.         ///
  117.         MgcpUdpStack(const char* serverName, int aPort );
  118.     protected:
  119.         ///
  120.         int port;
  121.         /// file descriptor of socket
  122.         int socketFd;
  123.         /// address of computer that will receive the packets
  124.         struct sockaddr_in rxAddress;
  125.         /// address of computer that is sending the packets
  126.         struct sockaddr_in txAddress;
  127. };
  128. ///
  129. class MgcpUdpReceiver: public MgcpUdpStack
  130. {
  131.     public:
  132.         /// Create an input stack and start listening on aproperate port
  133.         MgcpUdpReceiver( int port = 5004 , int jitterBufferMs = 50 );
  134.         /// Get the next chunk of data from the stream. Returns bytes received.
  135.         int receive( char* buffer, int bufferSize);
  136.         /// return a new UDP packet, non-blocking, NULL if none available, user must free this packet
  137.         MgcpUdpPacket* receive();
  138.         /// Set the stack so it generates an error if it received data from other hosts
  139.         void onlyAcceptPacketsFrom( char* hostName );
  140.         /// add this file descriptor to a FD_SET for a select call to use
  141.         void addToFdSet( fd_set* set );
  142.         /// Check if this file descriptor is set in an FD_SET for checking after a select call
  143.         bool checkIfSet( fd_set* set );
  144.         int getFd()
  145.         {
  146.             return socketFd;
  147.         }
  148.     private:
  149.         /// read the next  packet off the network
  150.         MgcpUdpPacket* getPacket();
  151.     private:
  152. };
  153. ///
  154. class MgcpUdpTransmitter: public MgcpUdpStack
  155. {
  156.     public:
  157.         ///
  158.         MgcpUdpTransmitter( const char* destinationName,
  159.                             int port = 5004 );
  160.         /// transmit the data
  161.         void transmit( char* data, int length );
  162.         /// Stack will free this packet when it is done with it so it must be alloacted on the heap
  163.         void transmit( MgcpUdpPacket* packet );
  164.         /// will allocate a packet and fill in UDP header fields
  165.         MgcpUdpPacket* allocatePacket( int payloadLength );
  166.         ///
  167.         MgcpUdpTransmitter& operator=(const MgcpUdpTransmitter& x)
  168.         {
  169.             return * this;
  170.         }
  171.     public:  // statistics
  172.         ///
  173.         int bytesTransmitted;
  174.         ///
  175.         int packetsTransmitted;
  176.     private:
  177. };
  178. /// Class to hold all types of exceptions that occur in the UDP stack
  179. class MgcpUdpException
  180. {
  181.     public:
  182.         ///
  183.         MgcpUdpException( MgcpUdpErrorType theErrorType );
  184.         ///
  185.         const MgcpUdpErrorType errorType;
  186. };
  187. #endif