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);
120 boost::type_with_alignment<boost::alignment_of<struct sockaddr_storage>::value> _;
124 /** \brief Safe socket address down-cast
126 sockaddr_cast allows to safely cast a socket address to it's derived type. Only the family
127 specific derived addressing classes are permissible for \a Target.
129 This cast is especially useful to cast a GenericBSDSocketAddress to it's concrete type.
131 \related BSDSocketAddress
133 template <class Target>
134 Target & sockaddr_cast(BSDSocketAddress & source);
136 /** \brief Safe socket address down-cast (const)
138 \related BSDSocketAddress
140 template <class Target>
141 Target const & sockaddr_cast(BSDSocketAddress const & source);
143 /** \brief Output generic socket address
145 This stream operator will output a generic BSDSocketAddress in a family depending format.
147 \related BSDSocketAddress
149 std::ostream & operator<<(std::ostream & os, BSDSocketAddress const & addr);
151 /** \brief Generic BSD \c sockaddr storage
153 While BSDSocketAddress provides read-only generic \c sockaddr access,
154 GenericBSDSocketAddress allows to store (write) arbitrary socket addresses. (It is
155 internally based on \c sockaddr_storage).
157 To access the stored address, use sockaddr_cast to cast the GenericBSDSocketAddress to the
158 correct family specific address class.
162 class GenericBSDSocketAddress
163 : public BSDSocketAddress
166 ///////////////////////////////////////////////////////////////////////////
167 ///\name Structors and default members
170 GenericBSDSocketAddress();
171 GenericBSDSocketAddress(BSDSocketAddress const & other);
172 GenericBSDSocketAddress& operator=(const BSDSocketAddress & other);
174 GenericBSDSocketAddress(const GenericBSDSocketAddress& other);
175 GenericBSDSocketAddress& operator=(const GenericBSDSocketAddress& other);
178 ///////////////////////////////////////////////////////////////////////////
179 ///\name Generic sockaddr interface
182 struct sockaddr const * sockaddr_p() const;
183 struct sockaddr * sockaddr_p();
185 using BSDSocketAddress::socklen_p;
192 struct sockaddr_storage addr_;
197 ///////////////////////////////hh.e////////////////////////////////////////
198 #include "BSDSocketAddress.cci"
199 //#include "BSDSocketAddress.ct"
200 //#include "BSDSocketAddress.cti"
207 // comment-column: 40
208 // c-file-style: "senf"
209 // indent-tabs-mode: nil
210 // ispell-local-dictionary: "american"
211 // compile-command: "scons -u test"