<!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 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 <gianni@mariani.ws></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'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's a poor man'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 <<a class="code" href="socketport_8h.html">cc++/socketport.h</a>></span></div> <div class="line"></div> <div class="line"><span class="preprocessor">#include <iostream></span></div> <div class="line"></div> <div class="line"><span class="comment">// For starters, we need a thread safe list, we'll make one</span></div> <div class="line"><span class="comment">// out of the STL list<> 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 <list></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<ts_list_item *> 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'd have to implement</span></div> <div class="line"> <span class="comment">// alot of code. We'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->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->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->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->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'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 << <span class="stringliteral">"ChatterSession deleted !\n"</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'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> & 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 << <span class="stringliteral">"ChatterSession Created\n"</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( & port );</div> <div class="line"></div> <div class="line"> cerr << <span class="stringliteral">"connecting from "</span> << ia.getHostname() <<</div> <div class="line"> <span class="stringliteral">":"</span> << port << 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 << <span class="stringliteral">"ChatterSession Expired\n"</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 << <span class="stringliteral">"Pending called\n"</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) )) > 0 ) {</div> <div class="line"> total += len;</div> <div class="line"> cerr << <span class="stringliteral">"Read '"</span>;</div> <div class="line"> cerr.write( buf, len );</div> <div class="line"> cerr << <span class="stringliteral">"'\n"</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'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->linkmutex.enterMutex();</div> <div class="line"> <span class="keywordflow">for</span> (</div> <div class="line"> ts_list::iterator iter = listhead->list_o_items.begin();</div> <div class="line"> iter != listhead->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<</span> ChatterSession * <span class="keyword">></span>( * iter );</div> <div class="line"> <span class="keywordflow">if</span> ( sess != <span class="keyword">this</span> ) {</div> <div class="line"> sess->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->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">"No one else listening\n"</span>,</div> <div class="line"> <span class="keyword">sizeof</span>( <span class="stringliteral">"No one else listening\n"</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 << <span class="stringliteral">"Broken connection!\n"</span> << 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 << <span class="stringliteral">"Socket port write sent an exception !\n"</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 << <span class="stringliteral">"ChatterSession disconnected!\n"</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">"localhost"</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->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 << <span class="stringliteral">"ChatterSession create failed\n"</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> & 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 << <span class="stringliteral">"machine is not address"</span> << endl;</div> <div class="line"> }</div> <div class="line"></div> <div class="line"> cerr << <span class="stringliteral">"machine is "</span> << machine.getHostname() << 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 << <span class="stringliteral">"Failed to bind\n"</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->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 > 1 ) {</div> <div class="line"> server->RunApp( argv[ 1 ] );</div> <div class="line"> } <span class="keywordflow">else</span> {</div> <div class="line"> server->RunApp();</div> <div class="line"> }</div> <div class="line"></div> <div class="line"> server->mainsem->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  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/> </a> 1.8.5 </small></address> </body> </html>