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

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #ifndef UDP_HXX
  2. #define UDP_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 UdpStackHeaderVersion =
  53.     "$Id: UdpStack.hxx,v 1.2 2001/06/27 01:43:47 bko Exp $";
  54. #include "global.h"
  55. #include <fstream>
  56. #include <string>
  57. #include <assert.h>
  58. #include "NetworkAddress.h"
  59. #ifdef __vxworks
  60. #include <selectLib.h>
  61. #else
  62. #include <sys/select.h>
  63. #endif
  64. typedef enum
  65. {
  66.     inactive,
  67.     sendonly,
  68.     recvonly,
  69.     sendrecv
  70. } UdpMode;
  71. // this class hold stuff that is likely to be a problem to port
  72. class UdpStackPrivateData;
  73. /// classs implements a UDP transmitter AND a reciever
  74. class UdpStack
  75. {
  76.         /* Issues: Current no support for saying which interface a packet
  77.            arrived on. I'm not sure why that woudl be usefull but I think
  78.            someone requested it once.  */
  79.     public:
  80.         /** no ports can be specified and the stack will pick one, OR a minPort
  81.             can be specified and it will be used, OR a min and max can be
  82.             specified and the stack will use the first free port in that
  83.             range. The destiantion hostname and port may be set in the
  84.             destinationHost paramter **/
  85.         UdpStack ( const NetworkAddress* destinationHost = NULL,
  86.                    int localMinPort = -1,
  87.                    int localMaxPort = -1,
  88.                    UdpMode mode = sendrecv,
  89.                    bool log_flag = false,
  90.                    bool isMulticast = false);
  91.         /// connectPorts() has to be called before using send()
  92.         /// It is associate the local port to remote port
  93.         /// so that receive and send only from and to that remote port
  94.         void connectPorts();
  95.         /// disconnectPorts() dissolve the port association
  96.         void disconnectPorts();
  97.         /// set the local ports
  98.         void setLocal (const int minPort = -1, int maxPort = -1 );
  99.         /// set the default destination
  100.         void setDestination ( const NetworkAddress* host );
  101.         /// set the default destination
  102.         void setDestination ( const char* host, int port );
  103.         /// Get the udp stack mode
  104.         UdpMode getMode ()
  105.         {
  106.             return mode;
  107.         };
  108.         /// Get the udp stack logFlag
  109.         bool getLogFlag ()
  110.         {
  111.             return logFlag;
  112.         };
  113.         /// Get the name for local
  114.         string getLclName () const
  115.         {
  116.             return lclName;
  117.         };
  118.         /// Get the name for remote
  119.         string getRmtName () const
  120.         {
  121.             return rmtName;
  122.         };
  123.         /// Get the port being used for recieving
  124.         int getRxPort ()
  125.         {
  126.             return localPort;
  127.         };
  128.         /// Get the port being used for transmitting
  129.         int getTxPort ()
  130.         {
  131.             return localPort;
  132.         };
  133.         /// Get the destination port
  134.         int getDestinationPort ()
  135.         {
  136.             return remotePort;
  137.         };
  138.         ///
  139.         NetworkAddress* getDestinationHost () const;
  140.         /// Set the mode
  141.         void setMode ( const UdpMode theMode )
  142.         {
  143.             mode = theMode;
  144.         };
  145.         /// Set the logFlag
  146.         void setLogFlag ( const bool theLogFlag )
  147.         {
  148.             logFlag = theLogFlag;
  149.         };
  150.         /// Set the name to something logical - only used for errors
  151.         void setLclName ( const string& theName )
  152.         {
  153.             lclName = theName;
  154.         };
  155.         void setRmtName ( const string& theName )
  156.         {
  157.             rmtName = theName;
  158.         };
  159.         /// Get the file descriptor for the socket - use with care or not at all
  160.         int getSocketFD ();
  161.         /// Add this stacks file descriptors to the the fdSet
  162.         void addToFdSet ( fd_set* set );
  163.         /// Find the max of any file descripts in this stack and the passed value
  164.         int getMaxFD ( int prevMax = 0 );
  165.         /// Check and see if this stacks file descriptor is set in fd_set
  166.         bool checkIfSet ( fd_set* set );
  167.         /// Recive a datagram into the specifed buffer - returns size of mesg.
  168.         /// Once connectPorts() is called, can't receive from other ports
  169.         int receive ( const char* buffer,
  170.                       const int bufSize );  // returns bytes read
  171.         /// Recive a datagram into the specifed buffer - returns size of mesg.
  172.         /// Use receive if you do not need to be able to tell who this packet
  173.         /// came from
  174.         int receiveFrom ( const char* buffer,
  175.                           const int bufSize,
  176.                           NetworkAddress* sender );  // returns bytes read
  177.         /// Recive a datagram into the specifed buffer - returns size of mesg.
  178.         /// if successfull, -1 for error and 0 for timeout.
  179.         int receiveTimeout ( const char* buffer,
  180.                              const int bufSize,
  181.                              NetworkAddress* sender,
  182.                              int sec = 0,
  183.                              int usec = 0);
  184.         /// Transmit a datagram
  185.         /// ConnectPorts() should be called before it is called
  186.         void transmit ( const char* buffer,
  187.                         const int length );
  188.         /// Transmit a datagram - use transmit if you always sent to the same person
  189.         int transmitTo ( const char* buffer,
  190.                          const int length,
  191.                          const NetworkAddress* dest );
  192.         ///
  193.         void joinMulticastGroup ( NetworkAddress group,
  194.                                   NetworkAddress* iface = NULL,
  195.                                   int ifaceInexe = 0 );
  196.         ///
  197.         void leaveMulticastGroup( NetworkAddress group,
  198.                                   NetworkAddress* iface = NULL,
  199.                                   int ifaceInexe = 0 );
  200.         ///
  201.         virtual ~UdpStack ();
  202.         /// Get the number of bytes the stack has processed
  203.         int getBytesTransmitted ();
  204.         /// Get the number of datagrams the stack has processed
  205.         int getPacketsTransmitted ();
  206.         /// Get the number of bytes the stack has processed
  207.         int getBytesReceived ();
  208.         /// Get the number of datagrams the stack has processed
  209.         int getPacketsReceived ();
  210.         /** This can be used to eulate network packet loss by throwing
  211.             out a certain percentage of the tranmitted packets */
  212.         void emulatePacketLoss ( float probabilityOfLoss )
  213.         {
  214.             packetLossProbability = probabilityOfLoss;
  215.         };
  216.     private:
  217.         /// Do not use
  218.         UdpStack& operator= ( const UdpStack& x )
  219.         {
  220.             assert ( 0 );
  221.             return *this;
  222.         };
  223.         /// Do not use
  224.         UdpStack( const UdpStack& )
  225.         {
  226.             assert ( 0 );
  227.         };
  228.         void doServer ( int minPort,
  229.                         int maxPort );
  230.         void doClient ( const NetworkAddress* desName,
  231.                         int iPort );
  232.     private:
  233.         /// port the stack is currently using
  234.         int localPort;
  235.         /// port the stack is currently using
  236.         int remotePort;
  237.         /// name of receiver
  238.         string lclName;
  239.         /// name of transmitter
  240.         string rmtName;
  241.         /// probability of a given packet being thrown out by the stack
  242.         float packetLossProbability;
  243.         /// number of bytes the stack has received
  244.         int numBytesReceived;
  245.         /// number of datagrams the stack has received
  246.         int numPacketsReceived;
  247.         /// number of bytes the stack has transimitted
  248.         int numBytesTransmitted;
  249.         /// number of datagrams the stack has transimitted
  250.         int numPacketsTransmitted;
  251.         /// Mode
  252.         UdpMode mode;
  253.         /// flag for msg log
  254.         bool logFlag;
  255.         /// private data that will be a pain to port
  256.         UdpStackPrivateData* data;
  257.         ofstream* in_log;
  258.         ofstream* out_log;
  259.         int rcvCount ;
  260.         int sndCount ;
  261.         VMutex _lock;
  262. };
  263. /// Class to hold all types of exceptions that occur in the UDP stack
  264. class UdpStackException
  265. {
  266.     public:
  267.         ///
  268.         UdpStackException ( const string& description )
  269.         : desc(description)
  270.         {}
  271.         ;
  272.         string getDescription() const
  273.         {
  274.             return desc;
  275.         }
  276.     private:
  277.         string desc;
  278.         friend std::ostream& operator<< ( std::ostream& strm , const UdpStackException& e );
  279. };
  280. inline std::ostream&
  281. operator<< ( std::ostream& strm , const UdpStackException& e )
  282. {
  283.     strm << e.desc;
  284.     return strm;
  285. }
  286. //e exception class for when a transmited packet is renused
  287. class UdpStackExceptionConectionRefused: public UdpStackException
  288. {
  289.     public:
  290.         ///
  291.         UdpStackExceptionConectionRefused( const string& description )
  292.         : UdpStackException(description)
  293.         {}
  294.         ;
  295. };
  296. /// exception class for when all ports all already in use
  297. class UdpStackExceptionPortsInUse: public UdpStackException
  298. {
  299.     public:
  300.         ///
  301.         UdpStackExceptionPortsInUse ( const string& description )
  302.         : UdpStackException(description)
  303.         {}
  304.         ;
  305. };
  306. /// exception class for when a bogus hostname is given
  307. class UdpStackExceptionBadHostname: public UdpStackException
  308. {
  309.     public:
  310.         ///
  311.         UdpStackExceptionBadHostname( const string& description )
  312.         : UdpStackException(description)
  313.         {}
  314.         ;
  315. };
  316. /// exception class for when a bogus hostname is given
  317. class UdpStackExceptionBadPort: public UdpStackException
  318. {
  319.     public:
  320.         ///
  321.         UdpStackExceptionBadPort( const string& description )
  322.         : UdpStackException(description)
  323.         {}
  324.         ;
  325. };
  326. #endif