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

流媒体/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 IP6Address_cxx_Version = 
  51.     "$Id: IP6Address.cxx,v 1.14 2000/12/18 23:49:31 bko Exp $";
  52. #if defined(__linux__)
  53. #include "IP6Address.hxx"
  54. #include "TransportCommon.hxx"
  55. #include "SystemException.hxx"
  56. #include "Socket.hxx"
  57. #include "VLog.hxx"
  58. #include <iomanip>
  59. #include <cerrno>
  60. using Vocal::Transport::IP6Address;
  61. using Vocal::Transport::TransportAddress;
  62. using Vocal::Transport::Socket;
  63. using Vocal::Logging::VLog;
  64. IP6Address::IP6Address(u_int16_t    port)
  65. {
  66.     setAddressFamily(AF_INET6);
  67.     in6Addr_.sin6_port       = htons(port);      // Transport layer port #
  68.     in6Addr_.sin6_flowinfo   = 0;          // IPv6 flow information
  69.     in6Addr_.sin6_addr      = in6addr_any;      // IPv6 address 
  70. }
  71. IP6Address::IP6Address(const sockaddr_in6 &     in6Addr)
  72.     : in6Addr_(in6Addr)
  73. {
  74.     setAddressFamily(AF_INET6);
  75. }
  76. IP6Address::IP6Address(const IP6Address & src)
  77.     : in6Addr_(src.in6Addr_)
  78. {
  79.     setAddressFamily(AF_INET6);
  80. }
  81. IP6Address::~IP6Address()
  82. {
  83. }
  84. IP6Address &      
  85. IP6Address::operator=(const IP6Address & src)
  86. {
  87.     if ( this != &src )
  88.     {
  89.      setIP6Address(src.in6Addr_);
  90.     }
  91.     return ( *this );
  92. }
  93. TransportAddress *
  94. IP6Address::clone() const
  95. {
  96.     return ( new IP6Address(*this) );
  97. }
  98. void     
  99. IP6Address::setAddress(sockaddr * addr)
  100. {
  101.     if ( addr->sa_family != AF_INET6 )
  102.     {
  103.      VLog log;
  104. VWARN(log)  << "IP6Address::setAddress: incorrect address family = "
  105.          << addr->sa_family << VWARN_END(log);
  106.      return;
  107.     }
  108.     in6Addr_ = *reinterpret_cast<sockaddr_in6 *>(addr);
  109. }
  110. void          
  111. IP6Address::setIP6Address(const sockaddr_in6 & in6Addr)
  112. {
  113.     in6Addr_ = in6Addr;
  114.     setAddressFamily(AF_INET6);
  115. }
  116. void          
  117. IP6Address::setPort(u_int16_t port)
  118. {
  119.     in6Addr_.sin6_port = htons(port);
  120. }
  121. sockaddr *  
  122. IP6Address::getAddress() const
  123. {
  124.     return ( reinterpret_cast<sockaddr *>(&in6Addr_) );
  125. }
  126. const sockaddr_in6 &     
  127. IP6Address::getIP6Address() const
  128. {
  129.     return ( in6Addr_ );
  130. }
  131. socklen_t       
  132. IP6Address::getAddressLength() const
  133. {
  134.     return ( sizeof(in6Addr_) );
  135. }
  136. u_int16_t        
  137. IP6Address::getPort() const
  138. {
  139.     return ( ntohs(in6Addr_.sin6_port) );
  140. }
  141. void          
  142. IP6Address::updateAddress(const Socket & sock)
  143. throw ( Vocal::SystemException )
  144. {
  145.     const string    fn("IP6Address::updateAddress");
  146.     VLog         log(fn);
  147.     sockaddr_in6    newAddress;
  148.     socklen_t     newAddressLength = sizeof(newAddress);
  149.     
  150.     if (   getsockname(sock.getFD(), 
  151.                (sockaddr *)&newAddress, 
  152.      &newAddressLength)
  153.     < SUCCESS 
  154. )
  155.     {
  156.      throw Vocal::SystemException(fn + " on getsockname(): " + strerror(errno), 
  157.                 __FILE__, __LINE__, errno);
  158.     }
  159.     setIP6Address(newAddress);
  160.     VDEBUG(log) << (fn + ": ") << *this 
  161.           << ", from: " << sock
  162.           << VDEBUG_END(log);
  163. }
  164. bool          
  165. IP6Address::operator==(const IP6Address & rhs) const
  166. {
  167.     return 
  168.     ( this == &rhs
  169.     || (   getAddressFamily() == rhs.getAddressFamily()
  170.      &&  IN6_ARE_ADDR_EQUAL(&in6Addr_.sin6_addr, &rhs.in6Addr_.sin6_addr)
  171. &&  in6Addr_.sin6_port == rhs.in6Addr_.sin6_port
  172. )
  173.     );
  174. }
  175. bool          
  176. IP6Address::operator!=(const IP6Address & rhs) const
  177. {
  178.     return ( !operator==(rhs) );
  179. }
  180. bool          
  181. IP6Address::operator<(const IP6Address & rhs) const
  182. {
  183.     // TEMP CODE: This should be here until the operating system / socket
  184.     // stack has implemented similar functionality.
  185.     //
  186.     #define VOVIDA_IN6_IS_ADDR_LESS_THAN(a,b) 
  187. ((((uint32_t *) (a))[0] < ((uint32_t *) (b))[0]) || 
  188.  (((uint32_t *) (a))[1] < ((uint32_t *) (b))[2]) || 
  189.  (((uint32_t *) (a))[2] < ((uint32_t *) (b))[1]) || 
  190.  (((uint32_t *) (a))[3] < ((uint32_t *) (b))[3]))
  191.     uint16_t leftPort  = ntohs(in6Addr_.sin6_port),
  192.           rightPort = ntohs(rhs.in6Addr_.sin6_port);
  193.     return 
  194.     ( this != &rhs
  195.     && (   getAddressFamily() < rhs.getAddressFamily()
  196.      ||  VOVIDA_IN6_IS_ADDR_LESS_THAN(&in6Addr_.sin6_addr, &rhs.in6Addr_.sin6_addr)
  197. ||  leftPort < rightPort
  198. )
  199.     );
  200.     #undef VOVIDA_IN6_IS_ADDR_LESS_THAN
  201. }
  202. bool          
  203. IP6Address::operator<=(const IP6Address & rhs) const
  204. {
  205.     return
  206.     ( operator==(rhs)
  207.     && operator<(rhs)
  208.     );
  209. }
  210. bool          
  211. IP6Address::operator>(const IP6Address & rhs) const
  212. {
  213.     return ( !operator<=(rhs) );
  214. }
  215. bool          
  216. IP6Address::operator>=(const IP6Address & rhs) const
  217. {
  218.     return ( !operator<(rhs) );
  219. }
  220. std::ostream &     
  221. IP6Address::writeTo(std::ostream & out) const
  222. {
  223.     // TEMP CODE: This should be here until the operating system / socket
  224.     // stack has implemented similar functionality.
  225.     //
  226.     AddressFamily   af = getAddressFamily();
  227.     return 
  228.     (    
  229.         out << af << ":"
  230.          << hex << ntohs(in6Addr_.sin6_addr.s6_addr16[0]) << ":"
  231.          << hex << ntohs(in6Addr_.sin6_addr.s6_addr16[1]) << ":"
  232.          << hex << ntohs(in6Addr_.sin6_addr.s6_addr16[2]) << ":"
  233.          << hex << ntohs(in6Addr_.sin6_addr.s6_addr16[3]) << ":"
  234.          << hex << ntohs(in6Addr_.sin6_addr.s6_addr16[4]) << ":"
  235.          << hex << ntohs(in6Addr_.sin6_addr.s6_addr16[5]) << ":"
  236.          << hex << ntohs(in6Addr_.sin6_addr.s6_addr16[6]) << ":"
  237.          << hex << ntohs(in6Addr_.sin6_addr.s6_addr16[7]) << "/"
  238.          << dec << ntohs(in6Addr_.sin6_port)
  239.     );
  240. }
  241. #endif // defined(__linux__)