4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 // Stefan Bund <g0dil@berlios.de>
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 \brief INet[46]Address and INet[46]AddressingPolicy public header
27 #ifndef HH_INetAddressing_
28 #define HH_INetAddressing_ 1
33 #include <netinet/in.h>
34 #include <boost/operators.hpp>
35 #include "../../../Socket/SocketPolicy.hh"
36 #include "../../../Socket/ClientSocketHandle.hh"
37 #include "../../../Socket/CommunicationPolicy.hh"
38 #include "../../../Socket/Protocols/GenericAddressingPolicy.hh"
39 #include "../../../Utils/safe_bool.hh"
40 #include "INet4Address.hh"
41 #include "INet6Address.hh"
43 //#include "INetAddressing.mpp"
44 ///////////////////////////////hh.p////////////////////////////////////////
48 /** \brief IPv4 socket address
50 INet4Address wraps the standard sockaddr_in datatype. It provides simple accessor methods
51 to access the host and port. It does \e not integrate \c gethostbyname or DNS lookup.
53 \implementation This implementation is based on sockaddr_in, which is needed since it needs
54 to provide a non-const struct sockaddr * for legacy compatibility.
58 class INet4SocketAddress
59 : public boost::equality_comparable<INet4SocketAddress>,
60 public senf::comparable_safe_bool<INet4SocketAddress>
64 explicit INet4SocketAddress(std::string const & addr); ///< Set address and port
65 /**< This constructor expects a string of the form
66 'host:port'. The constructor will use this value to
67 initialize the host and port members. Since it uses the
68 INet4Address::from_string constructor, this call may
69 block while waiting for the resolver.
70 \throws AddressSyntaxException if the address syntax is
72 \throws UnknownHostnameException if the
73 address cannot be resolved. */
75 INet4SocketAddress(INet4Address const & addr, unsigned port);
76 ///< Set address and port explicitly
77 /**< \param[in] addr IP address
78 \param[in] port port number */
80 bool operator==(INet4SocketAddress const & other) const;
81 ///< Check INet4SocketAddress for equality
83 INet4Address address() const; ///< Return address
84 unsigned port() const; ///< Return port number
86 bool boolean_test() const; ///< \c true, if address is not empty (i.e. 0.0.0.0:0)
88 void clear(); ///< Clear address/port to 0.0.0.0:0
90 void address(INet4Address const & addr); ///< Set address
91 void port(unsigned p); ///< Set port number
93 /// \name Generic Address Interface
96 struct sockaddr * sockaddr_p();
97 struct sockaddr const * sockaddr_p() const;
98 unsigned sockaddr_len() const;
103 struct ::sockaddr_in addr_;
106 /** \brief Write address and port to os
108 \related INet4SocketAddress
110 std::ostream & operator<<(std::ostream & os, INet4SocketAddress const & addr);
112 /** \brief IPv6 socket address
114 This class wraps the standard \c sockaddr_in6 structure. INet6SocketAddress provides access
115 to all members of the sockaddr_in6 structure. Additionally, INet6SocketAddress supports the
116 string representations
119 <tt>[</tt> <i>address</i> [ <tt>%</tt> <i>zone-id</i> ] <tt>]:</tt> <i>port</i> \n
120 <i>hostname</i> <tt>:</tt> <i>port</i>
122 Where \e address is an arbitrary numeric IPv6 address, \e zone-id is an optional network
123 interface name and \e port is the port number. So some example addresses are
126 <tt>[2001:db8:1::1]:80</tt> \n
127 <tt>www.6bone.net:80</tt> \n
128 <tt>[fe80::1\%eth0]:443</tt>
130 \implementation The sockaddr_in6 structure has an sin6_flowinfo member. However RFC3493 does
131 not give the use of this field and specifies, that the field should be ignored ... so
132 that's what we do. Furthermore, the GNU libc reference states, that this field is not
133 implemented in the library.
135 \idea Implement a INet6Address_ref class which has an interface identical to INet6Address
136 and is convertible to INet6Address (the latter has a conversion constructor taking the
137 former as arg). This class however references an external in6_addr instead of containing
138 one itself. This can be used in INet6SocketAddress to increase the performance of some
143 class INet6SocketAddress
146 ///////////////////////////////////////////////////////////////////////////
149 ///////////////////////////////////////////////////////////////////////////
150 ///\name Structors and default members
153 INet6SocketAddress(); ///< Create empty instance
154 explicit INet6SocketAddress(std::string const & addr,
155 INet6Address::Resolve_t resolve = INet6Address::ResolveINet6);
156 ///< Initialize/convert from string representation
157 /**< \throws AddressSyntaxException if the address syntax is
159 \throws UnknownHostnameException if the
160 address cannot be resolved.
161 \param[in] addr Address to parse
162 \param[in] resolve If this is
163 INet6Address::ResolveINet4, support IPv4
164 addresses. See INet6Address. */
165 INet6SocketAddress(INet6Address const & addr, unsigned port);
166 ///< Initialize from address and port
167 INet6SocketAddress(INet6Address const & addr, unsigned port, std::string const & iface);
168 ///< Initialize explicitly from given parameters
171 ///////////////////////////////////////////////////////////////////////////
173 bool operator==(INet6SocketAddress const & other) const; ///< Check addresses for equality
174 bool operator!=(INet6SocketAddress const & other) const; ///< Inverse of above
176 void clear(); ///< Clear socket address
178 INet6Address address() const; ///< Get printable address representation
180 void address(INet6Address const & addr); ///< Change address
182 unsigned port() const; ///< Get port number
183 void port(unsigned poirt); ///< Change port number
185 std::string iface() const; ///< Get interface name
186 void iface(std::string const & iface); ///< Change interface
188 ///\name Generic SocketAddress interface
191 struct sockaddr * sockaddr_p();
192 struct sockaddr const * sockaddr_p() const;
193 unsigned sockaddr_len() const;
200 void assignIface(std::string const & iface);
202 struct sockaddr_in6 sockaddr_;
205 /** \brief Output INet6SocketAddress instance as it's string representation
206 \related INet6SocketAddress
208 std::ostream & operator<<(std::ostream & os, INet6SocketAddress const & addr);
210 /// \addtogroup policy_impl_group
213 /** \brief Addressing policy supporting IPv4 addressing
218 This addressing policy implements addressing using Internet V4
221 The various members are directly imported from
222 GenericAddressingPolicy which see for a detailed
225 struct INet4AddressingPolicy
226 : public AddressingPolicyBase,
227 private GenericAddressingPolicy<INet4SocketAddress>
229 typedef INet4SocketAddress Address;
231 using GenericAddressingPolicy<INet4SocketAddress>::peer;
232 using GenericAddressingPolicy<INet4SocketAddress>::local;
233 using GenericAddressingPolicy<INet4SocketAddress>::connect;
234 using GenericAddressingPolicy<INet4SocketAddress>::bind;
237 /** \brief Addressing policy supporting IPv6 addressing
242 This addressing policy implements addressing using Internet V6
245 The various members are directly imported from
246 GenericAddressingPolicy which see for a detailed
249 struct INet6AddressingPolicy
250 : public AddressingPolicyBase,
251 private GenericAddressingPolicy<INet6SocketAddress>
253 typedef INet6SocketAddress Address;
255 using GenericAddressingPolicy<INet6SocketAddress>::peer;
256 using GenericAddressingPolicy<INet6SocketAddress>::local;
257 using GenericAddressingPolicy<INet6SocketAddress>::connect;
258 using GenericAddressingPolicy<INet6SocketAddress>::bind;
265 ///////////////////////////////hh.e////////////////////////////////////////
266 #include "INetAddressing.cci"
267 //#include "INetAddressing.ct"
268 //#include "INetAddressing.cti"
269 //#include "INetAddressing.mpp"
276 // c-file-style: "senf"
277 // indent-tabs-mode: nil
278 // ispell-local-dictionary: "american"
279 // compile-command: "scons -u test"
280 // comment-column: 40