Sophie

Sophie

distrib > Mageia > 4 > x86_64 > by-pkgid > b293cf61b174f6cb974e48c9096dc9b3 > files > 651

lib64commoncpp-devel-1.8.1-7.mga4.x86_64.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.5"/>
<title>GNU CommonC++: tcpservice.cpp</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">GNU CommonC++
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.5 -->
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li><a href="files.html"><span>Files</span></a></li>
      <li><a href="examples.html"><span>Examples</span></a></li>
    </ul>
  </div>
</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">tcpservice.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">// tcpservice.cpp</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">//  Copyright 2000 - Gianni Mariani &lt;gianni@mariani.ws&gt;</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">//  An example of a simple chatty server using CommonC++.</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">//  This simple application basically operates as a</span></div>
<div class="line"><span class="comment">//  very simple chat system. From a telnet session</span></div>
<div class="line"><span class="comment">//  on localhost:3999 , any messages typed from a telnet</span></div>
<div class="line"><span class="comment">//  client are written to all participating sessions.</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">//  This is free software licensed under the terms of the GNU</span></div>
<div class="line"><span class="comment">//  Public License</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">//  This example:</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">//  This demostrates a simple threaded server, actually,</span></div>
<div class="line"><span class="comment">//  the sessions are not all threaded though they could be</span></div>
<div class="line"><span class="comment">//  if that&#39;s what you wanted.  Basically it demonstrates the</span></div>
<div class="line"><span class="comment">//  use of SocketService, SocketPorts and Threads.</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">//  For those familiar with Unix network programming, SocketService</span></div>
<div class="line"><span class="comment">//  basically encapsulates all the work to communicate with</span></div>
<div class="line"><span class="comment">//  the select() or poll() system calls.  SocketPorts are</span></div>
<div class="line"><span class="comment">//  basically encapsulations of sessions or open file descriptors.</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">//  Anyhow, this example is a very simple echo server but</span></div>
<div class="line"><span class="comment">//  it echos to all connected clients.  So it&#39;s a poor man&#39;s</span></div>
<div class="line"><span class="comment">//  IRC !  You connect via telnet to localhost port 3999 and</span></div>
<div class="line"><span class="comment">//  it will echo to all other connected clients what you type in !</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"></div>
<div class="line"><span class="preprocessor">#include &lt;<a class="code" href="socketport_8h.html">cc++/socketport.h</a>&gt;</span></div>
<div class="line"></div>
<div class="line"><span class="preprocessor">#include &lt;iostream&gt;</span></div>
<div class="line"></div>
<div class="line"><span class="comment">// For starters, we need a thread safe list, we&#39;ll make one</span></div>
<div class="line"><span class="comment">// out of the STL list&lt;&gt; template -</span></div>
<div class="line"><span class="comment">//  http://www.sgi.com/Technology/STL/index.html</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">// Thread safe list class</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="preprocessor">#include &lt;list&gt;</span></div>
<div class="line"></div>
<div class="line"><span class="preprocessor">#ifdef  CCXX_NAMESPACES</span></div>
<div class="line"><span class="preprocessor"></span><span class="keyword">using namespace </span>std;</div>
<div class="line"><span class="keyword">using namespace </span>ost;</div>
<div class="line"><span class="preprocessor">#endif</span></div>
<div class="line"><span class="preprocessor"></span></div>
<div class="line"><span class="keyword">class </span>ts_list_item;</div>
<div class="line"><span class="keyword">typedef</span> list&lt;ts_list_item *&gt; ts_list;</div>
<div class="line"></div>
<div class="line"><span class="comment">// a list head - containing a list and a Mutex.</span></div>
<div class="line"><span class="comment">// It would be really nice to teach stl to do this.</span></div>
<div class="line"></div>
<div class="line"><span class="keyword">class </span>ts_list_head {</div>
<div class="line"><span class="keyword">public</span>:</div>
<div class="line"></div>
<div class="line">        <span class="comment">// No point inheriting, I&#39;d have to implement</span></div>
<div class="line">        <span class="comment">// alot of code. We&#39;ll hold off on that exercise.</span></div>
<div class="line"></div>
<div class="line">        <span class="comment">// Using the CommonC++ Mutex class.</span></div>
<div class="line">        <a name="_a0"></a><a class="code" href="classost_1_1_mutex.html">Mutex</a>               linkmutex;</div>
<div class="line">        <span class="comment">// And the STL template.</span></div>
<div class="line">        ts_list             list_o_items;</div>
<div class="line"></div>
<div class="line">        <span class="comment">// Not nessasary, but nice to be explicit.</span></div>
<div class="line">        ts_list_head()</div>
<div class="line">        : linkmutex(), list_o_items() {</div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line">        <span class="comment">// This thing knows how to remove and insert items.</span></div>
<div class="line">        <span class="keywordtype">void</span> RemoveListItem( ts_list_item * li );</div>
<div class="line">        <span class="keywordtype">void</span> InsertListItem( ts_list_item * li );</div>
<div class="line"></div>
<div class="line">        <span class="comment">// And it knows how to notify that it became empty</span></div>
<div class="line">        <span class="comment">// or an element was deleted and it was the last one.</span></div>
<div class="line">        <span class="keyword">virtual</span> <span class="keywordtype">void</span> ListDepleted() {</div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line">        <span class="keyword">virtual</span> ~ts_list_head() {</div>
<div class="line">        }</div>
<div class="line">};</div>
<div class="line"></div>
<div class="line"></div>
<div class="line"><span class="comment">// This item knows how to remove itself from the</span></div>
<div class="line"><span class="comment">// list it belongs to.</span></div>
<div class="line"><span class="keyword">class </span>ts_list_item {</div>
<div class="line"><span class="keyword">public</span>:</div>
<div class="line">        ts_list::iterator          linkpoint;</div>
<div class="line">        ts_list_head      * listhead;</div>
<div class="line"></div>
<div class="line">        <span class="keyword">virtual</span> ~ts_list_item() {</div>
<div class="line">        listhead-&gt;RemoveListItem( <span class="keyword">this</span> );</div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line">        ts_list_item( ts_list_head * head ) {</div>
<div class="line">        listhead = head;</div>
<div class="line">        head-&gt;InsertListItem( <span class="keyword">this</span> );</div>
<div class="line">        }</div>
<div class="line">};</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">void</span> ts_list_head::RemoveListItem( ts_list_item * li )</div>
<div class="line">{</div>
<div class="line">        <span class="keywordtype">bool</span>    is_empty;</div>
<div class="line">        linkmutex.enterMutex();</div>
<div class="line">        list_o_items.erase( li-&gt;linkpoint );</div>
<div class="line">        is_empty = list_o_items.empty();</div>
<div class="line">        linkmutex.leaveMutex();</div>
<div class="line"></div>
<div class="line">        <span class="comment">// There is a slim possibility that at this time</span></div>
<div class="line">        <span class="comment">// we recieve a connection.</span></div>
<div class="line">        <span class="keywordflow">if</span> ( is_empty ) {</div>
<div class="line">        ListDepleted();</div>
<div class="line">        }</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="keywordtype">void</span> ts_list_head::InsertListItem( ts_list_item * li )</div>
<div class="line">{</div>
<div class="line">        linkmutex.enterMutex();</div>
<div class="line">        list_o_items.push_front( li );</div>
<div class="line">        li-&gt;linkpoint = list_o_items.begin();</div>
<div class="line">        linkmutex.leaveMutex();</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="comment">// ChatterSession operates on the individual connections</span></div>
<div class="line"><span class="comment">// from clients as are managed by the SocketService</span></div>
<div class="line"><span class="comment">// contained in CCExec.  ChatterThread simply waits in</span></div>
<div class="line"><span class="comment">// a loop to create these, listening forever.</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">// Even though the SocketService contains a list of</span></div>
<div class="line"><span class="comment">// clients it serves, it may actually serve more than</span></div>
<div class="line"><span class="comment">// one type of session so we create our own list by</span></div>
<div class="line"><span class="comment">// inheriting the ts_list_item.</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"></div>
<div class="line"><span class="keyword">class </span>ChatterSession :</div>
<div class="line">        <span class="keyword">public</span> <span class="keyword">virtual</span> <a name="_a1"></a><a class="code" href="classost_1_1_socket_port.html">SocketPort</a>,</div>
<div class="line">        <span class="keyword">public</span> <span class="keyword">virtual</span> ts_list_item {</div>
<div class="line"><span class="keyword">public</span>:</div>
<div class="line"></div>
<div class="line">        <span class="keyword">enum</span> { size_o_buf = 2048 };</div>
<div class="line"></div>
<div class="line">        <span class="comment">// Nothing special to do here, it&#39;s all handled</span></div>
<div class="line">        <span class="comment">// by SocketPort and ts_list_item</span></div>
<div class="line"></div>
<div class="line">        <span class="keyword">virtual</span> ~ChatterSession() {</div>
<div class="line">        cerr &lt;&lt; <span class="stringliteral">&quot;ChatterSession deleted !\n&quot;</span>;</div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line">        <span class="comment">// When you create a ChatterSession it waits to accept a</span></div>
<div class="line">        <span class="comment">// connection.  This is done by it&#39;s own</span></div>
<div class="line">        ChatterSession(</div>
<div class="line">        <a name="_a2"></a><a class="code" href="classost_1_1_t_c_p_socket.html">TCPSocket</a>      &amp; server,</div>
<div class="line">        <a name="_a3"></a><a class="code" href="classost_1_1_socket_service.html">SocketService</a>   * svc,</div>
<div class="line">        ts_list_head    * head</div>
<div class="line">        ) :</div>
<div class="line">        <a class="code" href="classost_1_1_socket_port.html">SocketPort</a>( NULL, server ),</div>
<div class="line">        ts_list_item( head ) {</div>
<div class="line">        cerr &lt;&lt; <span class="stringliteral">&quot;ChatterSession Created\n&quot;</span>;</div>
<div class="line"></div>
<div class="line">        <a class="code" href="namespaceost.html#a3c74a1a40c359fd349f3e3e1b96ebfc7">tpport_t</a> port;</div>
<div class="line">        <a name="a4"></a><a class="code" href="address_8h.html#a5eba36aa908d5a479c8ba7d0bc4512b1">InetHostAddress</a> ia = getPeer( &amp; port );</div>
<div class="line"></div>
<div class="line">        cerr &lt;&lt; <span class="stringliteral">&quot;connecting from &quot;</span> &lt;&lt; ia.getHostname() &lt;&lt;</div>
<div class="line">        <span class="stringliteral">&quot;:&quot;</span> &lt;&lt; port &lt;&lt; endl;</div>
<div class="line"></div>
<div class="line">        <span class="comment">// Set up non-blocking reads</span></div>
<div class="line">        setCompletion( <span class="keyword">false</span> );</div>
<div class="line"></div>
<div class="line">        <span class="comment">// Set yerself to time out in 10 seconds</span></div>
<div class="line">        setTimer( 100000 );</div>
<div class="line">        attach(svc);</div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line">        <span class="comment">//</span></div>
<div class="line">        <span class="comment">// This is called by the SocketService thread when it the</span></div>
<div class="line">        <span class="comment">// object has expired.</span></div>
<div class="line">        <span class="comment">//</span></div>
<div class="line"></div>
<div class="line">        <span class="keyword">virtual</span> <span class="keywordtype">void</span> expired() {</div>
<div class="line">        <span class="comment">// Get outa here - this guy is a LOOSER - type or terminate</span></div>
<div class="line">        cerr &lt;&lt; <span class="stringliteral">&quot;ChatterSession Expired\n&quot;</span>;</div>
<div class="line">        <span class="keyword">delete</span> <span class="keyword">this</span>;</div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line">        <span class="comment">//</span></div>
<div class="line">        <span class="comment">// This is called by the SocketService thread when it detects</span></div>
<div class="line">        <span class="comment">// that there is somthing to read on this connection.</span></div>
<div class="line">        <span class="comment">//</span></div>
<div class="line"></div>
<div class="line">        <span class="keyword">virtual</span> <span class="keywordtype">void</span> pending() {</div>
<div class="line">        <span class="comment">// Implement the echo</span></div>
<div class="line"></div>
<div class="line">        cerr &lt;&lt; <span class="stringliteral">&quot;Pending called\n&quot;</span>;</div>
<div class="line"></div>
<div class="line">        <span class="comment">// reset the timer</span></div>
<div class="line">        setTimer( 100000 );</div>
<div class="line">        <span class="keywordflow">try</span> {</div>
<div class="line">            <span class="keywordtype">int</span>    len;</div>
<div class="line">            <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> total = 0;</div>
<div class="line">            <span class="keywordtype">char</span>    buf[ size_o_buf ];</div>
<div class="line"></div>
<div class="line">            <span class="keywordflow">while</span> ( (len = receive(buf, <span class="keyword">sizeof</span>(buf) )) &gt; 0 ) {</div>
<div class="line">                total += len;</div>
<div class="line">                cerr &lt;&lt; <span class="stringliteral">&quot;Read &#39;&quot;</span>;</div>
<div class="line">                cerr.write( buf, len );</div>
<div class="line">                cerr &lt;&lt; <span class="stringliteral">&quot;&#39;\n&quot;</span>;</div>
<div class="line"></div>
<div class="line">                <span class="comment">// Send it to all the sessions.</span></div>
<div class="line">                <span class="comment">// We probably don&#39;t really want to lock the</span></div>
<div class="line">                <span class="comment">// entire list for the entire time.</span></div>
<div class="line">                <span class="comment">// The best way to do this would be to place the</span></div>
<div class="line">                <span class="comment">// message somewhere and use the service function.</span></div>
<div class="line">                <span class="comment">// But what are examples for ?</span></div>
<div class="line"></div>
<div class="line">                <span class="keywordtype">bool</span> sent = <span class="keyword">false</span>;</div>
<div class="line">                listhead-&gt;linkmutex.enterMutex();</div>
<div class="line">                <span class="keywordflow">for</span> (</div>
<div class="line">                   ts_list::iterator iter = listhead-&gt;list_o_items.begin();</div>
<div class="line">                   iter != listhead-&gt;list_o_items.end();</div>
<div class="line">                   iter ++</div>
<div class="line">                ) {</div>
<div class="line">                   ChatterSession * sess =</div>
<div class="line">                    <span class="keyword">dynamic_cast&lt;</span> ChatterSession * <span class="keyword">&gt;</span>( * iter );</div>
<div class="line">                   <span class="keywordflow">if</span> ( sess != <span class="keyword">this</span> ) {</div>
<div class="line">                    sess-&gt;send( buf, len );</div>
<div class="line">                    sent = <span class="keyword">true</span>;</div>
<div class="line">                   }</div>
<div class="line">                }</div>
<div class="line">                listhead-&gt;linkmutex.leaveMutex();</div>
<div class="line"></div>
<div class="line">                <span class="keywordflow">if</span> ( ! sent ) {</div>
<div class="line">                   send(</div>
<div class="line">                    ( <span class="keywordtype">void</span> * ) <span class="stringliteral">&quot;No one else listening\n&quot;</span>,</div>
<div class="line">                    <span class="keyword">sizeof</span>( <span class="stringliteral">&quot;No one else listening\n&quot;</span> ) - 1</div>
<div class="line">                   );</div>
<div class="line"></div>
<div class="line">                   send( buf, len );</div>
<div class="line">                }</div>
<div class="line">            }</div>
<div class="line">            <span class="keywordflow">if</span> (total == 0) {</div>
<div class="line">                cerr &lt;&lt; <span class="stringliteral">&quot;Broken connection!\n&quot;</span> &lt;&lt; endl;</div>
<div class="line">                <span class="keyword">delete</span> <span class="keyword">this</span>;</div>
<div class="line">            }</div>
<div class="line">        }</div>
<div class="line">        <span class="keywordflow">catch</span> ( ... ) {</div>
<div class="line">            <span class="comment">// somthing wrong happened here !</span></div>
<div class="line">            cerr &lt;&lt; <span class="stringliteral">&quot;Socket port write sent an exception !\n&quot;</span>;</div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line">        <span class="keyword">virtual</span> <span class="keywordtype">void</span> disconnect() {</div>
<div class="line">        <span class="comment">// Called by the SocketService thread when the client</span></div>
<div class="line">        <span class="comment">// hangs up.</span></div>
<div class="line">        cerr &lt;&lt; <span class="stringliteral">&quot;ChatterSession disconnected!\n&quot;</span>;</div>
<div class="line"></div>
<div class="line">        <span class="keyword">delete</span> <span class="keyword">this</span>;</div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line">};</div>
<div class="line"></div>
<div class="line"><span class="keyword">class </span>ChatterThread;</div>
<div class="line"></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">// This is the main application object containing all the</span></div>
<div class="line"><span class="comment">// state for the application.  It uses a SocketService object</span></div>
<div class="line"><span class="comment">// (and thread) to do all the work, however, that object could</span></div>
<div class="line"><span class="comment">// theoretically be use by more than one main application.</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">// It creates a ChatterThread to sit and wait for connections</span></div>
<div class="line"><span class="comment">// from clients.</span></div>
<div class="line"></div>
<div class="line"><span class="keyword">class </span>CCExec : <span class="keyword">public</span> <span class="keyword">virtual</span> ts_list_head {</div>
<div class="line"><span class="keyword">public</span>:</div>
<div class="line"></div>
<div class="line">        <a class="code" href="classost_1_1_socket_service.html">SocketService</a>       * service;</div>
<div class="line">        ChatterThread          * my_Chatter;</div>
<div class="line">        <a name="_a5"></a><a class="code" href="classost_1_1_semaphore.html">Semaphore</a>                     mainsem[1];</div>
<div class="line"></div>
<div class="line">        CCExec():my_Chatter(NULL) {</div>
<div class="line">        service = <span class="keyword">new</span> <a name="a6"></a><a class="code" href="namespaceost.html#a5b999accae7692fd2abbc9654a00eb8c">SocketService</a>( 0 );</div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line">        <span class="keyword">virtual</span> <span class="keywordtype">void</span> ListDepleted();</div>
<div class="line"></div>
<div class="line">        <span class="comment">// These methods defined later.</span></div>
<div class="line">        <span class="keyword">virtual</span> ~CCExec();</div>
<div class="line">        <span class="keywordtype">int</span> RunApp( <span class="keywordtype">char</span> * hn = (<span class="keywordtype">char</span> *)<span class="stringliteral">&quot;localhost&quot;</span> );</div>
<div class="line"></div>
<div class="line">};</div>
<div class="line"></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">// ChatterThread simply creates ChatterSession all the time until</span></div>
<div class="line"><span class="comment">// it has an error.  I suspect you could create as many of these</span></div>
<div class="line"><span class="comment">// as the OS could take.</span></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"></div>
<div class="line"><span class="keyword">class </span>ChatterThread : <span class="keyword">public</span> <span class="keyword">virtual</span> <a class="code" href="classost_1_1_t_c_p_socket.html">TCPSocket</a>, <span class="keyword">public</span> <span class="keyword">virtual</span> <a name="_a7"></a><a class="code" href="classost_1_1_thread.html">Thread</a> {</div>
<div class="line"><span class="keyword">public</span>:</div>
<div class="line"></div>
<div class="line">        CCExec          * exec;</div>
<div class="line"></div>
<div class="line">        <span class="keywordtype">void</span> run () {</div>
<div class="line">        <span class="keywordflow">while</span> ( 1 ) {</div>
<div class="line">            <span class="keywordflow">try</span> {</div>
<div class="line">                <span class="comment">// new does all the work to accept a new connection</span></div>
<div class="line">                <span class="comment">// attach itself to the SocketService AND include</span></div>
<div class="line">                <span class="comment">// itself in the CCExec list of sessions.</span></div>
<div class="line">                <span class="keyword">new</span> ChatterSession(</div>
<div class="line">                   * ( <a class="code" href="classost_1_1_t_c_p_socket.html">TCPSocket</a> * ) <span class="keyword">this</span>,</div>
<div class="line">                   exec-&gt;service,</div>
<div class="line">                   exec</div>
<div class="line">                );</div>
<div class="line">            }</div>
<div class="line">            <span class="keywordflow">catch</span> ( ... ) {</div>
<div class="line">                <span class="comment">// Bummer - there was an error.</span></div>
<div class="line">                cerr &lt;&lt; <span class="stringliteral">&quot;ChatterSession create failed\n&quot;</span>;</div>
<div class="line">                exit();</div>
<div class="line">            }</div>
<div class="line">        }</div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line">        ChatterThread(</div>
<div class="line">        <a class="code" href="address_8h.html#a5eba36aa908d5a479c8ba7d0bc4512b1">InetHostAddress</a> &amp; machine,</div>
<div class="line">        <span class="keywordtype">int</span>           port,</div>
<div class="line">        CCExec         * inexec</div>
<div class="line"></div>
<div class="line">        ) : <a class="code" href="classost_1_1_t_c_p_socket.html">TCPSocket</a>( machine, port ),</div>
<div class="line">        <a class="code" href="classost_1_1_thread.html">Thread</a>(),</div>
<div class="line">        exec( inexec ) {</div>
<div class="line">            start();</div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line"></div>
<div class="line">};</div>
<div class="line"></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">// Bug here, this should go ahead and shut down all sessions</span></div>
<div class="line"><span class="comment">// for application.  An exercise left to the reader.</span></div>
<div class="line"></div>
<div class="line">CCExec::~CCExec()</div>
<div class="line">{</div>
<div class="line">        <span class="comment">// MUST delete my_Chatter first or it may end up using</span></div>
<div class="line">        <span class="comment">// a deleted service.</span></div>
<div class="line">        <span class="keywordflow">if</span> ( my_Chatter ) <span class="keyword">delete</span> my_Chatter;</div>
<div class="line"></div>
<div class="line">        <span class="comment">// Delete whatever is left.</span></div>
<div class="line">        <span class="keyword">delete</span> service;</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="comment">//</span></div>
<div class="line"><span class="comment">// Run App would normally read some config file or take some</span></div>
<div class="line"><span class="comment">// parameters about which port to connect to and then</span></div>
<div class="line"><span class="comment">// do that !</span></div>
<div class="line"><span class="keywordtype">int</span> CCExec::RunApp( <span class="keywordtype">char</span> * hn )</div>
<div class="line">{</div>
<div class="line">        <span class="comment">// which port ?</span></div>
<div class="line"></div>
<div class="line">        <a class="code" href="address_8h.html#a5eba36aa908d5a479c8ba7d0bc4512b1">InetHostAddress</a> machine( hn );</div>
<div class="line"></div>
<div class="line">        <span class="keywordflow">if</span> ( machine.isInetAddress() == false ) {</div>
<div class="line">        cerr &lt;&lt; <span class="stringliteral">&quot;machine is not address&quot;</span> &lt;&lt; endl;</div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line">        cerr &lt;&lt; <span class="stringliteral">&quot;machine is &quot;</span> &lt;&lt; machine.getHostname() &lt;&lt; endl;</div>
<div class="line"></div>
<div class="line">        <span class="comment">// Start accepting connections - this will bind to the</span></div>
<div class="line">        <span class="comment">// port as well.</span></div>
<div class="line">        <span class="keywordflow">try</span> {</div>
<div class="line">        my_Chatter = <span class="keyword">new</span> ChatterThread(</div>
<div class="line">            machine,</div>
<div class="line">            3999,</div>
<div class="line">            <span class="keyword">this</span></div>
<div class="line">        );</div>
<div class="line">        }</div>
<div class="line">        <span class="keywordflow">catch</span> ( ... ) {</div>
<div class="line">        cerr &lt;&lt; <span class="stringliteral">&quot;Failed to bind\n&quot;</span>;</div>
<div class="line">        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line">        <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="comment">// When there is no one else connected - terminate !</span></div>
<div class="line"><span class="keywordtype">void</span> CCExec::ListDepleted()</div>
<div class="line">{</div>
<div class="line">        mainsem-&gt;post();</div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"></div>
<div class="line"><span class="keywordtype">int</span> main( <span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> ** argv )</div>
<div class="line">{</div>
<div class="line">        CCExec  * server;</div>
<div class="line"></div>
<div class="line">        server = <span class="keyword">new</span> CCExec();</div>
<div class="line"></div>
<div class="line">        <span class="comment">// take the first command line option as a hostname</span></div>
<div class="line">        <span class="comment">// to listen to.</span></div>
<div class="line">        <span class="keywordflow">if</span> ( argc &gt; 1 ) {</div>
<div class="line">                server-&gt;RunApp( argv[ 1 ] );</div>
<div class="line">        } <span class="keywordflow">else</span> {</div>
<div class="line">                server-&gt;RunApp();</div>
<div class="line">        }</div>
<div class="line"></div>
<div class="line">        server-&gt;mainsem-&gt;wait();</div>
<div class="line"></div>
<div class="line">        <span class="keyword">delete</span> server;</div>
<div class="line"></div>
<div class="line">        <span class="keywordflow">return</span> 0;</div>
<div class="line">}</div>
</div><!-- fragment --> </div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Thu Oct 17 2013 23:24:56 for GNU CommonC++ by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.5
</small></address>
</body>
</html>