X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Socket%2FServerSocketHandle.hh;h=3a55787912d153601b0fd56af1b8cbeeee998383;hb=9a988902090d28007578e93bffd809f6bd913155;hp=a62636012a86b695627adade3f06eaa73f649eff;hpb=ac6a813d9d99f7add4e13aff7a4bcd314d5604a6;p=senf.git diff --git a/Socket/ServerSocketHandle.hh b/Socket/ServerSocketHandle.hh index a626360..3a55787 100644 --- a/Socket/ServerSocketHandle.hh +++ b/Socket/ServerSocketHandle.hh @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (C) 2006 +// Copyright (C) 2006 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) // Kompetenzzentrum fuer Satelitenkommunikation (SatCom) // Stefan Bund @@ -20,6 +20,10 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +/** \file + \brief ServerSocketHandle public header + */ + #ifndef HH_ServerSocketHandle_ #define HH_ServerSocketHandle_ 1 @@ -35,10 +39,38 @@ namespace senf { + /// \addtogroup handle_group + /// @{ template class ClientSocketHandle; - /** \brief + /** \brief Generic SocketHandle with server interface + + This class provides the server side policy interface of the socket abstraction. + ServerSocketHandle defines the complete policy interface. It does not implement any + functionality itself however. All calls are forwarded to the following policy classes: + + + + + + + +
senf::ServerSocketHandle::bind AddressingPolicy::bind (\ref senf::AddressingPolicyBase)
senf::ServerSocketHandle::listen CommunicationPolicy::listen (\ref senf::CommunicationPolicyBase)
senf::ServerSocketHandle::local AddressingPolicy::local (\ref senf::AddressingPolicyBase)
senf::ServerSocketHandle::accept CommunicationPolicy::accept (\ref senf::CommunicationPolicyBase)
senf::ServerSocketHandle::acceptfrom CommunicationPolicy::accept (\ref senf::CommunicationPolicyBase)
+ + A ServerSocketHandle is only meaningful for connection oriented addressable protocols + (CommunicationPolicy is ConnectedCommunicationPolicy and AddressingPolicy is not + NoAddressingPolicy). + + It is important to note, that not all members are always accessible. Which are depends on + the \c Policy template argument. If any of the policy axis is left unspecified the + corresponding members will not be callable (you will get a compile time error). Even if + every policy axis is defined, some members might (and will) not exist if they are + meaningless for the protocol of the socket. This depends on the exact policy. + + To find out, which members are available, you have to check the documentation of the policy + classes. You can also find a summary of all members available in the leaf protocol class + documentation. */ template class ServerSocketHandle @@ -48,8 +80,16 @@ namespace senf { /////////////////////////////////////////////////////////////////////////// // Types + /// Address type from the addressing policy typedef typename Policy::AddressingPolicy::Address Address; + /// 'Best' type for passing address as parameter + /** Depending on the type of \c Address, this will be either Address or Address + const &. See call_traits documentation in + the Boost.Utility library\endlink. + */ typedef typename boost::call_traits
::param_type AddressParam; + /// Corresponding client socket handle with the same policy typedef ClientSocketHandle ClientSocketHandle; /////////////////////////////////////////////////////////////////////////// @@ -67,7 +107,7 @@ namespace senf { typename SocketHandle::template IsCompatible::type * = 0); template - typename SocketHandle::template IsCompatible::type const & + typename SocketHandle::template IsCompatible::type const & operator=(ServerSocketHandle other); ///@} @@ -77,22 +117,75 @@ namespace senf { ///\name Server socket interface ///@{ + /** \brief Set local address + + For addressable protocols (AddressingPolicy is not NoAddressingPolicy), bind() will set + the local address of the socket. + + \param[in] addr Local socket address to asign + + \throws senf::SystemException + */ void bind (AddressParam addr); + + /** \brief Allow clients to connect to this server socket + + \todo This is very protocol specific, I don't want it in the policy + interface. Especially the backlog argument seems quite protocol specific to + me. However, we cannot listen() before we bind() so listen() cannot reside in the + constructor. We need to find a good solution here. + + \throws senf::SystemException + */ + // Possible solution: Make listen() an abstract method of the protocol interface, make the + // backlog parameter into a member living in the body or protocol class and set it using + // some accessor. Hmm ... this all seems somehow futile ... void listen (unsigned backlog=0); + /** \brief Query local address + + This member will return the address of the local socket in addressable protocols + (AddressingPolicy is not NoAddressingPolicy). + + There are two Variants of this member, one will return the address by value, the other + takes a reference argument to elide the copy operation. + + \throws senf::SystemException + */ Address local (); void local (Address & addr); + ///< Query local address + /**< \see \ref local() */ + + /** \brief Accept new connection + + If the handle is non-blocking, accept will NOT block. If no connection is available to + be returned, accept will return a ClientSocketHandle which is not valid() + + \throws senf::SystemException - // If the handle is non-blocking, accept will NOT block. If no connection - // is available to be returned, accept will return a ClientSocketHandle - // which is not valid() - ClientSocketHandle + This variant ... + + \returns handle of new client connection + */ + ClientSocketHandle accept (); std::pair - acceptfrom (); + acceptfrom (); ///< Accept new connection + /**< This variant will additionally return the remote + address of the client + \returns \c std::pair with client handle and client + address. + \see \ref accept() */ ClientSocketHandle acceptfrom (Address & addr); - + ///< Accept new connection + /**< This variant will additionally return the remote + address of the client + \param[out] client address + \returns handle of new client connection + \see \ref accept() */ + ///@} static ServerSocketHandle cast_static(FileHandle handle); @@ -107,9 +200,10 @@ namespace senf { explicit ServerSocketHandle(std::auto_ptr protocol); private: - + }; + /// @} } ///////////////////////////////hh.e//////////////////////////////////////// @@ -121,5 +215,8 @@ namespace senf { // Local Variables: // mode: c++ +// fill-column: 100 // c-file-style: "senf" +// indent-tabs-mode: nil +// ispell-local-dictionary: "american" // End: