X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FMainpage.dox;h=2296b5d965178cc16eb5e23efde7a706131ee0f6;hb=245bdb920e5f8fc1150794db8d0b42a15fa2cd15;hp=15993a6fe46a70ebe976bf3f40549d89e04fe356;hpb=62464586315edf52fbcc613acb4a8a7e919fd8e2;p=senf.git diff --git a/Socket/Mainpage.dox b/Socket/Mainpage.dox index 15993a6..2296b5d 100644 --- a/Socket/Mainpage.dox +++ b/Socket/Mainpage.dox @@ -1,15 +1,18 @@ +namespace senf { + /** \mainpage The SENF Socket Library The Socket library provides a high level and object oriented abstraction of the BSD socket API. The abstraction is based on several concepts: - \li The basic visible interface is a handle object - (senf::FileHandle and it's derived classes) - \li The socket interface relies on a policy framework to configure - it's functionality + \li The basic visible interface is a \link handle_group handle + object \endlink + \li The socket interface relies on a \link policy_group policy + framework \endlink to configure it's functionality \li The rest of the socket API is accessible using a classic - inheritance hierarchy of protocol classes + inheritance hierarchy of \link protocol_group protocol classes + \endlink The handle/body architecture provides automatic reference counted management of socket instances, the policy framework provides @@ -19,134 +22,201 @@ dependent options. \see \ref usage \n - \ref extend \n + \ref handle_group \n + \ref policy_group \n + \ref protocol_group \n + \ref extend \n \ref implementation */ /** \page usage Using the Socket Library - \section socket_handle The socket handle - Whenever you use the socket library, what you will be dealing with - are senf::FileHandle derived instances. The socket library relies + are FileHandle derived instances. The socket library relies on reference counting to automatically manage the underlying socket representation. This frees you of having to manage the socket lifetime explicitly. + + \section usage_create Creating a Socket Handle + + To create a new socket handle (opening a socket), you will need to + use ProtocolClientSocketHandle or + ProtocolServerSocketHandle. You will probably not use these + templates as is but use proper typedefs (for example + TCPv4ClientSocketHandle or PacketSocketHandle). The + documentation for these socket handles are found in the protocol + class (for example TCPv4SocketProtocol or + PacketProtocol). + + \section usage_reusable Writing Reusable Components + + To make your code more flexible, you should not pass around your + socket in this form. Most of your code will be using only a small + subset of the ProtocolClientSocketHandle or + ProtocolServerSocketHandle API. If instead of using the + fully specified handle type you use a more incomplete type, you + allow your code to be used with all socket which fulfill the + minimal requirements of your code. + + This works, by defining a special reduced policy or handle for + your code: + + \code + typedef ClientSocketHandle< + MakeSocketPolicy< + ReadablePolicy, + StreamFramingPolicy, + ConnectedCommunicationPolicy > > MyReadableHandle; + + \endcode + + This defines \c MyReadableHandle as a ClientSocketHandle + which will have only read functionality. Your code expects a + stream interface (in contrast to a packet or datagram based + interface). You will not have \c write or \c readfrom members. \c + write will be disabled since the WritePolicy is unknown, \c + readfrom will be disabled since a socket with the + ConnectedCommunicationPolicy does not have a \c readfrom + member. + */ - \section socket_hierarchy The FileHandle hierarchy - - \image html FhHierarchy.png - - The senf::FileHandle class is the base of a hierarchy of socket - handle classes (realized as templates). These classes provide an - interface to the complete socket API. While going down the - inheritance hierarchy, the interface will be more and more - complete. - - The most complete interface is provided by - senf::ProtocolClientSocketHandle and - senf::ProtocolServerSocketHandle. The template Arguments specifies - the Protocol class of the underlying socket type. These are the - \e only classes having public constructors and are therefore the - only classes, which may be created by the library user. You will - normally use these classes by naming a specific socket typedef - (e.g. senf::TCPv4ClientSocketHandle). - - However, to aid writing flexible and generic code, the socket - library provides the senf::ClientSocketHandle and - senf::ServerSocketHandle class templates. These templates - implement a family of closely related classes based on the - specification of the socket policy. This policy specification may - be \e incomplete (see below). Instances of - senf::ClientSocketHandle/senf::ServerSocketHandle can be assigned - and converted to different ClientSocketHandle/ServerSocketHandle - types as long as the policy specifications are compatible. - - \attention It is very important, to (almost) always pass the socket - handle by value. The socket handle is a very lightweight - class and designed to be used like an ordinary built-in type. This - is very important in combination with the policy interface. - - \section policy_framework The policy framework - - \image html SocketPolicy.png - - The policy framework conceptually implements a list of parallel - inheritance hierarchies each covering a specific interface aspect - of the socket handle. The socket handle itself only provides - minimal functionality. All further functionality is relayed to a - policy class, or more precisely, to a group of policy classes, one - for each policy axis. The policy axis are - -
-
addressingPolicy
-
configures, whether a socket is - addressable and if so, configures the address type
- -
framingPolicy
-
configures the type of framing the socket provides: either no - framing providing a simple i/o stream or packet framing
- -
communicationPolicy
-
configures,if and how the communication partner is - selected
- -
readPolicy
-
configures the readability of the socket
+ + +/** \page extend Extending the Library -
writePolicy
-
configures the writability of the socket
+ There are two layers, on which the socket library can be + extended: On the protocol layer and on the policy layer. Extending + the protocol layer is quite simple and works as long as the + desired protocol does use the same BSD API used by the standard + internet protocols as implemented in the standard policies + (i.e. it uses ordinary read() and write() or rcvfrom() or sendto() + calls and so on). + + If however the implementation of a policy feature needs to be + changed, a new policy class has to be written. This also is not + very complicated however the integration is more complex. + + \section extend_protocol Writing a new protocol class -
bufferingPolicy
-
configures, if and how buffering is configured for a socket
-
- - Every Policy value is identified by a class type. The policy types - themselves built an inheritance hierarchy for each policy - axis. For each policy axis, the root of this tree is the class - named '(axis name)Base' (e.g. \p FramingPolicyBase or \p - CommunicationPolicyBase) which is aliased to 'Unspecified(axis - name)' (e.g. \p UnspecifiedFramingPolicy or \p - UnspecifiedCommunicationPolicy). - - The senf::SocketPolicy template combines a set of policy classes, - one for each policy axis. Together, they define the behavior of a - socket handle. The socket handle instances do net implement any - socket functionality themselves, instead defering the - implementation to the socket classes. The interface is therefore - \e not implemented using virtual members, all important socket - functions can be inlined by the compiler to create highly - efficient code. - - Two SocketPolicy instances are considered compatible, if all - policy axis are compatible. A policy axis is compatible, if one - policy class is either the same as the other or derived from - it. Two SocketHandle instances can be converted into each other, - as long as the SocketPolicies are compatible. - - \section policy_interface The policy interface - - The socket handle classes and templates only implement the most - important socket API methods. To access the complete API, the - protocol interface is provided. Access to the protocol interface - is only possible via senf::ProtocolClientSocketHandle and - senf::ProtocolServerSocketHandle which have the necessary \c - protocol() member. This member returns a reference to the protocol - class instance which contains members covering all the API - function snot found in the SocketHandle interface. The protocol - interface is specific to the protocol. It's implementation is - quite free. Every protocol class will define the complete and - specific socket policy of it's socket handle. + Most protocols can be implemented by just implementing a new + protocol class. The protocol class must be derived from + ConcreteSocketProtocol and takes the socket policy (as + created by MakeSocketPolicy) as a template argument. See the + documentation of this class for the interface. + + \attention You may want to use multiple inheritance as it is used + in the implementation of the standard protocols (See \ref + protocol_group). You must however be extra careful to ensure, that + every class ultimately has SocketPolicy as a public \e + virtual base. + + After the protocol class has been defined, you will probably want to + provide typedefs for the new protocol sockets. If the new protocol + is connection oriented, this will be like + \code + typedef ProtocolClientSocketHandle MyProtocolClientSocketHandle; + typedef ProtocolServerSocketHandle MyProtocolServerSocketHandle; + \endcode + + \section extend_policy Extending the policy framework + + If you have to extend the policy framework, you will need to be + aware of some important limitations of the socket library: + + \li When you define a new policy for some axis, this new policy + must not be derived from one of the existing concrete + policy classes (except of course the respective policy axis + base class). This is important since the policy type is \e not + polymorphic. The policy to be used is selected by the compiler + using the \e static type, which is exactly what is desired, + since this allows calls to be efficiently inlined. + + \li Therefore, extending the policy framework will make the new + socket probably \e incompatible with generic code which relies + on the policy axis which is extended. Example: If you write a + new write policy because your protocol does not use ordinary + write() system calls but some protocol specific API, Then any + generic function relying on WritablePolicy will \e not + work with the new socket, since the socket does \e not have + this policy, it has some other kind of write policy. + + Therefore you need to be careful of what you are doing. The first + step is to find out, which policy you will have to implement. For + this, find the ClientSocketHandle and/or + ServerSocketHandle members you want to change (see \ref + ClientSocketHandle and \ref ServerSocketHandle). Not + all policy axis directly contribute to the SocketHandle + interface. However, some policy members additionally depend on + other policy axis (example: AddressingPolicy::connect is only + defined if the communication policy is + ConnectedCommunication). + + \see policy_group */ -/** \page extend Extending the Library +/** \page glossary Glossary + + + + + + + + + + + + + + + + + + + + + +
policy collection of policy classes, one for each + policy axis, instantiation of the SocketPolicy template
policy axis one aspect defined in the socket + policy, typedef and member of the SocketPolicy template
policy class implementation of a single policy + axis, class derived from the axis base class
complete policy socket policy where each + axis is specified completely
incomplete policy socket policy, where at + least one axis is not fully specified
protocol class definition of a protocol as a + class, class inheriting from ConcreteSocketProtocol.
protocol facet a class providing some subset of + the protocol interface, class derived from SocketProtocol but not + from ConcreteSocketProtocol
policy interface interface directly provided by + ClientSocketHandle/ServerSocketHandle and defined through the + policy
protocol interface interface provided by the + protocol class and accessible via the + ProtocolClientSocketHandle::protocol()/ProtocolServerSocketHandle::protocol() + member
*/ /** \page implementation Implementation notes + + \section class_diagram Class Diagram \image html SocketLibrary-classes.png + + \section impl_notes Arbitrary Implementation Notes + + \li The implementation tries to isolate the library user as much + as possible from the system header files since those headers + define a lot of define symbols and introduce a host of symbols + into the global namespace. This is, why some classes define + their own \c enum types to replace system defined define + constants. This also precludes inlining some functionality. + + \li To reduce overhead, template functions/members which are + more than one-liners are often implemented in terms of a + non-template function/member. This is also used to further the + isolation from system headers as defined above (template code + must always be included into every compilation unit together + with all headers need for the implementation). */ +} + // Local Variables: // mode: c++