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 BSDSocketAddress public header */
26 #ifndef HH_SENF_Socket_Protocols_BSDSocketAddress_
27 #define HH_SENF_Socket_Protocols_BSDSocketAddress_ 1
30 #include <boost/type_traits/alignment_of.hpp>
31 #include <boost/type_traits/type_with_alignment.hpp>
32 #include "../../Utils/safe_bool.hh"
33 #include <sys/socket.h>
36 //#include "BSDSocketAddress.mpp"
37 ///////////////////////////////hh.p////////////////////////////////////////
41 /** \brief Socket addressing, BSD style
43 BSDSocketAddress is the base class of all BSD \c sockaddr based addressing classes. The \c
44 sockaddr addressing interface is split into several parts
46 \li The BSDSocketAddress provides a read-only and generic \c sockaddr interface
47 \li Address family specific derived classes implement addressing of a specific type. These
48 are INet4SocketAddress (\c AF_INET), INet6SocketAddress (\c AF_INET6), UNSocketAddress
49 (\c AF_UNIX) and LLSocketAddress (\c AF_PACKET)
50 \li GenericBSDSocketAddress provides writable support for generic addresses.
52 It is \e not possible to create or store BSDSocketAddress instances: You must either store
53 an address in one of the specifically typed subclasses or using GenericBSDSocketAddress.
55 A BSDSocketAddress or GenericBSDSocketAddress can be cast (like a downcast) to (the correct)
56 type specific cast using sockaddr_cast:
59 void foo(senf::BSDSOcketAddress const & addr)
61 if (addr.family() == senf::INet4SocketAddress::addressFamily) {
62 senf::INet4SocketAddress i4addr (
63 senf::sockaddr_cast<senf::INet4SocketAddress>(addr) );
69 All these classes provide a generic \c sockaddr API to interface with legacy \c sockaddr
70 based code (e.g. the BSD socket API). In this base-class, this interface is read-only, the
71 derived classes however provide a read-write interface.
75 class BSDSocketAddress
76 : public senf::comparable_safe_bool<BSDSocketAddress>
79 bool operator==(BSDSocketAddress const & other) const; ///< Compare two arbitrary addresses
80 /**< For addresses to be considered equal, they must have
81 the same family, length and the data must be
83 bool operator!=(BSDSocketAddress const & other) const; ///< Inverse of operator==
85 bool boolean_test() const; ///< Return \c true, if address is not empty
86 /**< An address is considered empty if
87 \li the family is AF_UNSPEC
89 \li or all data bytes are 0 */
91 short family() const; ///< Return the address family.
92 /**< This value is found in the \c addressFamily member of
93 each typed derived class
94 (e.g. INet4Address::addressFamily) */
96 ///////////////////////////////////////////////////////////////////////////
97 ///\name Generic sockaddr interface
100 struct sockaddr const * sockaddr_p() const;
101 socklen_t socklen() const;
102 socklen_t const * socklen_p() const;
107 BSDSocketAddress(socklen_t len, short family);
108 BSDSocketAddress(BSDSocketAddress const & other);
109 BSDSocketAddress & operator=(BSDSocketAddress const & other);
111 struct sockaddr * sockaddr_p();
112 socklen_t * socklen_p();
114 void socklen(socklen_t len);
118 // The following incantation is needed to fix the alignment of the sockaddr data members
119 // which will be added by the derived classes later: The alignment must be forced
120 // to coincide with the struct sockaddr_storage alignment (which must have the largest
121 // alignment of all sockaddr types).
124 boost::type_with_alignment<boost::alignment_of<struct sockaddr_storage>::value> a_;
125 char _b[boost::alignment_of<struct sockaddr_storage>::value];
129 /** \brief Safe socket address down-cast
131 sockaddr_cast allows to safely cast a socket address to it's derived type. Only the family
132 specific derived addressing classes are permissible for \a Target.
134 This cast is especially useful to cast a GenericBSDSocketAddress to it's concrete type.
136 \related BSDSocketAddress
138 template <class Target>
139 Target & sockaddr_cast(BSDSocketAddress & source);
141 /** \brief Safe socket address down-cast (const)
143 \related BSDSocketAddress
145 template <class Target>
146 Target const & sockaddr_cast(BSDSocketAddress const & source);
148 /** \brief Output generic socket address
150 This stream operator will output a generic BSDSocketAddress in a family depending format.
152 \related BSDSocketAddress
154 std::ostream & operator<<(std::ostream & os, BSDSocketAddress const & addr);
156 /** \brief Generic BSD \c sockaddr storage
158 While BSDSocketAddress provides read-only generic \c sockaddr access,
159 GenericBSDSocketAddress allows to store (write) arbitrary socket addresses. (It is
160 internally based on \c sockaddr_storage).
162 To access the stored address, use sockaddr_cast to cast the GenericBSDSocketAddress to the
163 correct family specific address class.
167 class GenericBSDSocketAddress
168 : public BSDSocketAddress
171 ///////////////////////////////////////////////////////////////////////////
172 ///\name Structors and default members
175 GenericBSDSocketAddress();
176 GenericBSDSocketAddress(BSDSocketAddress const & other);
177 GenericBSDSocketAddress& operator=(const BSDSocketAddress & other);
179 GenericBSDSocketAddress(const GenericBSDSocketAddress& other);
180 GenericBSDSocketAddress& operator=(const GenericBSDSocketAddress& other);
183 ///////////////////////////////////////////////////////////////////////////
184 ///\name Generic sockaddr interface
187 struct sockaddr const * sockaddr_p() const;
188 struct sockaddr * sockaddr_p();
190 using BSDSocketAddress::socklen_p;
197 struct sockaddr_storage addr_;
202 ///////////////////////////////hh.e////////////////////////////////////////
203 #include "BSDSocketAddress.cci"
204 //#include "BSDSocketAddress.ct"
205 //#include "BSDSocketAddress.cti"
212 // comment-column: 40
213 // c-file-style: "senf"
214 // indent-tabs-mode: nil
215 // ispell-local-dictionary: "american"
216 // compile-command: "scons -u test"