Sophie

Sophie

distrib > Mandriva > 2007.0 > i586 > by-pkgid > ad1ba1135a9c9eeffc2e538163e00373 > files > 61

libCommonC++2_1.4-devel-1.4.1-1mdv2007.0.i586.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>GNU CommonC++: SampleSocketPort.cpp</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.6 -->
<div class="tabs">
  <ul>
    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
    <li><a href="classes.html"><span>Classes</span></a></li>
    <li><a href="files.html"><span>Files</span></a></li>
    <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
    <li><a href="examples.html"><span>Examples</span></a></li>
  </ul></div>
<h1>SampleSocketPort.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 
<a name="l00048"></a>00048 <span class="preprocessor">#include "SampleSocketPort.h"</span>
<a name="l00049"></a>00049 
<a name="l00050"></a>00050 SampleSocketPort::SampleSocketPort(<a name="a27"></a><a class="code" href="namespaceost.html#5b999accae7692fd2abbc9654a00eb8c">SocketService</a> *pService, TCPSocket &amp; tcpSocket) : 
<a name="l00051"></a>00051                                 <a name="a28"></a><a class="code" href="namespaceost.html#0120970550868f111b2d9cc7054526f7">SocketPort</a>(pService, tcpSocket)
<a name="l00052"></a>00052 {
<a name="l00053"></a>00053         <a name="a29"></a><a class="code" href="namespaceost.html#3c74a1a40c359fd349f3e3e1b96ebfc7">tpport_t</a> port;
<a name="l00054"></a>00054         <a name="a30"></a><a class="code" href="address_8h.html#5eba36aa908d5a479c8ba7d0bc4512b1">InetHostAddress</a> ia = getPeer( &amp; port );
<a name="l00055"></a>00055         cerr &lt;&lt; <span class="stringliteral">"connecting from "</span> &lt;&lt; ia.getHostname() &lt;&lt; <span class="stringliteral">":"</span> &lt;&lt; port &lt;&lt; endl;
<a name="l00056"></a>00056 
<a name="l00057"></a>00057         <span class="comment">// Set up non-blocking reads</span>
<a name="l00058"></a>00058         setCompletion( <span class="keyword">false</span> );
<a name="l00059"></a>00059 
<a name="l00060"></a>00060         <span class="comment">//1.9.3 THIS LINE DOES NOT SEEM TO BE REQUIRED ANYMORE!</span>
<a name="l00061"></a>00061         <span class="comment">//This sorts out a bug which prevents connections after a disconnect</span>
<a name="l00062"></a>00062         <span class="comment">//setDetectOutput(true);</span>
<a name="l00063"></a>00063 
<a name="l00064"></a>00064         m_bOpen = <span class="keyword">true</span>;
<a name="l00065"></a>00065         m_bDoDisconnect = <span class="keyword">false</span>;
<a name="l00066"></a>00066         m_bTimedOut = <span class="keyword">false</span>;
<a name="l00067"></a>00067         m_bReceptionStarted = <span class="keyword">false</span>;
<a name="l00068"></a>00068         m_nLastBytesAvail = 0;
<a name="l00069"></a>00069         m_pBuf = <span class="keyword">new</span> <span class="keywordtype">char</span>[MAX_RXBUF];
<a name="l00070"></a>00070 }
<a name="l00071"></a>00071 
<a name="l00072"></a>00072 
<a name="l00073"></a>00073 SampleSocketPort::~SampleSocketPort()
<a name="l00074"></a>00074 {
<a name="l00075"></a>00075         endSocket();
<a name="l00076"></a>00076         <span class="keyword">delete</span> [] m_pBuf;
<a name="l00077"></a>00077 }
<a name="l00078"></a>00078 
<a name="l00079"></a>00079 <span class="keywordtype">void</span> SampleSocketPort::pending(<span class="keywordtype">void</span>)
<a name="l00080"></a>00080 {
<a name="l00081"></a>00081 <span class="comment">//cerr &lt;&lt; "Pending called " &lt;&lt; endl;</span>
<a name="l00082"></a>00082         <span class="keywordflow">if</span>(!m_bOpen)
<a name="l00083"></a>00083                 <span class="keywordflow">return</span>;
<a name="l00084"></a>00084 
<a name="l00085"></a>00085         <span class="comment">// Read all available bytes into our buffer</span>
<a name="l00086"></a>00086         <span class="keywordtype">int</span> nBytesAvail = peek(m_pBuf, MAX_RXBUF);
<a name="l00087"></a>00087 <span class="comment">//cerr &lt;&lt; "Pending .. " &lt;&lt; nBytesAvail &lt;&lt; endl;</span>
<a name="l00088"></a>00088 
<a name="l00089"></a>00089         <span class="keywordflow">if</span>(!m_bReceptionStarted)
<a name="l00090"></a>00090         {       <span class="comment">//Start the receive timer</span>
<a name="l00091"></a>00091                 ResetReadTimeout(MAX_RXTIMEOUT);        <span class="comment">//Got 'n' seconds to get all the data else we timeout</span>
<a name="l00092"></a>00092                 m_bReceptionStarted = <span class="keyword">true</span>;
<a name="l00093"></a>00093         }
<a name="l00094"></a>00094         <span class="keywordflow">else</span>
<a name="l00095"></a>00095         {
<a name="l00096"></a>00096                 <span class="keywordflow">if</span>(m_bTimedOut) <span class="comment">//The receive timer has expired...this is a timeout condition</span>
<a name="l00097"></a>00097                 {
<a name="l00098"></a>00098                         ResetReadTimeout(MAX_RXTIMEOUT); <span class="comment">//Clear the timeout flag</span>
<a name="l00099"></a>00099                         m_nLastBytesAvail = 0;          <span class="comment">//Reset the flags</span>
<a name="l00100"></a>00100                         m_bReceptionStarted = <span class="keyword">false</span>;
<a name="l00101"></a>00101                         OnRxTimeout();  <span class="comment">//Do whatever 'we' do for a timeout (probably a flush or disconnect)...</span>
<a name="l00102"></a>00102                         <span class="keywordflow">return</span>;
<a name="l00103"></a>00103                 }
<a name="l00104"></a>00104         }
<a name="l00105"></a>00105 
<a name="l00106"></a>00106         <span class="keywordflow">if</span>(m_nLastBytesAvail == nBytesAvail)    <span class="comment">//Check if any more data has been received since last time</span>
<a name="l00107"></a>00107         {                                                                               <span class="comment">//No point in parsing unless this has changed!</span>
<a name="l00108"></a>00108                 <span class="comment">//Maybe yield in here!</span>
<a name="l00109"></a>00109                 <span class="comment">//Thread::yield();</span>
<a name="l00110"></a>00110                 <span class="keywordflow">if</span>(nBytesAvail == 0)            <span class="comment">//If we have been called with 0 bytes available (twice now)</span>
<a name="l00111"></a>00111                 {                                                       <span class="comment">//a disconnection has occurred</span>
<a name="l00112"></a>00112                         <span class="keywordflow">if</span>(!m_bDoDisconnect)
<a name="l00113"></a>00113                         {
<a name="l00114"></a>00114                                 CloseSocket();  <span class="comment">//Force the close</span>
<a name="l00115"></a>00115                         }
<a name="l00116"></a>00116                 }
<a name="l00117"></a>00117                 <span class="keywordflow">return</span>;
<a name="l00118"></a>00118         }
<a name="l00119"></a>00119 
<a name="l00120"></a>00120         <span class="comment">//Depending on your application you may want to attempt to process the extra data </span>
<a name="l00121"></a>00121         <span class="comment">//(or change your MAX_RXBUF).</span>
<a name="l00122"></a>00122         <span class="comment">//</span>
<a name="l00123"></a>00123         <span class="comment">//Here I just flush the whole lot, because I assume a 'legal' client wont send more than</span>
<a name="l00124"></a>00124         <span class="comment">//we can receive....maybe someone is trying to flood / overrun us!</span>
<a name="l00125"></a>00125         <span class="keywordflow">if</span>(nBytesAvail &gt; MAX_RXBUF)     
<a name="l00126"></a>00126         {
<a name="l00127"></a>00127                 cerr &lt;&lt; <span class="stringliteral">"TCP/IP overflow..."</span> &lt;&lt; endl;
<a name="l00128"></a>00128                 FlushRxData();
<a name="l00129"></a>00129                 m_nLastBytesAvail = 0;
<a name="l00130"></a>00130                 m_bReceptionStarted = <span class="keyword">false</span>;
<a name="l00131"></a>00131                 <span class="keywordflow">return</span>;
<a name="l00132"></a>00132         }
<a name="l00133"></a>00133         m_nLastBytesAvail = nBytesAvail;
<a name="l00134"></a>00134 
<a name="l00135"></a>00135         <span class="comment">//In this loop you may parse the received data to determine whether a whole</span>
<a name="l00136"></a>00136         <span class="comment">//'packet' has arrived. What you do in here depends on what data you are sending.</span>
<a name="l00137"></a>00137         <span class="comment">//Here we will just look for a /r/n terminator sequence.</span>
<a name="l00138"></a>00138         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0; i &lt; nBytesAvail; i++)
<a name="l00139"></a>00139         {
<a name="l00140"></a>00140 
<a name="l00141"></a>00141 <span class="comment">/***************************SHOULD BE CUSTOMISED*******************/</span>
<a name="l00142"></a>00142 
<a name="l00143"></a>00143                 <span class="keywordflow">if</span>(m_pBuf[i] == <span class="charliteral">'\r'</span>)
<a name="l00144"></a>00144                 {
<a name="l00145"></a>00145                         <span class="keywordflow">if</span>(i+1 &lt; nBytesAvail)
<a name="l00146"></a>00146                         {
<a name="l00147"></a>00147                                 <span class="keywordflow">if</span>(m_pBuf[i+1] == <span class="charliteral">'\n'</span>)
<a name="l00148"></a>00148                                 {       <span class="comment">//Terminator sequence found</span>
<a name="l00149"></a>00149 
<a name="l00150"></a>00150                                         <span class="comment">/**************************************************************/</span>
<a name="l00151"></a>00151                                         <span class="comment">// COMPULSORY ... Clear the flag and count..</span>
<a name="l00152"></a>00152                                         <span class="comment">// do this when you have received a good packet</span>
<a name="l00153"></a>00153                                         m_nLastBytesAvail = 0;
<a name="l00154"></a>00154                                         m_bReceptionStarted = <span class="keyword">false</span>;
<a name="l00155"></a>00155                                         <span class="comment">/**************************************************************/</span>
<a name="l00156"></a>00156 
<a name="l00157"></a>00157                                         <span class="comment">// Now receive the data into a buffer and call our receive function</span>
<a name="l00158"></a>00158                                         <span class="keywordtype">int</span> nLen = i+2;
<a name="l00159"></a>00159                                         <span class="keywordtype">char</span> *pszRxData = <span class="keyword">new</span> <span class="keywordtype">char</span>[nLen+1];     <span class="comment">//Allow space for terminator</span>
<a name="l00160"></a>00160                                         receive(pszRxData, nLen);               <span class="comment">//Receive the data</span>
<a name="l00161"></a>00161                                         pszRxData[nLen] = <span class="charliteral">'\0'</span>;         <span class="comment">//Terminate it</span>
<a name="l00162"></a>00162                                         OnDataReceived(pszRxData, nLen);
<a name="l00163"></a>00163                                         <span class="keyword">delete</span> [] pszRxData;
<a name="l00164"></a>00164                                         <span class="keywordflow">return</span>;
<a name="l00165"></a>00165                                 }
<a name="l00166"></a>00166                         }
<a name="l00167"></a>00167                 }
<a name="l00168"></a>00168 <span class="comment">/***************************END CUSTOMISATION*******************/</span>
<a name="l00169"></a>00169 
<a name="l00170"></a>00170         }
<a name="l00171"></a>00171 }
<a name="l00172"></a>00172 
<a name="l00173"></a>00173 <span class="keywordtype">void</span> SampleSocketPort::disconnect(<span class="keywordtype">void</span>)
<a name="l00174"></a>00174 {
<a name="l00175"></a>00175         <span class="keywordflow">if</span>(m_bOpen)
<a name="l00176"></a>00176         {
<a name="l00177"></a>00177                 m_bDoDisconnect = <span class="keyword">true</span>;
<a name="l00178"></a>00178                 CloseSocket();
<a name="l00179"></a>00179         }
<a name="l00180"></a>00180 }
<a name="l00181"></a>00181 
<a name="l00182"></a>00182 <span class="keywordtype">void</span> SampleSocketPort::expired(<span class="keywordtype">void</span>)
<a name="l00183"></a>00183 {
<a name="l00184"></a>00184         <span class="keywordflow">if</span>(m_bDoDisconnect &amp;&amp; m_bOpen)
<a name="l00185"></a>00185         {
<a name="l00186"></a>00186                 CloseSocket();
<a name="l00187"></a>00187         }
<a name="l00188"></a>00188         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_bOpen &amp;&amp; m_bReceptionStarted)
<a name="l00189"></a>00189         {
<a name="l00190"></a>00190                 <span class="comment">//Timer must have expired because the rx data has not all been received</span>
<a name="l00191"></a>00191                 m_bTimedOut = <span class="keyword">true</span>;
<a name="l00192"></a>00192         }
<a name="l00193"></a>00193 }
<a name="l00194"></a>00194 
<a name="l00195"></a>00195 
<a name="l00196"></a>00196 <span class="keywordtype">bool</span> SampleSocketPort::CloseSocket(<span class="keywordtype">void</span>)
<a name="l00197"></a>00197 {
<a name="l00198"></a>00198         <span class="keywordflow">if</span>(m_bOpen &amp;&amp; m_bDoDisconnect)
<a name="l00199"></a>00199         {                                                                       <span class="comment">//This is where the disconnection really occurs</span>
<a name="l00200"></a>00200                 m_bOpen = <span class="keyword">false</span>;                                <span class="comment">//If m_bDoDisconnect == true we know this has been called </span>
<a name="l00201"></a>00201                 OnConnectionClosed();                   <span class="comment">//through the timer, so 'delete this' is safe!</span>
<a name="l00202"></a>00202                 <span class="keyword">delete</span> <span class="keyword">this</span>;
<a name="l00203"></a>00203         }
<a name="l00204"></a>00204         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(m_bOpen)
<a name="l00205"></a>00205         {
<a name="l00206"></a>00206                 m_bDoDisconnect = <span class="keyword">true</span>;                 <span class="comment">//Just set the timer and the flag so we can </span>
<a name="l00207"></a>00207                 setTimer(DISCONNECT_MS);                <span class="comment">//disconnect safely, in DISCONNECT_MS</span>
<a name="l00208"></a>00208         }
<a name="l00209"></a>00209         <span class="keywordflow">return</span>(<span class="keyword">true</span>);
<a name="l00210"></a>00210 }
<a name="l00211"></a>00211 
<a name="l00212"></a>00212 
<a name="l00213"></a>00213 ssize_t SampleSocketPort::DoSend(<span class="keywordtype">void</span> *buf, size_t len)
<a name="l00214"></a>00214 {
<a name="l00215"></a>00215         <span class="comment">//If we are disconnecting, just pretend all the bytes were sent</span>
<a name="l00216"></a>00216         <span class="keywordflow">if</span>(m_bDoDisconnect)
<a name="l00217"></a>00217                 <span class="keywordflow">return</span>((ssize_t)len);
<a name="l00218"></a>00218 
<a name="l00219"></a>00219         ssize_t nSent = send(buf, len);
<a name="l00220"></a>00220         <span class="keywordflow">while</span>(!isPending(Socket::pendingOutput, 0))             <span class="comment">//Wait for output to complete</span>
<a name="l00221"></a>00221         {
<a name="l00222"></a>00222                 <span class="keywordflow">if</span>(m_bDoDisconnect || !m_bOpen)
<a name="l00223"></a>00223                 {
<a name="l00224"></a>00224                         <span class="comment">//If we are disconnecting, just pretend all the bytes were sent</span>
<a name="l00225"></a>00225                         <span class="keywordflow">return</span>((ssize_t)len);
<a name="l00226"></a>00226                 }
<a name="l00227"></a>00227                 <span class="comment">//I like to yield whenever waiting for things...</span>
<a name="l00228"></a>00228                 <span class="comment">//this is optional and may not suit your implementation!</span>
<a name="l00229"></a>00229                 Thread::yield();
<a name="l00230"></a>00230         }
<a name="l00231"></a>00231         <span class="keywordflow">return</span>(nSent);
<a name="l00232"></a>00232 }
<a name="l00233"></a>00233 
<a name="l00234"></a>00234 <span class="keywordtype">bool</span> SampleSocketPort::WriteData(<span class="keyword">const</span> <span class="keywordtype">char</span> *szTxData, <span class="keyword">const</span> size_t nByteCount)
<a name="l00235"></a>00235 {
<a name="l00236"></a>00236         <span class="comment">//First calculate how many bytes we are to send</span>
<a name="l00237"></a>00237         ssize_t nLen = nByteCount;
<a name="l00238"></a>00238 
<a name="l00239"></a>00239         <span class="keywordflow">if</span>(nLen == -1)
<a name="l00240"></a>00240                 nLen = (ssize_t)strlen(szTxData);
<a name="l00241"></a>00241 
<a name="l00242"></a>00242         size_t nBytesToSend = nLen;
<a name="l00243"></a>00243 
<a name="l00244"></a>00244         <span class="keywordflow">while</span>(m_bOpen &amp;&amp; nLen)
<a name="l00245"></a>00245         {
<a name="l00246"></a>00246                 nLen -= DoSend((<span class="keywordtype">void</span> *)&amp;(szTxData[nBytesToSend - nLen]), nLen);
<a name="l00247"></a>00247         }
<a name="l00248"></a>00248 
<a name="l00249"></a>00249 <span class="comment">//      If we are sending a terminator.....uncomment the following lines</span>
<a name="l00250"></a>00250 <span class="comment">//      char chTerminator = '\n';</span>
<a name="l00251"></a>00251 <span class="comment">//      while(DoSend((void *)&amp;chTerminator, 1) != 1);</span>
<a name="l00252"></a>00252 
<a name="l00253"></a>00253         <span class="keywordflow">return</span>(<span class="keyword">true</span>);
<a name="l00254"></a>00254 }
<a name="l00255"></a>00255 
<a name="l00256"></a>00256 
<a name="l00257"></a>00257 
<a name="l00258"></a>00258 <span class="preprocessor">#define WITH_EXAMPLE</span>
<a name="l00259"></a>00259 <span class="preprocessor"></span>
<a name="l00260"></a>00260 <span class="preprocessor">#ifdef WITH_EXAMPLE</span>
<a name="l00261"></a>00261 <span class="preprocessor"></span>
<a name="l00262"></a>00262 
<a name="l00263"></a>00263 <span class="comment">/************ THE FOLLOWING CODE DEMONSTRATES THE USE OF THE ABOVE CLASS ********************</span>
<a name="l00264"></a>00264 <span class="comment"> ****</span>
<a name="l00265"></a>00265 <span class="comment"> ****   To test it, compile with:</span>
<a name="l00266"></a>00266 <span class="comment"> ****           </span>
<a name="l00267"></a>00267 <span class="comment"> ****   g++ SampleSocketPort.cpp -lccgnu -lpthread -ldl -oSampleSocketPort -ggdb -I/usr/local/include/cc++/</span>
<a name="l00268"></a>00268 <span class="comment"> ****   Run the program.</span>
<a name="l00269"></a>00269 <span class="comment"> ****   </span>
<a name="l00270"></a>00270 <span class="comment"> ****   From another terminal telnet to port 3999 of the server</span>
<a name="l00271"></a>00271 <span class="comment"> ****   </span>
<a name="l00272"></a>00272 <span class="comment"> ****           'telnet localhost 3999'</span>
<a name="l00273"></a>00273 <span class="comment"> ****           </span>
<a name="l00274"></a>00274 <span class="comment"> ****   Anything you type should be sent back to you in reverse!</span>
<a name="l00275"></a>00275 <span class="comment"> ****   </span>
<a name="l00276"></a>00276 <span class="comment"> ****   To test the corrupt data detection, send a control code (like ^D),</span>
<a name="l00277"></a>00277 <span class="comment"> ****   if the terminating charcters are not detected within the specified time</span>
<a name="l00278"></a>00278 <span class="comment"> ****   the receive timeout will occur.</span>
<a name="l00279"></a>00279 <span class="comment"> ****   </span>
<a name="l00280"></a>00280 <span class="comment"> ****/</span>
<a name="l00281"></a>00281 
<a name="l00282"></a>00282 
<a name="l00283"></a>00283 <span class="comment">//define the following to include the example classes and functions</span>
<a name="l00284"></a>00284 
<a name="l00285"></a>00285 <span class="keywordtype">int</span> g_nOpenPorts = 0;                   <span class="comment">//Dirty global to allow us to quit simply</span>
<a name="l00286"></a>00286 
<a name="l00287"></a>00287 <span class="keyword">class </span>ReverserPort : <span class="keyword">public</span> SampleSocketPort
<a name="l00288"></a>00288 {
<a name="l00289"></a>00289 <span class="keyword">public</span>:
<a name="l00290"></a>00290         ReverserPort(<a class="code" href="namespaceost.html#5b999accae7692fd2abbc9654a00eb8c">SocketService</a> *pService, TCPSocket &amp; tcpSocket) : 
<a name="l00291"></a>00291                         SampleSocketPort(pService, tcpSocket)
<a name="l00292"></a>00292         {
<a name="l00293"></a>00293                 g_nOpenPorts++;
<a name="l00294"></a>00294         }
<a name="l00295"></a>00295         <span class="keyword">virtual</span> ~ReverserPort()
<a name="l00296"></a>00296         {
<a name="l00297"></a>00297                 g_nOpenPorts--;
<a name="l00298"></a>00298         }
<a name="l00299"></a>00299         <span class="keyword">virtual</span> <span class="keywordtype">void</span> OnConnectionClosed(<span class="keywordtype">void</span>)
<a name="l00300"></a>00300         { cerr &lt;&lt; <span class="stringliteral">"Connection Closed!"</span> &lt;&lt; endl; }
<a name="l00301"></a>00301 
<a name="l00306"></a>00306         <span class="keyword">virtual</span> <span class="keywordtype">void</span> OnDataReceived(<span class="keywordtype">char</span> *pszData, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nByteCount)
<a name="l00307"></a>00307         {
<a name="l00308"></a>00308                 <span class="comment">//Reverse the data and send it back</span>
<a name="l00309"></a>00309 
<a name="l00310"></a>00310                 size_t nLen = strlen(pszData);
<a name="l00311"></a>00311                 <span class="keywordtype">char</span> *szToSend = <span class="keyword">new</span> <span class="keywordtype">char</span>[nLen+1];
<a name="l00312"></a>00312                 
<a name="l00313"></a>00313                 <span class="comment">//No need to reverse the \r\n or \0</span>
<a name="l00314"></a>00314                 size_t nIndex = nLen-3;
<a name="l00315"></a>00315 
<a name="l00316"></a>00316                 size_t i;
<a name="l00317"></a>00317                 <span class="keywordflow">for</span>(i=0; i &lt; nLen - 2; i++)
<a name="l00318"></a>00318                 {
<a name="l00319"></a>00319                         szToSend[i] = pszData[nIndex - i];
<a name="l00320"></a>00320                 }
<a name="l00321"></a>00321                 szToSend[i++] = <span class="charliteral">'\r'</span>;
<a name="l00322"></a>00322                 szToSend[i++] = <span class="charliteral">'\n'</span>;
<a name="l00323"></a>00323                 szToSend[nLen] = <span class="charliteral">'\0'</span>;
<a name="l00324"></a>00324 
<a name="l00325"></a>00325                 WriteData(szToSend, nLen);
<a name="l00326"></a>00326                 <span class="keyword">delete</span> [] szToSend;
<a name="l00327"></a>00327         }
<a name="l00328"></a>00328 
<a name="l00329"></a>00329 };
<a name="l00330"></a>00330 
<a name="l00331"></a>00331 <span class="keyword">class </span>ReverserServer : <span class="keyword">public</span> SampleSocketServiceServer
<a name="l00332"></a>00332 {
<a name="l00333"></a>00333 <span class="keyword">public</span>:
<a name="l00334"></a>00334         ReverserServer(<a class="code" href="address_8h.html#5eba36aa908d5a479c8ba7d0bc4512b1">InetHostAddress</a> &amp; machine, <span class="keywordtype">int</span> port) : 
<a name="l00335"></a>00335         TCPSocket(machine, port), <a name="a31"></a><a class="code" href="namespaceost.html#1a3b6738f6f759fcb52b544a4787cbb2">Thread</a>(), SampleSocketServiceServer(machine, port)
<a name="l00336"></a>00336         {
<a name="l00337"></a>00337         }
<a name="l00338"></a>00338         <span class="keyword">virtual</span> ~ReverserServer()
<a name="l00339"></a>00339         {
<a name="l00340"></a>00340         }
<a name="l00341"></a>00341         <span class="keyword">virtual</span> <a class="code" href="namespaceost.html#0120970550868f111b2d9cc7054526f7">SocketPort</a> *CreateSocketPort(<a class="code" href="namespaceost.html#5b999accae7692fd2abbc9654a00eb8c">SocketService</a> *pService, TCPSocket &amp; Socket)
<a name="l00342"></a>00342         {
<a name="l00343"></a>00343                 <span class="keywordflow">return</span>(<span class="keyword">new</span> ReverserPort(pService, Socket));
<a name="l00344"></a>00344         }
<a name="l00345"></a>00345 };
<a name="l00346"></a>00346 
<a name="l00347"></a>00347 
<a name="l00348"></a>00348 <span class="keywordtype">int</span> main(<span class="keywordtype">void</span>)
<a name="l00349"></a>00349 {
<a name="l00350"></a>00350         <a class="code" href="address_8h.html#5eba36aa908d5a479c8ba7d0bc4512b1">InetHostAddress</a> LocalHost;
<a name="l00351"></a>00351         LocalHost = htonl(INADDR_ANY);
<a name="l00352"></a>00352         ReverserServer *Server = NULL;
<a name="l00353"></a>00353         <span class="keywordflow">try</span>
<a name="l00354"></a>00354         {
<a name="l00355"></a>00355                 Server = <span class="keyword">new</span> ReverserServer(LocalHost, 3999);
<a name="l00356"></a>00356                 Server-&gt;StartServer();
<a name="l00357"></a>00357         }
<a name="l00358"></a>00358         <span class="keywordflow">catch</span>(...)
<a name="l00359"></a>00359         {
<a name="l00360"></a>00360                 cerr &lt;&lt; <span class="stringliteral">"Failed to start server"</span> &lt;&lt; endl;
<a name="l00361"></a>00361                 <span class="keywordflow">return</span>(<span class="keyword">false</span>);
<a name="l00362"></a>00362         }
<a name="l00363"></a>00363         cerr &lt;&lt; <span class="stringliteral">"Waiting for connections...type \"quit\" to exit."</span> &lt;&lt; endl;
<a name="l00364"></a>00364 
<a name="l00365"></a>00365         <span class="keywordtype">char</span> cmd[255];
<a name="l00366"></a>00366  
<a name="l00367"></a>00367         cin.getline(cmd, 255);
<a name="l00368"></a>00368 
<a name="l00369"></a>00369 
<a name="l00370"></a>00370         <span class="keywordflow">while</span>(strcmp(cmd, <span class="stringliteral">"quit"</span>) != 0)
<a name="l00371"></a>00371         {
<a name="l00372"></a>00372                 cin.getline(cmd, 255);
<a name="l00373"></a>00373         }
<a name="l00374"></a>00374  
<a name="l00375"></a>00375         Server-&gt;StopServer();
<a name="l00376"></a>00376         <span class="keyword">delete</span> Server;
<a name="l00377"></a>00377         <span class="keywordflow">return</span> 0;       
<a name="l00378"></a>00378 }
<a name="l00379"></a>00379 
<a name="l00380"></a>00380 <span class="preprocessor">#endif  //WITH_EXAMPLE</span>
<a name="l00381"></a>00381 <span class="preprocessor"></span>
</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 19 10:50:55 2006 for GNU CommonC++ by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
</body>
</html>