mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			187 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * SRT - Secure, Reliable, Transport
 | 
						|
 * Copyright (c) 2018 Haivision Systems Inc.
 | 
						|
 * 
 | 
						|
 * This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
						|
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
						|
 * 
 | 
						|
 */
 | 
						|
 | 
						|
/*****************************************************************************
 | 
						|
Copyright (c) 2001 - 2011, The Board of Trustees of the University of Illinois.
 | 
						|
All rights reserved.
 | 
						|
 | 
						|
Redistribution and use in source and binary forms, with or without
 | 
						|
modification, are permitted provided that the following conditions are
 | 
						|
met:
 | 
						|
 | 
						|
* Redistributions of source code must retain the above
 | 
						|
  copyright notice, this list of conditions and the
 | 
						|
  following disclaimer.
 | 
						|
 | 
						|
* Redistributions in binary form must reproduce the
 | 
						|
  above copyright notice, this list of conditions
 | 
						|
  and the following disclaimer in the documentation
 | 
						|
  and/or other materials provided with the distribution.
 | 
						|
 | 
						|
* Neither the name of the University of Illinois
 | 
						|
  nor the names of its contributors may be used to
 | 
						|
  endorse or promote products derived from this
 | 
						|
  software without specific prior written permission.
 | 
						|
 | 
						|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 | 
						|
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 | 
						|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 | 
						|
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 | 
						|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 | 
						|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 | 
						|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 | 
						|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 | 
						|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 | 
						|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
						|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
						|
*****************************************************************************/
 | 
						|
 | 
						|
/*****************************************************************************
 | 
						|
written by
 | 
						|
   Yunhong Gu, last updated 01/27/2011
 | 
						|
modified by
 | 
						|
   Haivision Systems Inc.
 | 
						|
*****************************************************************************/
 | 
						|
 | 
						|
#ifndef __UDT_CHANNEL_H__
 | 
						|
#define __UDT_CHANNEL_H__
 | 
						|
 | 
						|
 | 
						|
#include "udt.h"
 | 
						|
#include "packet.h"
 | 
						|
#include "netinet_any.h"
 | 
						|
 | 
						|
class CChannel
 | 
						|
{
 | 
						|
public:
 | 
						|
 | 
						|
   // XXX There's currently no way to access the socket ID set for
 | 
						|
   // whatever the channel is currently working for. Required to find
 | 
						|
   // some way to do this, possibly by having a "reverse pointer".
 | 
						|
   // Currently just "unimplemented".
 | 
						|
   std::string CONID() const { return ""; }
 | 
						|
 | 
						|
   CChannel();
 | 
						|
   CChannel(int version);
 | 
						|
   ~CChannel();
 | 
						|
 | 
						|
      /// Open a UDP channel.
 | 
						|
      /// @param [in] addr The local address that UDP will use.
 | 
						|
 | 
						|
   void open(const sockaddr* addr = NULL);
 | 
						|
 | 
						|
      /// Open a UDP channel based on an existing UDP socket.
 | 
						|
      /// @param [in] udpsock UDP socket descriptor.
 | 
						|
 | 
						|
   void attach(UDPSOCKET udpsock);
 | 
						|
 | 
						|
      /// Disconnect and close the UDP entity.
 | 
						|
 | 
						|
   void close() const;
 | 
						|
 | 
						|
      /// Get the UDP sending buffer size.
 | 
						|
      /// @return Current UDP sending buffer size.
 | 
						|
 | 
						|
   int getSndBufSize();
 | 
						|
 | 
						|
      /// Get the UDP receiving buffer size.
 | 
						|
      /// @return Current UDP receiving buffer size.
 | 
						|
 | 
						|
   int getRcvBufSize();
 | 
						|
 | 
						|
      /// Set the UDP sending buffer size.
 | 
						|
      /// @param [in] size expected UDP sending buffer size.
 | 
						|
 | 
						|
   void setSndBufSize(int size);
 | 
						|
 | 
						|
      /// Set the UDP receiving buffer size.
 | 
						|
      /// @param [in] size expected UDP receiving buffer size.
 | 
						|
 | 
						|
   void setRcvBufSize(int size);
 | 
						|
 | 
						|
      /// Set the IPV6ONLY option.
 | 
						|
      /// @param [in] IPV6ONLY value.
 | 
						|
 | 
						|
   void setIpV6Only(int ipV6Only);
 | 
						|
 | 
						|
      /// Query the socket address that the channel is using.
 | 
						|
      /// @param [out] addr pointer to store the returned socket address.
 | 
						|
 | 
						|
   void getSockAddr(sockaddr* addr) const;
 | 
						|
 | 
						|
      /// Query the peer side socket address that the channel is connect to.
 | 
						|
      /// @param [out] addr pointer to store the returned socket address.
 | 
						|
 | 
						|
   void getPeerAddr(sockaddr* addr) const;
 | 
						|
 | 
						|
      /// Send a packet to the given address.
 | 
						|
      /// @param [in] addr pointer to the destination address.
 | 
						|
      /// @param [in] packet reference to a CPacket entity.
 | 
						|
      /// @return Actual size of data sent.
 | 
						|
 | 
						|
   int sendto(const sockaddr* addr, CPacket& packet) const;
 | 
						|
 | 
						|
      /// Receive a packet from the channel and record the source address.
 | 
						|
      /// @param [in] addr pointer to the source address.
 | 
						|
      /// @param [in] packet reference to a CPacket entity.
 | 
						|
      /// @return Actual size of data received.
 | 
						|
 | 
						|
   EReadStatus recvfrom(sockaddr* addr, CPacket& packet) const;
 | 
						|
 | 
						|
#ifdef SRT_ENABLE_IPOPTS
 | 
						|
      /// Set the IP TTL.
 | 
						|
      /// @param [in] ttl IP Time To Live.
 | 
						|
      /// @return none.
 | 
						|
 | 
						|
   void setIpTTL(int ttl);
 | 
						|
 | 
						|
      /// Set the IP Type of Service.
 | 
						|
      /// @param [in] tos IP Type of Service.
 | 
						|
 | 
						|
   void setIpToS(int tos);
 | 
						|
 | 
						|
      /// Get the IP TTL.
 | 
						|
      /// @param [in] ttl IP Time To Live.
 | 
						|
      /// @return TTL.
 | 
						|
 | 
						|
   int getIpTTL() const;
 | 
						|
 | 
						|
      /// Get the IP Type of Service.
 | 
						|
      /// @return ToS.
 | 
						|
 | 
						|
   int getIpToS() const;
 | 
						|
#endif
 | 
						|
 | 
						|
   int ioctlQuery(int type) const;
 | 
						|
   int sockoptQuery(int level, int option) const;
 | 
						|
 | 
						|
   const sockaddr* bindAddress() { return &m_BindAddr; }
 | 
						|
   const sockaddr_any& bindAddressAny() { return m_BindAddr; }
 | 
						|
 | 
						|
private:
 | 
						|
   void setUDPSockOpt();
 | 
						|
 | 
						|
private:
 | 
						|
   const int m_iIPversion;              // IP version
 | 
						|
   int m_iSockAddrSize;                 // socket address structure size (pre-defined to avoid run-time test)
 | 
						|
 | 
						|
   UDPSOCKET m_iSocket;                 // socket descriptor
 | 
						|
#ifdef SRT_ENABLE_IPOPTS
 | 
						|
   int m_iIpTTL;
 | 
						|
   int m_iIpToS;
 | 
						|
#endif
 | 
						|
   int m_iSndBufSize;                   // UDP sending buffer size
 | 
						|
   int m_iRcvBufSize;                   // UDP receiving buffer size
 | 
						|
   int m_iIpV6Only;                     // IPV6_V6ONLY option (-1 if not set)
 | 
						|
   sockaddr_any m_BindAddr;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
#endif
 |