Click here to Skip to main content
15,892,005 members
Articles / Programming Languages / C++

RCF - Interprocess Communication for C++

Rate me:
Please Sign up or sign in to vote.
4.94/5 (147 votes)
25 Oct 2011CPOL20 min read 4.6M   8.4K   331  
A server/client IPC framework, using the C++ preprocessor as an IDL compiler.
\section{RCF::Rcf\-Server Class Reference}
\label{class_r_c_f_1_1_rcf_server}\index{RCF::RcfServer@{RCF::RcfServer}}
{\tt \#include $<$Rcf\-Server.hpp$>$}

Inheritance diagram for RCF::Rcf\-Server::\begin{figure}[H]
\begin{center}
\leavevmode
\includegraphics[height=2cm]{class_r_c_f_1_1_rcf_server}
\end{center}
\end{figure}


\subsection{Detailed Description}
Server class, supporting pluggable transports and services. 

\subsection*{Public Member Functions}
\begin{CompactItemize}
\item 
{\bf Rcf\-Server} (const {\bf I\_\-Endpoint} \&endpoint)
\begin{CompactList}\small\item\em Constructor. \item\end{CompactList}\item 
{\bf Rcf\-Server} (Service\-Ptr service\-Ptr)
\begin{CompactList}\small\item\em Constructor. \item\end{CompactList}\item 
{\bf Rcf\-Server} (Server\-Transport\-Ptr server\-Transport\-Ptr)
\begin{CompactList}\small\item\em Constructor. \item\end{CompactList}\item 
{\bf $\sim$Rcf\-Server} ()\label{class_r_c_f_1_1_rcf_server_0a78239b3654810132ab27c1c8b91e05}

\begin{CompactList}\small\item\em Destructor. \item\end{CompactList}\item 
void {\bf start} (bool spawn\-Threads=true)
\begin{CompactList}\small\item\em Starts the server, by starting all services, including transports. \item\end{CompactList}\item 
void {\bf add\-Join\-Functor} (Join\-Functor join\-Functor)
\begin{CompactList}\small\item\em Adds a join functor to the server, to be called when stopping the server. \item\end{CompactList}\item 
void {\bf start\-In\-This\-Thread} ()
\begin{CompactList}\small\item\em Starts the server, by taking over the current thread. \item\end{CompactList}\item 
void {\bf start\-In\-This\-Thread} (Join\-Functor join\-Functor)
\begin{CompactList}\small\item\em Starts the server, by taking over the current thread. \item\end{CompactList}\item 
void {\bf stop} (bool wait=true)
\begin{CompactList}\small\item\em Stops the server. \item\end{CompactList}\item 
bool {\bf cycle} (int timeout\-Ms=0)
\begin{CompactList}\small\item\em Cycles all services, including transports. \item\end{CompactList}\item 
void {\bf cycle\-Sessions} (int timeout\-Ms, const volatile bool \&stop\-Flag)
\begin{CompactList}\small\item\em Cycles the server's thread-specific session queue. \item\end{CompactList}\item 
void {\bf open} ()\label{class_r_c_f_1_1_rcf_server_bc236d7592f97be4031af3df84fa602a}

\begin{CompactList}\small\item\em Opens all services, including transports. \item\end{CompactList}\item 
void {\bf close} ()\label{class_r_c_f_1_1_rcf_server_188bb2749480028e2c32415766917412}

\begin{CompactList}\small\item\em Closes all services, including transports. \item\end{CompactList}\item 
{\bf I\_\-Server\-Transport} \& {\bf get\-Server\-Transport} ()
\begin{CompactList}\small\item\em Returns a reference to the primary server transport. \item\end{CompactList}\item 
boost::shared\_\-ptr$<$ {\bf I\_\-Server\-Transport} $>$ {\bf get\-Server\-Transport\-Ptr} ()
\begin{CompactList}\small\item\em Returns a shared pointer to the primary server transport. \item\end{CompactList}\item 
template$<$typename Interface\-T, typename Implementation\-T$>$ bool {\bf bind} (Implementation\-T \&x, const std::string \&name=\char`\"{}\char`\"{})
\begin{CompactList}\small\item\em Binds a reference to an object, to an interface. \item\end{CompactList}\item 
template$<$typename Interface\-T, typename Implementation\-T$>$ bool {\bf bind} (boost::shared\_\-ptr$<$ Implementation\-T $>$ px, const std::string \&name=\char`\"{}\char`\"{})
\begin{CompactList}\small\item\em Binds a shared pointer to an object, to an interface. \item\end{CompactList}\item 
template$<$typename Interface\-T, typename Implementation\-T$>$ bool {\bf bind} (boost::weak\_\-ptr$<$ Implementation\-T $>$ px, const std::string \&name=\char`\"{}\char`\"{})
\begin{CompactList}\small\item\em Binds a weak pointer to an object, to an interface. \item\end{CompactList}\item 
template$<$typename Interface\-T, typename Implementation\-T$>$ bool {\bf bind} (std::auto\_\-ptr$<$ Implementation\-T $>$ px, const std::string \&name=\char`\"{}\char`\"{})
\begin{CompactList}\small\item\em Binds a auto pointer to an object, to an interface. \item\end{CompactList}\item 
template$<$typename Interface\-T$>$ bool {\bf unbind} (const std::string \&name=\char`\"{}\char`\"{})
\begin{CompactList}\small\item\em Removes a binding from the server. \item\end{CompactList}\item 
bool {\bf add\-Service} (Service\-Ptr service\-Ptr)
\begin{CompactList}\small\item\em Adds a service to the server. \item\end{CompactList}\item 
bool {\bf remove\-Service} (Service\-Ptr service\-Ptr)
\begin{CompactList}\small\item\em Removes a service from the server. \item\end{CompactList}\item 
void {\bf set\-Start\-Callback} (Start\-Callback start\-Callback)\label{class_r_c_f_1_1_rcf_server_05e5beac138dc9b23f563f36ccd8c604}

\begin{CompactList}\small\item\em Sets the start callback, which is invoked by each worker thread when it starts. \item\end{CompactList}\item 
template$<$typename T$>$ void {\bf set\-Start\-Callback} (void(T::$\ast$pfn)({\bf Rcf\-Server} \&), T \&t)\label{class_r_c_f_1_1_rcf_server_a86a45528ea16cbeb9c77aee081ba3c1}

\begin{CompactList}\small\item\em Sets the start callback, which is invoked by each worker thread when it starts. \item\end{CompactList}\item 
bool {\bf get\-Stop\-Flag} ()\label{class_r_c_f_1_1_rcf_server_d5175de05a5001b81d03447a5994f3a1}

\begin{CompactList}\small\item\em Returns a value indicating whether or not all server threads should terminate their activities. \item\end{CompactList}\item 
void {\bf wait\-For\-Stop\-Event} ()\label{class_r_c_f_1_1_rcf_server_cafe176e066105d7d5a5b65c50b94c24}

\begin{CompactList}\small\item\em Waits for the server to be stopped. \item\end{CompactList}\item 
void {\bf wait\-For\-Start\-Event} ()\label{class_r_c_f_1_1_rcf_server_839331111f9f4acf7b1b6c5a9364743f}

\begin{CompactList}\small\item\em Waits for the server to be started. \item\end{CompactList}\end{CompactItemize}


\subsection{Constructor \& Destructor Documentation}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!RcfServer@{RcfServer}}
\index{RcfServer@{RcfServer}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}RCF::Rcf\-Server::Rcf\-Server (const {\bf I\_\-Endpoint} \& {\em endpoint})}\label{class_r_c_f_1_1_rcf_server_30dccd4586556317befa986411eb7908}


Constructor. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em endpoint}]Represents endpoint location of the server. Determines which server transport will be created and used. \end{description}
\end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!RcfServer@{RcfServer}}
\index{RcfServer@{RcfServer}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}RCF::Rcf\-Server::Rcf\-Server (Service\-Ptr {\em service\-Ptr})}\label{class_r_c_f_1_1_rcf_server_17b1fdbdd68baa513a934dbf65f1f9ad}


Constructor. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em service\-Ptr}]Service to load, typically a server transport. \end{description}
\end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!RcfServer@{RcfServer}}
\index{RcfServer@{RcfServer}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}RCF::Rcf\-Server::Rcf\-Server (Server\-Transport\-Ptr {\em server\-Transport\-Ptr})}\label{class_r_c_f_1_1_rcf_server_9bd676bca69d6389dc702fd34b6882e1}


Constructor. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em server\-Transport\-Ptr}]Server transport to load. \end{description}
\end{Desc}


\subsection{Member Function Documentation}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!addJoinFunctor@{addJoinFunctor}}
\index{addJoinFunctor@{addJoinFunctor}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}void RCF::Rcf\-Server::add\-Join\-Functor (Join\-Functor {\em join\-Functor})}\label{class_r_c_f_1_1_rcf_server_810f898e957abbc4c469139a4fb5565e}


Adds a join functor to the server, to be called when stopping the server. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em join\-Functor}]Join functor. \end{description}
\end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!addService@{addService}}
\index{addService@{addService}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}bool RCF::Rcf\-Server::add\-Service (Service\-Ptr {\em service\-Ptr})}\label{class_r_c_f_1_1_rcf_server_92d8f1e4cffe32eeb16cfcd5d5fdf30d}


Adds a service to the server. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em service\-Ptr}]Service to be added. E.g. ... \end{description}
\end{Desc}
\begin{Desc}
\item[Returns:]true if service added successfully, false otherwise (probably because the service has already been added). \end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!bind@{bind}}
\index{bind@{bind}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$typename Interface\-T, typename Implementation\-T$>$ bool RCF::Rcf\-Server::bind (std::auto\_\-ptr$<$ Implementation\-T $>$ {\em px}, const std::string \& {\em name} = {\tt \char`\"{}\char`\"{}})}\label{class_r_c_f_1_1_rcf_server_a0cd491f624c3a3343d0253bac52538d}


Binds a auto pointer to an object, to an interface. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em px}]Auto pointer to be bound. \item[{\em name}]Name to assign to the binding. \end{description}
\end{Desc}
\begin{Desc}
\item[Returns:]true if binding succeeded, false otherwise (probably because of a name collision). \end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!bind@{bind}}
\index{bind@{bind}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$typename Interface\-T, typename Implementation\-T$>$ bool RCF::Rcf\-Server::bind (boost::weak\_\-ptr$<$ Implementation\-T $>$ {\em px}, const std::string \& {\em name} = {\tt \char`\"{}\char`\"{}})}\label{class_r_c_f_1_1_rcf_server_bfd91216ed26b93387837f60658b2d7d}


Binds a weak pointer to an object, to an interface. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em px}]Weak pointer to be bound. \item[{\em name}]Name to assign to the binding. \end{description}
\end{Desc}
\begin{Desc}
\item[Returns:]true if binding succeeded, false otherwise (probably because of a name collision). \end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!bind@{bind}}
\index{bind@{bind}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$typename Interface\-T, typename Implementation\-T$>$ bool RCF::Rcf\-Server::bind (boost::shared\_\-ptr$<$ Implementation\-T $>$ {\em px}, const std::string \& {\em name} = {\tt \char`\"{}\char`\"{}})}\label{class_r_c_f_1_1_rcf_server_1dd822f4d2d254cfcef933d8c10e8e4c}


Binds a shared pointer to an object, to an interface. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em px}]Shared pointer to be bound. \item[{\em name}]Name to assign to the binding. \end{description}
\end{Desc}
\begin{Desc}
\item[Returns:]true if binding succeeded, false otherwise (probably because of a name collision). \end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!bind@{bind}}
\index{bind@{bind}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$typename Interface\-T, typename Implementation\-T$>$ bool RCF::Rcf\-Server::bind (Implementation\-T \& {\em x}, const std::string \& {\em name} = {\tt \char`\"{}\char`\"{}})}\label{class_r_c_f_1_1_rcf_server_5d606416d4505fe8691e7f57d46a2d61}


Binds a reference to an object, to an interface. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em x}]Object to be bound. \item[{\em name}]Name to assign to the binding. \end{description}
\end{Desc}
\begin{Desc}
\item[Returns:]true if binding succeeded, false otherwise (probably because of a name collision). \end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!cycle@{cycle}}
\index{cycle@{cycle}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}bool RCF::Rcf\-Server::cycle (int {\em timeout\-Ms} = {\tt 0})}\label{class_r_c_f_1_1_rcf_server_1df12cd9c50a0a2b9b5c34faefa8cece}


Cycles all services, including transports. 

May or may not result in the dispatching of a client request. \begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em timeout\-Ms}]Maximum waiting time, in milliseconds, for any blocking operations. \end{description}
\end{Desc}
\begin{Desc}
\item[Returns:]boolean value indicating if the server is being stopped. \end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!cycleSessions@{cycleSessions}}
\index{cycleSessions@{cycleSessions}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}void RCF::Rcf\-Server::cycle\-Sessions (int {\em timeout\-Ms}, const volatile bool \& {\em stop\-Flag})}\label{class_r_c_f_1_1_rcf_server_b57706df5e0a6ed3ecff290eb14f31ba}


Cycles the server's thread-specific session queue. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em timeout\-Ms}]Maximum waiting time, in milliseconds, for any blocking operations. \item[{\em stop\-Flag}]Reference to boolean value that, when set, indicates that all server threads should terminate as soon as possible. \end{description}
\end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!getServerTransport@{getServerTransport}}
\index{getServerTransport@{getServerTransport}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}{\bf I\_\-Server\-Transport}\& RCF::Rcf\-Server::get\-Server\-Transport ()}\label{class_r_c_f_1_1_rcf_server_f8dd420bf0f38b002557b6e0159bf9df}


Returns a reference to the primary server transport. 

\begin{Desc}
\item[Returns:]Reference to primary server transport. \end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!getServerTransportPtr@{getServerTransportPtr}}
\index{getServerTransportPtr@{getServerTransportPtr}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}boost::shared\_\-ptr$<${\bf I\_\-Server\-Transport}$>$ RCF::Rcf\-Server::get\-Server\-Transport\-Ptr ()}\label{class_r_c_f_1_1_rcf_server_89e9512cfa798dd5106eb41023090be9}


Returns a shared pointer to the primary server transport. 

\begin{Desc}
\item[Returns:]Shared pointer to primary server transport. \end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!removeService@{removeService}}
\index{removeService@{removeService}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}bool RCF::Rcf\-Server::remove\-Service (Service\-Ptr {\em service\-Ptr})}\label{class_r_c_f_1_1_rcf_server_140f6cffd2b2c5b67fde6365972e8b08}


Removes a service from the server. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em service\-Ptr}]Service to be removed. \end{description}
\end{Desc}
\begin{Desc}
\item[Returns:]true. \end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!start@{start}}
\index{start@{start}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}void RCF::Rcf\-Server::start (bool {\em spawn\-Threads} = {\tt true})}\label{class_r_c_f_1_1_rcf_server_98e104395628f6854b419f163676588d}


Starts the server, by starting all services, including transports. 

Synchronized: yes, idempotent: yes. \begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em spawn\-Threads}]Indicates whether any server threads should be spawned. \end{description}
\end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!startInThisThread@{startInThisThread}}
\index{startInThisThread@{startInThisThread}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}void RCF::Rcf\-Server::start\-In\-This\-Thread (Join\-Functor {\em join\-Functor})}\label{class_r_c_f_1_1_rcf_server_d94367f7d2741cc409307e8fd0b22ff3}


Starts the server, by taking over the current thread. 

All server tasks will be run sequentially in the calling thread. Synchronized: no, idempotent: no. \begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em join\-Functor}]Functor to call in order to join this thread. \end{description}
\end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!startInThisThread@{startInThisThread}}
\index{startInThisThread@{startInThisThread}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}void RCF::Rcf\-Server::start\-In\-This\-Thread ()}\label{class_r_c_f_1_1_rcf_server_3247d4f82a31b7281f0ad9afb6efba65}


Starts the server, by taking over the current thread. 

All server tasks will be run sequentially in the calling thread. Synchronized: no, idempotent: no. \index{RCF::RcfServer@{RCF::Rcf\-Server}!stop@{stop}}
\index{stop@{stop}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}void RCF::Rcf\-Server::stop (bool {\em wait} = {\tt true})}\label{class_r_c_f_1_1_rcf_server_993d42d38cd846e81c3b04ac119078ee}


Stops the server. 

Optionally waits until all server threads have terminated. Synchronized: yes, idempotent: yes \begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em wait}]True to wait for server threads to terminate, false to return immediately. \end{description}
\end{Desc}
\index{RCF::RcfServer@{RCF::Rcf\-Server}!unbind@{unbind}}
\index{unbind@{unbind}!RCF::RcfServer@{RCF::Rcf\-Server}}
\subsubsection{\setlength{\rightskip}{0pt plus 5cm}template$<$typename Interface\-T$>$ bool RCF::Rcf\-Server::unbind (const std::string \& {\em name} = {\tt \char`\"{}\char`\"{}})\hspace{0.3cm}{\tt  [inline]}}\label{class_r_c_f_1_1_rcf_server_6fb3c713e3d877413a0e150fa01e7d51}


Removes a binding from the server. 

\begin{Desc}
\item[Parameters:]
\begin{description}
\item[{\em name}]Name of the binding \end{description}
\end{Desc}
\begin{Desc}
\item[Returns:]true \end{Desc}


The documentation for this class was generated from the following files:\begin{CompactItemize}
\item 
Rcf\-Server.hpp\item 
Rcf\-Server.inl\end{CompactItemize}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Australia Australia
Software developer, from Sweden and now living in Canberra, Australia, working on distributed C++ applications. When he is not programming, Jarl enjoys skiing and playing table tennis. He derives immense satisfaction from referring to himself in third person.

Comments and Discussions