/** \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
\attention SocketProtocol must \e always be inherited using public \e virtual inheritance.
*/
- class SocketProtocol
+ class SocketProtocol
: boost::noncopyable
{
public:
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>
///////////////////////////////////////////////////////////////////////////
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 */