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 "SocketPolicy.hh"
35 #include "ClientSocketHandle.hh"
36 #include "CommunicationPolicy.hh"
37 #include "GenericAddressingPolicy.hh"
39 //#include "INetAddressing.mpp"
40 ///////////////////////////////hh.p////////////////////////////////////////
44 /// \addtogroup addr_group
47 /** \brief IPv4 socket address
49 INet4Address wrapps the standard sockaddr_in datatype. It provides simple accessor methods
50 to accss the host and port. It does \e not integrate \c gethostbyname or DNS lookup.
52 \todo Implement real INet4Address datatype and rename this one to INet4SockAddress ...
53 \todo Implement more complete interface
54 \todo gethostbyname support ?
60 INet4Address(char const * address); ///< Set address and port
61 /**< See INet4Address(std::string)
62 \throws InvalidINetAddressException
63 \fixme Why do I need this version? Shouldn't the
64 std::string version be enough ? */
65 INet4Address(std::string address); ///< Set address and port
66 /**< This constructor expects a string of the form
67 'xxx.xxx.xxx.xxx:pppp'. The constructor will use this
68 value to initialize the host and port members. This
69 constructor does \e only support numeric ip addresses
71 \param[in] address Address and port
72 \throws InvalidINetAddressException */
73 INet4Address(std::string host, unsigned port); ///< Set address and port explicitly
74 /**< \param[in] host ip address in dotted-quad notation
75 \param[in] port port number
76 \throws InvalidINetAddressException */
79 bool operator==(INet4Address const & other) const; ///< Check INet4Address for equality
81 std::string str() const; ///< Return "address:port" string
82 std::string host() const; ///< Return address in doted quad notation
83 unsigned port() const; ///< Return portnumber
85 void clear(); ///< Clear address/port to 0.0.0.0:0
87 /// \name Generic Address Interface
90 struct sockaddr * sockaddr_p();
91 struct sockaddr const * sockaddr_p() const;
92 unsigned sockaddr_len() const;
97 void assignString(std::string addr);
99 struct ::sockaddr_in addr_;
102 /** \brief Write address and port to os
104 \related INet4Address
106 std::ostream & operator<<(std::ostream & os, INet4Address const & addr);
108 /** \brief IPv6 network address
115 ///////////////////////////////////////////////////////////////////////////
118 ///////////////////////////////////////////////////////////////////////////
119 ///\name Structors and default members
123 INet6Address(std::string const & addr);
124 INet6Address(char const * addr);
125 INet6Address(struct in6_addr const & addr);
128 ///////////////////////////////////////////////////////////////////////////
131 std::string address() const;
133 bool operator==(INet6Address const & other) const;
134 bool operator!=(INet6Address const & other) const;
136 struct in6_addr & addr();
137 struct in6_addr const & addr() const;
138 struct in6_addr * addr_p();
139 struct in6_addr const * addr_p() const;
140 unsigned addr_len() const;
145 struct in6_addr addr_;
148 std::ostream & operator<<(std::ostream & os, INet6Address const & addr);
150 /** \brief IPv6 socket address
152 \implementation The sockaddr_in6 structure has an sin6_flowinfo member. However RFC3493 does
153 not give the use of this field and specifies, that the field should be ignored ... so that's
154 what we do. Furthermore, the GNU libc reference states, that this field is not implemented
157 \idea Implement a INet6Address_ref class which has an interface identical to INet6Address
158 and is convertible to INet6Address (the latter has a conversion constructor taking the
159 former as arg). This class however references an external in6_addr instead of containing one
160 itself. This can be used in INet6SocketAddress to increase the performance of some
163 class INet6SocketAddress
166 ///////////////////////////////////////////////////////////////////////////
169 ///////////////////////////////////////////////////////////////////////////
170 ///\name Structors and default members
173 INet6SocketAddress();
174 INet6SocketAddress(std::string const & addr);
175 INet6SocketAddress(char const * addr);
176 INet6SocketAddress(INet6Address const & addr, unsigned port);
177 INet6SocketAddress(INet6Address const & addr, unsigned port, std::string const & iface);
178 INet6SocketAddress(std::string const & addr, std::string const & iface);
181 ///////////////////////////////////////////////////////////////////////////
183 bool operator==(INet6SocketAddress const & other) const;
184 bool operator!=(INet6SocketAddress const & other) const;
188 std::string address() const;
189 void address(std::string const & addr);
191 INet6Address host() const;
192 void host(INet6Address const & addr);
194 unsigned port() const;
195 void port(unsigned poirt);
197 std::string iface() const;
198 void iface(std::string const & iface);
200 ///\name Generic SocketAddress interface
203 struct sockaddr * sockaddr_p();
204 struct sockaddr const * sockaddr_p() const;
205 unsigned sockaddr_len() const;
212 void assignAddr(std::string const & addr);
213 void assignIface(std::string const & iface);
215 struct sockaddr_in6 sockaddr_;
218 std::ostream & operator<<(std::ostream & os, INet6SocketAddress const & addr);
220 /** \brief Signal invalid INet address syntax
222 \related INet4Address
223 \relatesalso INet6Address
225 struct InvalidINetAddressException : public std::exception
226 { char const * what() const throw() { return "invalid inet address"; } };
230 /// \addtogroup policy_impl_group
233 /** \brief Addressing policy supporting IPv4 addressing
238 This addressing policy implements addressing using Internet V4
241 The various members are directly importet from
242 GenericAddressingPolicy which see for a detailed
245 struct INet4AddressingPolicy
246 : public AddressingPolicyBase,
247 private GenericAddressingPolicy<INet4Address>
249 typedef INet4Address Address;
251 using GenericAddressingPolicy<INet4Address>::peer;
252 using GenericAddressingPolicy<INet4Address>::local;
253 using GenericAddressingPolicy<INet4Address>::connect;
254 using GenericAddressingPolicy<INet4Address>::bind;
257 /** \brief Addressing policy supporting IPv6 addressing
262 This addressing policy implements addressing using Internet V6
265 The various members are directly importet from
266 GenericAddressingPolicy which see for a detailed
271 struct INet6AddressingPolicy
272 : public AddressingPolicyBase,
273 private GenericAddressingPolicy<INet6SocketAddress>
275 typedef INet6SocketAddress Address;
277 using GenericAddressingPolicy<INet6SocketAddress>::peer;
278 using GenericAddressingPolicy<INet6SocketAddress>::local;
279 using GenericAddressingPolicy<INet6SocketAddress>::connect;
280 using GenericAddressingPolicy<INet6SocketAddress>::bind;
287 ///////////////////////////////hh.e////////////////////////////////////////
288 #include "INetAddressing.cci"
289 //#include "INetAddressing.ct"
290 //#include "INetAddressing.cti"
291 //#include "INetAddressing.mpp"
297 // c-file-style: "senf"