/** \file
\brief BSDSocketAddress public header */
-#ifndef HH_BSDSocketAddress_
-#define HH_BSDSocketAddress_ 1
+#ifndef HH_SENF_Socket_Protocols_BSDSocketAddress_
+#define HH_SENF_Socket_Protocols_BSDSocketAddress_ 1
// Custom includes
+#include <boost/type_traits/alignment_of.hpp>
+#include <boost/type_traits/type_with_alignment.hpp>
#include "../../Utils/safe_bool.hh"
#include <sys/socket.h>
#include <iostream>
It is \e not possible to create or store BSDSocketAddress instances: You must either store
an address in one of the specifically typed subclasses or using GenericBSDSocketAddress.
+ A BSDSocketAddress or GenericBSDSocketAddress can be cast (like a downcast) to (the correct)
+ type specific cast using sockaddr_cast:
+
+ \code
+ void foo(senf::BSDSOcketAddress const & addr)
+ {
+ if (addr.family() == senf::INet4SocketAddress::addressFamily) {
+ senf::INet4SocketAddress i4addr (
+ senf::sockaddr_cast<senf::INet4SocketAddress>(addr) );
+ ...
+ }
+ }
+ \endcode
+
All these classes provide a generic \c sockaddr API to interface with legacy \c sockaddr
based code (e.g. the BSD socket API). In this base-class, this interface is read-only, the
derived classes however provide a read-write interface.
void socklen(socklen_t len);
private:
-
- socklen_t len_;
+
+ // The following incantation is needed to fix the alignment of the sockaddr data members
+ // which will be added by the derived classes later: The alignment must be forced
+ // to coincide with the struct sockaddr_storage alignment (which must have the largest
+ // alignment of all sockaddr types).
+ union {
+ socklen_t len_;
+ boost::type_with_alignment<boost::alignment_of<struct sockaddr_storage>::value> a_;
+ char _b[boost::alignment_of<struct sockaddr_storage>::value];
+ };
};
/** \brief Safe socket address down-cast