00001 /*************************************************************************** 00002 * Copyright (C) 2001 by Rick L. Vinyard, Jr. * 00003 * rvinyard@cs.nmsu.edu * 00004 * * 00005 * This file is part of the conexus library. * 00006 * * 00007 * The conexus library is free software; you can redistribute it and/or * 00008 * modify it under the terms of the GNU General Public License * 00009 * version 3 as published by the Free Software Foundation. * 00010 * * 00011 * The conexus library is distributed in the hope that it will be * 00012 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * 00013 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 00014 * General Public License for more details. * 00015 * * 00016 * You should have received a copy of the GNU General Public License * 00017 * along with this software. If not see <http://www.gnu.org/licenses/>. * 00018 ***************************************************************************/ 00019 #ifndef CONEXUS_IPV4ADDRESS_H 00020 #define CONEXUS_IPV4ADDRESS_H 00021 00022 #include <string> 00023 00024 #include <sys/socket.h> 00025 #include <netinet/in.h> 00026 #include <arpa/inet.h> 00027 00028 #include <conexus/ipaddress.h> 00029 #include <conexus/except.h> 00030 00031 namespace Conexus 00032 { 00033 00034 namespace IPv6 00035 { 00036 class Address; 00037 } 00038 00045 namespace IPv4 00046 { 00047 00062 class Address: public IPAddress 00063 { 00064 public: 00065 00067 typedef ConexusPointer<Address> pointer; 00068 00078 Address( uint32_t address = INADDR_ANY, uint16_t port = 0 ); 00079 00080 Address( const std::string& host, uint16_t port = 0 ); 00081 00083 Address( const struct sockaddr_in& addr ); 00084 00086 Address( const struct sockaddr_storage& addr ); 00087 00089 Address( const struct sockaddr& addr ); 00090 00092 Address( const IPv6::Address& addr ); 00093 00095 static pointer create( uint32_t address = INADDR_ANY, uint16_t port = 0 ); 00096 00097 static pointer create( const std::string& host, uint16_t port ); 00098 00100 static pointer create( const struct sockaddr_in& addr ); 00101 00103 static pointer create( const struct sockaddr_storage& addr ); 00104 00106 static pointer create( const struct sockaddr& addr ); 00107 00109 static pointer create( const IPv6::Address& ipv6addr ); 00110 00112 virtual ~Address(); 00113 00115 uint32_t address() const; 00116 00118 std::string address_string() const; 00119 00121 uint32_t subnet_mask() const; 00122 00124 std::string subnet_mask_string() const; 00125 00127 unsigned prefix_length() const; 00128 00130 std::string prefix_length_string() const; 00131 00133 std::string address_subnet_mask_string() const; 00134 00136 std::string cidr_address_string() const; 00137 00139 uint32_t prefix() const; 00140 00142 std::string prefix_string() const; 00143 00145 uint32_t broadcast_address() const; 00146 00148 std::string broadcast_address_string() const; 00149 00151 uint32_t local_address() const; 00152 00154 std::string local_address_string() const; 00155 00157 uint16_t port() const; 00158 00160 std::string port_string() const; 00161 00163 void set_address( uint32_t address ); 00164 00179 void set_address( const std::string& address ); 00180 00182 virtual void set_address( const std::string& address, uint16_t port ); 00183 00185 void set_address_subnet_mask( uint32_t address, uint32_t subnet_mask ); 00186 00188 void set_address_prefix_length( uint32_t address, unsigned prefix_length ); 00189 00191 void set_subnet_mask( uint32_t subnet_mask ); 00192 00194 void set_subnet_mask( const std::string& subnet_mask ); 00195 00197 void set_prefix_length( unsigned prefix_length ); 00198 00200 void set_prefix_length( const std::string& prefix_length ); 00201 00203 void set_port( uint16_t port ); 00204 00206 void set_port( const std::string& port ); 00207 00212 bool is_valid_hostname( const std::string& ) const; 00213 00215 std::string hostname() const; 00216 00218 std::string servicename() const; 00219 00228 bool is_private() const; 00229 00231 bool is_reserved() const; 00232 00234 bool is_loopback() const; 00235 00237 bool is_broadcast() const; 00238 00240 bool is_multicast() const; 00241 00243 bool is_any() const; 00244 00246 socklen_t sockaddr_size() const; 00247 00249 struct sockaddr_in& sockaddr_in(); 00250 00252 struct sockaddr_in* sockaddr_in_ptr(); 00253 00254 operator struct sockaddr_in*(); 00255 00256 Address& operator=( const Address& other ); 00257 00258 Address& operator=( const Conexus::Address& other ); 00259 00261 bool operator==( const Address& other ) const; 00262 00263 virtual sigc::signal<void> signal_changed( ); 00264 00265 virtual sigc::signal<void> signal_address_changed( ); 00266 00267 virtual sigc::signal<void> signal_port_changed( ); 00268 00269 virtual sigc::signal<void> signal_prefix_changed( ); 00270 00272 virtual bool is_ipv4(); 00273 00275 virtual bool is_ipv6(); 00276 00277 protected: 00278 uint32_t m_address; 00279 00280 uint16_t m_port; 00281 00283 unsigned m_prefix_length; 00284 00285 sigc::signal<void> m_signal_address_changed; 00286 00287 sigc::signal<void> m_signal_port_changed; 00288 00289 sigc::signal<void> m_signal_prefix_changed; 00290 00291 sigc::signal<void> m_signal_changed; 00292 00293 }; 00294 00299 std::string address_to_string( uint32_t ); 00300 00305 uint32_t string_to_address( const std::string& ); 00306 00311 void string_to_address_prefix( const std::string&, uint32_t& address, int& prefix ); 00312 00318 bool is_valid_hostname( const std::string& ); 00319 00324 std::string address_to_hostname( uint32_t address ) throw ( address_exception ); 00325 00330 std::string service_to_servicename( uint16_t service ) throw ( address_exception ); 00331 00336 uint32_t hostname_to_address( const std::string& hostname ) throw ( address_exception ); 00337 00342 uint16_t servicename_to_service( const std::string& servicename ) throw ( address_exception ); 00343 00348 bool validate_subnet_mask( uint32_t subnet_mask ) throw(); 00349 00354 uint32_t create_subnet_mask( unsigned prefix_length ); 00355 00360 unsigned subnet_mask_length( uint32_t subnet_mask ) throw(); 00361 00362 } 00363 00364 } 00365 00366 #endif