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_BSDSocketAddress_
27 #define HH_BSDSocketAddress_ 1
30 #include "../../Utils/safe_bool.hh"
31 #include <sys/socket.h>
34 //#include "BSDSocketAddress.mpp"
35 ///////////////////////////////hh.p////////////////////////////////////////
39 /** \brief Socket addressing, BSD style
41 BSDSocketAddress is the base class of all BSD \c sockaddr based addressing classes. The \c
42 sockaddr addressing interface is split into several parts
44 \li The BSDSocketAddress provides a read-only and generic \c sockaddr interface
45 \li Address family specific derived classes implement addressing of a specific type. These
46 are INet4SocketAddress (\c AF_INET), INet6SocketAddress (\c AF_INET6), UNSocketAddress
47 (\c AF_UNIX) and LLSocketAddress (\c AF_PACKET)
48 \li GenericBSDSocketAddress provides writable support for generic addresses.
50 It is \e not possible to create or store BSDSocketAddress instances: You must either store
51 an address in one of the specifically typed subclasses or using GenericBSDSocketAddress.
53 A BSDSocketAddress or GenericBSDSocketAddress can be cast (like a downcast) to (the correct)
54 type specific cast using sockaddr_cast:
57 void foo(senf::BSDSOcketAddress const & addr)
59 if (addr.family() == senf::INet4SocketAddress::addressFamily) {
60 senf::INet4SocketAddress i4addr (
61 senf::sockaddr_cast<senf::INet4SocketAddress>(addr) );
67 All these classes provide a generic \c sockaddr API to interface with legacy \c sockaddr
68 based code (e.g. the BSD socket API). In this base-class, this interface is read-only, the
69 derived classes however provide a read-write interface.
73 class BSDSocketAddress
74 : public senf::comparable_safe_bool<BSDSocketAddress>
77 bool operator==(BSDSocketAddress const & other) const; ///< Compare two arbitrary addresses
78 /**< For addresses to be considered equal, they must have
79 the same family, length and the data must be
81 bool operator!=(BSDSocketAddress const & other) const; ///< Inverse of operator==
83 bool boolean_test() const; ///< Return \c true, if address is not empty
84 /**< An address is considered empty if
85 \li the family is AF_UNSPEC
87 \li or all data bytes are 0 */
89 short family() const; ///< Return the address family.
90 /**< This value is found in the \c addressFamily member of
91 each typed derived class
92 (e.g. INet4Address::addressFamily) */
94 ///////////////////////////////////////////////////////////////////////////
95 ///\name Generic sockaddr interface
98 struct sockaddr const * sockaddr_p() const;
99 socklen_t socklen() const;
100 socklen_t const * socklen_p() const;
105 BSDSocketAddress(socklen_t len, short family);
106 BSDSocketAddress(BSDSocketAddress const & other);
107 BSDSocketAddress & operator=(BSDSocketAddress const & other);
109 struct sockaddr * sockaddr_p();
110 socklen_t * socklen_p();
112 void socklen(socklen_t len);
119 /** \brief Safe socket address down-cast
121 sockaddr_cast allows to safely cast a socket address to it's derived type. Only the family
122 specific derived addressing classes are permissible for \a Target.
124 This cast is especially useful to cast a GenericBSDSocketAddress to it's concrete type.
126 \related BSDSocketAddress
128 template <class Target>
129 Target & sockaddr_cast(BSDSocketAddress & source);
131 /** \brief Safe socket address down-cast (const)
133 \related BSDSocketAddress
135 template <class Target>
136 Target const & sockaddr_cast(BSDSocketAddress const & source);
138 /** \brief Output generic socket address
140 This stream operator will output a generic BSDSocketAddress in a family depending format.
142 \related BSDSocketAddress
144 std::ostream & operator<<(std::ostream & os, BSDSocketAddress const & addr);
146 /** \brief Generic BSD \c sockaddr storage
148 While BSDSocketAddress provides read-only generic \c sockaddr access,
149 GenericBSDSocketAddress allows to store (write) arbitrary socket addresses. (It is
150 internally based on \c sockaddr_storage).
152 To access the stored address, use sockaddr_cast to cast the GenericBSDSocketAddress to the
153 correct family specific address class.
157 class GenericBSDSocketAddress
158 : public BSDSocketAddress
161 ///////////////////////////////////////////////////////////////////////////
162 ///\name Structors and default members
165 GenericBSDSocketAddress();
166 GenericBSDSocketAddress(BSDSocketAddress const & other);
167 GenericBSDSocketAddress& operator=(const BSDSocketAddress & other);
169 GenericBSDSocketAddress(const GenericBSDSocketAddress& other);
170 GenericBSDSocketAddress& operator=(const GenericBSDSocketAddress& other);
173 ///////////////////////////////////////////////////////////////////////////
174 ///\name Generic sockaddr interface
177 struct sockaddr const * sockaddr_p() const;
178 struct sockaddr * sockaddr_p();
180 using BSDSocketAddress::socklen_p;
187 struct sockaddr_storage addr_;
192 ///////////////////////////////hh.e////////////////////////////////////////
193 #include "BSDSocketAddress.cci"
194 //#include "BSDSocketAddress.ct"
195 //#include "BSDSocketAddress.cti"
202 // comment-column: 40
203 // c-file-style: "senf"
204 // indent-tabs-mode: nil
205 // ispell-local-dictionary: "american"
206 // compile-command: "scons -u test"