/** \defgroup protocol_group The Protocol Classes
- <div class="diamap" name="Protocols">
- <span coords="0,0,118,25">\ref SocketProtocol</span>
- <span coords="139,381,279,407">\ref UNSocketProtocol</span>
- <span coords="527,412,693,438">\ref PacketSocketProtocol</span>
- <span coords="214,49,471,86">\ref ConcreteSocketProtocol</span>
- <span coords="135,112,283,137">\ref BSDSocketProtocol</span>
- <span coords="114,258,304,284">\ref DatagramSocketProtocol</span>
- <span coords="136,320,281,346">\ref TCPSocketProtocol</span>
- <span coords="395,446,604,472">\ref UNDatagramSocketProtocol</span>
- <span coords="89,189,329,215">\ref AddressableBSDSocketProtocol</span>
- <span coords="282,481,444,507">\ref TCPv4SocketProtocol</span>
- </div>
- \htmlonly <img src="Protocols.png" border="0" alt="Protocols" usemap="#Protocols"> \endhtmlonly
+ \diaimage Protocols.dia
The socket handle classes and templates only implement the most important socket API methods
using the policy framework. To access the complete API, the protocol interface is
#include "SocketHandle.ih"
//#include "SocketProtocol.mpp"
-///////////////////////////////hh.p////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
namespace senf {
/// \addtogroup protocol_group
- /// @{
+ //\{
class SocketPolicyBase;
\attention SocketProtocol must \e always be inherited using public \e virtual inheritance.
*/
- class SocketProtocol
+ class SocketProtocol
: boost::noncopyable
{
public:
- ///////////////////////////////////////////////////////////////////////////
+ //-////////////////////////////////////////////////////////////////////////
// Types
- ///////////////////////////////////////////////////////////////////////////
+ //-////////////////////////////////////////////////////////////////////////
///\name Structors and default members
- ///@{
+ //\{
SocketProtocol();
virtual ~SocketProtocol() = 0;
// no copy
// no conversion constructors
- ///@}
- ///////////////////////////////////////////////////////////////////////////
+ //\}
+ //-////////////////////////////////////////////////////////////////////////
virtual SocketPolicyBase const & policy() const = 0;
///< Access the policy instance
- ///////////////////////////////////////////////////////////////////////////
+ //-////////////////////////////////////////////////////////////////////////
// Virtual interface
virtual unsigned available() const = 0;
in a single (non-blocking) read operation. If the
socket does not support reading (viz. NotReadablePolicy
is set), this member should always return \c 0.
-
+
Depending on the protocol, it may not be possible to
return a good value. In this case, an upper bound may
be returned (e.g.: When reading from a socket which
virtual void close(); ///< Close socket
/**< This override will automatically \c shutdown() the
socket whenever it is closed.
- \throws senf::SystemException
+ \throws senf::SystemException
\fixme Move into (at least) BSDSOcketProtocol */
-
+
virtual void terminate() const; ///< Forcibly close socket
/**< This override will automatically \c shutdown() the
socket whenever it is called. Additionally it will
disable SO_LINGER to ensure, that v_terminate will not
block. Like the overriden method, this member will ignore
failures and will never throw. It is therefore safe to be
- called from a destructor.
+ called from a destructor.
\fixme Move into (at least) BSDSocketProtocol */
virtual void state(SocketStateMap & map, unsigned lod) const;
\a lod value with a default value of 0. The
interpretation of the \a lod value is completely
implementation defined.
-
+
Every class derived from SocketProtocol should
reimplement state(). The reimplemented method should
call (all) baseclass-implementations of this
keys are interpreted as hierarchical strings with '.'
as a separator (like hostnames or struct or class
members). They are automatically sorted correctly.
-
+
The values are std:string with one additional feature:
they allow assignment or conversion from *any* type as
long as that type is streamable. This simplifies
assigning non-string values to the map:
-
+
\code
map["socket.protocol.ip.address"] << peer();
map["socket.protocol.tcp.backlog"] << backlog();
\endcode
-
+
This will work even if peer() returns an ip-address
object or backlog() returns an integer. The values are
automatically converted to their string representation.
-
+
Additionally, if the slot the date is written to is not
empty, the <tt>\<\<</tt> operator will add add a comma
as separator. */
friend class SocketBody;
};
-
+
template <class SPolicy> class ClientSocketHandle;
template <class SPolicy> class ServerSocketHandle;
protocols themselves, they are combined to build concrete protocols. This structure will
remove a lot of code duplication. It is important to ensure, that the protocol facets do not
overlap, since otherwise there will be problems resolving overlapping members.
-
+
\doc init_client init_server
*/
template <class SocketPolicy, class Self>
: public virtual SocketProtocol
{
public:
- ///////////////////////////////////////////////////////////////////////////
+ //-////////////////////////////////////////////////////////////////////////
// Types
typedef SocketPolicy Policy; ///< The protocols policy
- ///////////////////////////////////////////////////////////////////////////
+ //-////////////////////////////////////////////////////////////////////////
///\name Structors and default members
- ///@{
+ //\{
~ConcreteSocketProtocol() = 0;
// no copy
// no conversion constructors
- ///@}
- ///////////////////////////////////////////////////////////////////////////
+ //\}
+ //-////////////////////////////////////////////////////////////////////////
Policy const & policy() const;
-
+
protected:
- ClientSocketHandle<Policy> clientHandle() const;
+ ClientSocketHandle<Policy> clientHandle() const;
///< Get client handle for associated socket
/**< Returns a client handle for the socket associated with
this protocol instance */
Policy policy_;
};
- /// @}
+ //\}
}
-///////////////////////////////hh.e////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
#include "SocketProtocol.cci"
//#include "SocketProtocol.ct"
#include "SocketProtocol.cti"