blocxx
|
00001 /******************************************************************************* 00002 * Copyright (C) 2005, Vintela, Inc. All rights reserved. 00003 * Copyright (C) 2006, Novell, Inc. All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions are met: 00007 * 00008 * * Redistributions of source code must retain the above copyright notice, 00009 * this list of conditions and the following disclaimer. 00010 * * Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * * Neither the name of 00014 * Vintela, Inc., 00015 * nor Novell, Inc., 00016 * nor the names of its contributors or employees may be used to 00017 * endorse or promote products derived from this software without 00018 * specific prior written permission. 00019 * 00020 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00021 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00022 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00023 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00024 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00025 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00026 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00027 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00028 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00029 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00030 * POSSIBILITY OF SUCH DAMAGE. 00031 *******************************************************************************/ 00032 00033 00039 #ifndef BLOCXX_SocketADDRESS_HPP_INCLUDE_GUARD_ 00040 #define BLOCXX_SocketADDRESS_HPP_INCLUDE_GUARD_ 00041 #include "blocxx/BLOCXX_config.h" 00042 #include "blocxx/Array.hpp" 00043 #include "blocxx/Types.hpp" 00044 #include "blocxx/NetworkTypes.hpp" 00045 #include "blocxx/String.hpp" 00046 #include "blocxx/Exception.hpp" 00047 00048 namespace BLOCXX_NAMESPACE 00049 { 00050 00051 BLOCXX_DECLARE_APIEXCEPTION(UnknownHost, BLOCXX_COMMON_API); 00052 BLOCXX_DECLARE_APIEXCEPTION(SocketAddress, BLOCXX_COMMON_API); 00053 // TODO: This class needs to be rewritten to take into account the fact that a given hostname may have multiple 00054 // ip addresses, and a given ip address may have multiple hostnames & aliases.. 00055 class BLOCXX_COMMON_API SocketAddress 00056 { 00057 public: 00058 static const char* const ALL_LOCAL_ADDRESSES; 00059 00060 enum AddressType 00061 { 00062 UNSET, 00063 INET, 00064 UDS 00065 }; 00066 AddressType getType() const { return m_type; } 00076 static SocketAddress getByName(const String& host, unsigned short port = 0); 00092 static SocketAddress getAnyLocalHost(UInt16 port = 0); 00097 static SocketAddress allocEmptyAddress(AddressType type); 00102 UInt16 getPort() const; 00103 ~SocketAddress() {} 00109 const String getName() const; 00115 const String getAddress() const; 00116 const SocketAddress_t* getNativeForm() const; 00117 size_t getNativeFormSize() const; 00118 00123 const InetSocketAddress_t* getInetAddress() const; 00124 00125 #if !defined(BLOCXX_WIN32) 00126 //static Array<SocketAddress> getAllByName(const String& hostName, 00127 // unsigned short port = 0); 00128 static SocketAddress getUDS(const String& filename); 00129 00134 const UnixSocketAddress_t* getUnixAddress() const; 00135 00136 void assignFromNativeForm(const UnixSocketAddress_t* address, size_t len); 00137 #endif 00138 00144 const String toString() const; 00145 void assignFromNativeForm(const InetSocketAddress_t* address, size_t len); 00146 00147 SocketAddress(); 00148 private: 00149 SocketAddress(const InetSocketAddress_t& nativeForm); 00150 00151 #if !defined(BLOCXX_WIN32) 00152 SocketAddress(const UnixSocketAddress_t& nativeForm); 00153 #endif 00154 00155 String m_name; 00156 String m_address; 00157 size_t m_nativeSize; 00158 00159 InetSocketAddress_t m_inetNativeAddress; 00160 00161 #if !defined(BLOCXX_WIN32) 00162 UnixSocketAddress_t m_UDSNativeAddress; 00163 #endif 00164 00165 AddressType m_type; 00166 static SocketAddress getFromNativeForm(const InetAddress_t& nativeForm, 00167 UInt16 nativePort, const String& hostname ); 00168 static SocketAddress getFromNativeForm( 00169 const InetSocketAddress_t& nativeForm); 00170 00171 #if !defined(BLOCXX_WIN32) 00172 static SocketAddress getFromNativeForm( 00173 const UnixSocketAddress_t& nativeForm); 00174 #endif 00175 00176 #ifdef BLOCXX_WIN32 00177 const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt); 00178 #endif 00179 00180 }; 00181 00182 } // end namespace BLOCXX_NAMESPACE 00183 00184 #endif