Socket/Protocols/INet: Rename all INet6Address members named 'ipv*' to 'inet*'
[senf.git] / Socket / Protocols / INet / INetAddressing.hh
1 // $Id$
2 //
3 // Copyright (C) 2006
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Stefan Bund <g0dil@berlios.de>
7 //
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.
12 //
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.
17 //
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.
22
23 /** \file
24     \brief INet[46]Address and INet[46]AddressingPolicy public header
25  */
26
27 #ifndef HH_INetAddressing_
28 #define HH_INetAddressing_ 1
29
30 // Custom includes
31 #include <string>
32 #include <exception>
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"
42
43 //#include "INetAddressing.mpp"
44 ///////////////////////////////hh.p////////////////////////////////////////
45
46 namespace senf {
47
48     /** \brief IPv4 socket address
49
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.
52         
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.
55
56         \ingroup addr_group
57      */
58     class INet4SocketAddress
59         : public boost::equality_comparable<INet4SocketAddress>, 
60           public senf::comparable_safe_bool<INet4SocketAddress>
61     {
62     public:
63         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
71                                                  invalid
72                                              \throws UnknownHostnameException if the
73                                                  address cannot be resolved. */
74
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 */
79
80         bool operator==(INet4SocketAddress const & other) const;
81                                         ///< Check INet4SocketAddress for equality
82
83         INet4Address address() const;   ///< Return address
84         unsigned port() const;          ///< Return port number
85
86         bool boolean_test() const;      ///< \c true, if address is not empty (i.e. 0.0.0.0:0)
87
88         void clear();                   ///< Clear address/port to 0.0.0.0:0
89
90         void address(INet4Address const & addr); ///< Set address
91         void port(unsigned p);          ///< Set port number
92
93         /// \name Generic Address Interface
94         /// @{
95
96         struct sockaddr * sockaddr_p();
97         struct sockaddr const * sockaddr_p() const;
98         unsigned sockaddr_len() const;
99
100         /// @}
101
102     private:
103         struct ::sockaddr_in addr_;
104     };
105
106     /** \brief Write address and port to os
107
108         \related INet4SocketAddress
109      */
110     std::ostream & operator<<(std::ostream & os, INet4SocketAddress const & addr);
111
112     /** \brief IPv6 socket address
113
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
117
118         \par ""
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>
121
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
124         
125         \par ""
126             <tt>[2001:db8:1::1]:80</tt> \n
127             <tt>www.6bone.net:80</tt> \n
128             <tt>[fe80::1\%eth0]:443</tt>
129
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.
134
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
139             operations.
140
141         \ingroup addr_group
142      */
143     class INet6SocketAddress
144         : public boost::equality_comparable<INet6SocketAddress>, 
145           public senf::comparable_safe_bool<INet6SocketAddress>
146     {
147     public:
148         ///////////////////////////////////////////////////////////////////////////
149         // Types
150
151         ///////////////////////////////////////////////////////////////////////////
152         ///\name Structors and default members
153         ///@{
154
155         INet6SocketAddress();           ///< Create empty instance
156         explicit INet6SocketAddress(std::string const & addr, 
157                                     INet6Address::Resolve_t resolve = INet6Address::ResolveINet6);
158                                         ///< Initialize/convert from string representation
159                                         /**< \throws AddressSyntaxException if the address syntax is
160                                                  invalid
161                                              \throws UnknownHostnameException if the
162                                                  address cannot be resolved.
163                                              \param[in] addr Address to parse
164                                              \param[in] resolve If this is
165                                                  INet6Address::ResolveINet4, support IPv4
166                                                  addresses. See INet6Address. */
167         INet6SocketAddress(INet6Address const & addr, unsigned port);
168                                         ///< Initialize from address and port
169         INet6SocketAddress(INet6Address const & addr, unsigned port, std::string const & iface);
170                                         ///< Initialize explicitly from given parameters
171
172         ///@}
173         ///////////////////////////////////////////////////////////////////////////
174
175         bool operator==(INet6SocketAddress const & other) const; ///< Check addresses for equality
176
177         void clear();                   ///< Clear socket address
178
179         INet6Address address() const;    ///< Get printable address representation
180
181         void address(INet6Address const & addr); ///< Change address
182
183         unsigned port() const;          ///< Get port number
184         void port(unsigned poirt);      ///< Change port number
185
186         std::string iface() const;      ///< Get interface name
187         void iface(std::string const & iface); ///< Change interface
188
189         bool boolean_test() const;      ///< \c true, if address is not empty (i.e. [::]:0)
190
191         ///\name Generic SocketAddress interface
192         ///@{
193
194         struct sockaddr * sockaddr_p();
195         struct sockaddr const * sockaddr_p() const;
196         unsigned sockaddr_len() const;
197
198         ///@}
199
200     protected:
201
202     private:
203         void assignIface(std::string const & iface);
204
205         struct sockaddr_in6 sockaddr_;
206     };
207
208     /** \brief Output INet6SocketAddress instance as it's string representation
209         \related INet6SocketAddress
210      */
211     std::ostream & operator<<(std::ostream & os, INet6SocketAddress const & addr);
212
213     /// \addtogroup policy_impl_group
214     /// @{
215
216     /** \brief Addressing policy supporting IPv4 addressing
217
218         \par Address Type:
219             INet4SocketAddress
220
221         This addressing policy implements addressing using Internet V4
222         addresses.
223
224         The various members are directly imported from
225         GenericAddressingPolicy which see for a detailed
226         documentation.
227      */
228     struct INet4AddressingPolicy
229         : public AddressingPolicyBase,
230           private GenericAddressingPolicy<INet4SocketAddress>
231     {
232         typedef INet4SocketAddress Address;
233
234         using GenericAddressingPolicy<INet4SocketAddress>::peer;
235         using GenericAddressingPolicy<INet4SocketAddress>::local;
236         using GenericAddressingPolicy<INet4SocketAddress>::connect;
237         using GenericAddressingPolicy<INet4SocketAddress>::bind;
238     };
239
240     /** \brief Addressing policy supporting IPv6 addressing
241
242         \par Address Type:
243             INet6SocketAddress
244
245         This addressing policy implements addressing using Internet V6
246         addresses.
247
248         The various members are directly imported from
249         GenericAddressingPolicy which see for a detailed
250         documentation.
251      */
252     struct INet6AddressingPolicy
253         : public AddressingPolicyBase,
254           private GenericAddressingPolicy<INet6SocketAddress>
255     {
256         typedef INet6SocketAddress Address;
257
258         using GenericAddressingPolicy<INet6SocketAddress>::peer;
259         using GenericAddressingPolicy<INet6SocketAddress>::local;
260         using GenericAddressingPolicy<INet6SocketAddress>::connect;
261         using GenericAddressingPolicy<INet6SocketAddress>::bind;
262     };
263
264     /// @}
265
266 }
267
268 ///////////////////////////////hh.e////////////////////////////////////////
269 #include "INetAddressing.cci"
270 //#include "INetAddressing.ct"
271 //#include "INetAddressing.cti"
272 //#include "INetAddressing.mpp"
273 #endif
274
275 \f
276 // Local Variables:
277 // mode: c++
278 // fill-column: 100
279 // c-file-style: "senf"
280 // indent-tabs-mode: nil
281 // ispell-local-dictionary: "american"
282 // compile-command: "scons -u test"
283 // comment-column: 40
284 // End: