4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 // Stefan Bund <stefan.bund@fokus.fraunhofer.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 "INet4Address.hh"
40 #include "INet6Address.hh"
42 //#include "INetAddressing.mpp"
43 ///////////////////////////////hh.p////////////////////////////////////////
47 /** \brief IPv4 socket address
49 INet4Address wraps the standard sockaddr_in datatype. It provides simple accessor methods
50 to access the host and port. It does \e not integrate \c gethostbyname or DNS lookup.
52 \implementation This implementation is based on sockaddr_in, which is needed since it needs
53 to provide a non-const struct sockaddr * for legacy compatibility.
57 class INet4SocketAddress
58 : public boost::equality_comparable<INet4SocketAddress>,
59 public senf::ComparableSafeBool<INet4SocketAddress>
63 explicit INet4SocketAddress(std::string const & address); ///< Set address and port
64 /**< This constructor expects a string of the form
65 'host:port'. The constructor will use this value to
66 initialize the host and port members. Since it uses the
67 INet4Address::from_string constructor, this call may
68 block while waiting for the resolver.
69 \throws SyntaxException if the 'host:port' syntax is
71 \throws INet4Address::SyntaxException if the host part
72 cannot be converted to an IP address. */
74 INet4SocketAddress(INet4Address const & addr, unsigned port);
75 ///< Set address and port explicitly
76 /**< \param[in] addr IP address
77 \param[in] port port number */
79 bool operator==(INet4SocketAddress const & other) const;
80 ///< Check INet4SocketAddress for equality
82 INet4Address address() const; ///< Return address
83 unsigned port() const; ///< Return port number
85 bool boolean_test() const; ///< \c true, if address is empty (i.e. 0.0.0.0:0)
87 void clear(); ///< Clear address/port to 0.0.0.0:0
89 void address(INet4Address const & addr); ///< Set address
90 void port(unsigned p); ///< Set port number
92 /// \name Generic Address Interface
95 struct sockaddr * sockaddr_p();
96 struct sockaddr const * sockaddr_p() const;
97 unsigned sockaddr_len() const;
101 struct SyntaxException : public std::exception
102 { virtual char const * what() const throw()
103 { return "Invalid IpV4 socket address syntax"; } };
106 struct ::sockaddr_in addr_;
109 /** \brief Write address and port to os
111 \related INet4SocketAddress
113 std::ostream & operator<<(std::ostream & os, INet4SocketAddress const & addr);
115 /** \brief IPv6 socket address
117 This class wraps the standard \c sockaddr_in6 structure. INet6SocketAddress provides access
118 to all members of the sockaddr_in6 structure. Additionally, INet6SocketAddress supports the
119 string representations
122 <tt>[</tt> <i>address</i> [ <tt>%</tt> <i>zone-id</i> ] <tt>]:</tt> <i>port</i> \n
123 <i>hostname</i> <tt>:</tt> <i>port</i>
125 Where \e address is an arbitrary numeric IPv6 address, \e zone-id is an optional network
126 interface name and \e port is the port number. So some example addresses are
129 <tt>[2001:db8:1::1]:80</tt> \n
130 <tt>www.6bone.net:80</tt> \n
131 <tt>[fe80::1\%eth0]:443</tt>
133 \implementation The sockaddr_in6 structure has an sin6_flowinfo member. However RFC3493 does
134 not give the use of this field and specifies, that the field should be ignored ... so
135 that's what we do. Furthermore, the GNU libc reference states, that this field is not
136 implemented in the library.
138 \idea Implement a INet6Address_ref class which has an interface identical to INet6Address
139 and is convertible to INet6Address (the latter has a conversion constructor taking the
140 former as arg). This class however references an external in6_addr instead of containing
141 one itself. This can be used in INet6SocketAddress to increase the performance of some
146 class INet6SocketAddress
149 ///////////////////////////////////////////////////////////////////////////
152 ///////////////////////////////////////////////////////////////////////////
153 ///\name Structors and default members
156 INet6SocketAddress(); ///< Create empty instance
157 explicit INet6SocketAddress(std::string const & addr);
158 ///< Initialize/convert from string representation
159 INet6SocketAddress(INet6Address const & addr, unsigned port);
160 ///< Initialize from address and port
161 INet6SocketAddress(INet6Address const & addr, unsigned port, std::string const & iface);
162 ///< Initialize explicitly from given parameters
163 INet6SocketAddress(std::string const & addr, std::string const & iface);
164 ///< Initialize from URL representation and explit interface
167 ///////////////////////////////////////////////////////////////////////////
169 bool operator==(INet6SocketAddress const & other) const; ///< Check addresses for equality
170 bool operator!=(INet6SocketAddress const & other) const; ///< Inverse of above
172 void clear(); ///< Clear socket address
174 INet6Address address() const; ///< Get printable address representation
176 void address(INet6Address const & addr); ///< Change address
178 unsigned port() const; ///< Get port number
179 void port(unsigned poirt); ///< Change port number
181 std::string iface() const; ///< Get interface name
182 void iface(std::string const & iface); ///< Change interface
184 ///\name Generic SocketAddress interface
187 struct sockaddr * sockaddr_p();
188 struct sockaddr const * sockaddr_p() const;
189 unsigned sockaddr_len() const;
193 struct SyntaxException : public std::exception
194 { virtual char const * what() const throw()
195 { return "Invalid IpV6 socket address syntax"; } };
200 void assignAddr(std::string const & addr);
201 void assignIface(std::string const & iface);
203 struct sockaddr_in6 sockaddr_;
206 /** \brief Output INet6SocketAddress instance as it's string representation
207 \related INet6SocketAddress
209 std::ostream & operator<<(std::ostream & os, INet6SocketAddress const & addr);
211 /// \addtogroup policy_impl_group
214 /** \brief Addressing policy supporting IPv4 addressing
219 This addressing policy implements addressing using Internet V4
222 The various members are directly imported from
223 GenericAddressingPolicy which see for a detailed
226 struct INet4AddressingPolicy
227 : public AddressingPolicyBase,
228 private GenericAddressingPolicy<INet4SocketAddress>
230 typedef INet4SocketAddress Address;
232 using GenericAddressingPolicy<INet4SocketAddress>::peer;
233 using GenericAddressingPolicy<INet4SocketAddress>::local;
234 using GenericAddressingPolicy<INet4SocketAddress>::connect;
235 using GenericAddressingPolicy<INet4SocketAddress>::bind;
238 /** \brief Addressing policy supporting IPv6 addressing
243 This addressing policy implements addressing using Internet V6
246 The various members are directly imported from
247 GenericAddressingPolicy which see for a detailed
250 struct INet6AddressingPolicy
251 : public AddressingPolicyBase,
252 private GenericAddressingPolicy<INet6SocketAddress>
254 typedef INet6SocketAddress Address;
256 using GenericAddressingPolicy<INet6SocketAddress>::peer;
257 using GenericAddressingPolicy<INet6SocketAddress>::local;
258 using GenericAddressingPolicy<INet6SocketAddress>::connect;
259 using GenericAddressingPolicy<INet6SocketAddress>::bind;
266 ///////////////////////////////hh.e////////////////////////////////////////
267 #include "INetAddressing.cci"
268 //#include "INetAddressing.ct"
269 //#include "INetAddressing.cti"
270 //#include "INetAddressing.mpp"
277 // c-file-style: "senf"
278 // indent-tabs-mode: nil
279 // ispell-local-dictionary: "american"
280 // compile-command: "scons -u test"
281 // comment-column: 40