paradigm_3/html/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>socket.cpp Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.2.17 -->
<center>
<a class="qindex" href="main.html">Main Page</a> &nbsp; <a class="qindex" href="namespaces.html">Namespace List</a> &nbsp; <a class="qindex" href="classes.html">Alphabetical List</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; <a class="qindex" href="globals.html">File Members</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </center>
<hr><h1>socket.cpp</h1><a href="socket_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 
00014 <span class="preprocessor">#include "<a class="code" href="sysconfig_8h.html">sysconfig.h</a>"</span>
00015 <span class="preprocessor">#include "<a class="code" href="socket_8h.html">socket.h</a>"</span>
00016 
<a name="l00024"></a><a class="code" href="classSocket.html#a0">00024</a> <a class="code" href="classSocket.html#a0">Socket::Socket</a>(SOCKET sock, <span class="keywordtype">int</span> size) : mSock(sock), mSize(size) {
00025   <a class="code" href="classSocket.html#o2">mpInBuffer</a> = <span class="keyword">new</span> <span class="keywordtype">char</span>[<a class="code" href="classSocket.html#o1">mSize</a>];
00026   <a class="code" href="classSocket.html#o5">mpEod</a> = <a class="code" href="classSocket.html#o4">mpRead</a> = <a class="code" href="classSocket.html#o2">mpInBuffer</a>;
00027   <a class="code" href="classSocket.html#o3">mpOutBuffer</a> = <span class="keyword">new</span> <span class="keywordtype">char</span>[<a class="code" href="classSocket.html#o1">mSize</a>];
00028   <a class="code" href="classSocket.html#o6">mpWrite</a> = <a class="code" href="classSocket.html#o7">mpStartWrite</a> = <a class="code" href="classSocket.html#o3">mpOutBuffer</a>;
00029 }
00030 
<a name="l00036"></a><a class="code" href="classSocket.html#a1">00036</a> <a class="code" href="classSocket.html#a0">Socket::Socket</a>(<span class="keyword">const</span> <a class="code" href="classSocket.html">Socket</a>&amp; r_sock)
00037   : mSock(r_sock.mSock), mSize(r_sock.mSize) {
00038   <span class="comment">// Set up new input buffer and pointers exactly</span>
00039   <a class="code" href="classSocket.html#o2">mpInBuffer</a> = <span class="keyword">new</span> <span class="keywordtype">char</span>[<a class="code" href="classSocket.html#o1">mSize</a>];
00040   memcpy(<a class="code" href="classSocket.html#o2">mpInBuffer</a>, r_sock.mpInBuffer, <a class="code" href="classSocket.html#o1">mSize</a>);
00041   <a class="code" href="classSocket.html#o5">mpEod</a> = <a class="code" href="classSocket.html#o2">mpInBuffer</a> + (r_sock.mpEod - r_sock.mpInBuffer);
00042   <a class="code" href="classSocket.html#o4">mpRead</a> = <a class="code" href="classSocket.html#o2">mpInBuffer</a> + (r_sock.mpRead - r_sock.mpInBuffer);
00043   <span class="comment">// Set up new output buffer and pointers exactly</span>
00044   <a class="code" href="classSocket.html#o3">mpOutBuffer</a> = <span class="keyword">new</span> <span class="keywordtype">char</span>[<a class="code" href="classSocket.html#o1">mSize</a>];
00045   memcpy(<a class="code" href="classSocket.html#o3">mpOutBuffer</a>, r_sock.mpOutBuffer, <a class="code" href="classSocket.html#o1">mSize</a>);
00046   <a class="code" href="classSocket.html#o6">mpWrite</a> = <a class="code" href="classSocket.html#o3">mpOutBuffer</a> + (r_sock.mpWrite - r_sock.mpOutBuffer);
00047   <a class="code" href="classSocket.html#o7">mpStartWrite</a> = <a class="code" href="classSocket.html#o3">mpOutBuffer</a> + (r_sock.mpStartWrite - r_sock.mpOutBuffer);
00048 }
00049 
<a name="l00053"></a><a class="code" href="classSocket.html#a2">00053</a> <a class="code" href="classSocket.html#a2">Socket::~Socket</a>() {
00054   <span class="keyword">delete</span>[] <a class="code" href="classSocket.html#o2">mpInBuffer</a>;
00055   <span class="keyword">delete</span>[] <a class="code" href="classSocket.html#o3">mpOutBuffer</a>;
00056 }
00057 
<a name="l00069"></a><a class="code" href="classSocket.html#a3">00069</a> <span class="keywordtype">char</span> <a class="code" href="classSocket.html#a3">Socket::Read</a>() {
00070   <span class="keywordflow">if</span> (<a class="code" href="classSocket.html#o4">mpRead</a> == <a class="code" href="classSocket.html#o5">mpEod</a>) {              <span class="comment">// Nothing in bufffer. Fetch more data.</span>
00071     <a class="code" href="classSocket.html#o5">mpEod</a> = <a class="code" href="classSocket.html#o4">mpRead</a> = <a class="code" href="classSocket.html#o2">mpInBuffer</a>;      <span class="comment">// reset buffer for a full load.</span>
00072     <span class="keywordtype">int</span> bytes = recv (<a class="code" href="classSocket.html#o0">mSock</a>, <a class="code" href="classSocket.html#o2">mpInBuffer</a>, <a class="code" href="classSocket.html#o1">mSize</a>, 0);
00073     <span class="keywordflow">if</span> (bytes == 0) {
00074       <span class="keywordflow">throw</span> <a class="code" href="classShutdownException.html">ShutdownException</a>();      <span class="comment">// Connection was shutdown.</span>
00075     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (bytes == SOCKET_ERROR) {
00076       <span class="keywordtype">int</span> err = WSAGetLastError();
00077       <span class="keywordflow">if</span> (err == WSAEWOULDBLOCK) {
00078         <span class="keywordflow">throw</span> <a class="code" href="classBlockingException.html">BlockingException</a>(err); <span class="comment">// No more input available.</span>
00079       } <span class="keywordflow">else</span> {
00080         <span class="keywordflow">throw</span> <a class="code" href="classIOErrorException.html">IOErrorException</a>(err);  <span class="comment">// We have a serious error.</span>
00081       }
00082     }
00083     <a class="code" href="classSocket.html#o5">mpEod</a> += bytes;
00084   }
00085   <span class="keywordtype">char</span> c = *<a class="code" href="classSocket.html#o4">mpRead</a>;
00086   <a class="code" href="classSocket.html#o4">mpRead</a>++;
00087   <span class="keywordflow">return</span> c;
00088 }
00089 
<a name="l00106"></a><a class="code" href="classSocket.html#a4">00106</a> <span class="keywordtype">void</span> <a class="code" href="classSocket.html#a4">Socket::Write</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> c) {
00107   <span class="keywordflow">if</span> (<a class="code" href="classSocket.html#o6">mpWrite</a> == <a class="code" href="classSocket.html#o3">mpOutBuffer</a> + <a class="code" href="classSocket.html#o1">mSize</a>) {
00108     <span class="comment">// There is no room in buffer - attempt to flush it.</span>
00109     <a class="code" href="classSocket.html#a8">Flush</a>();
00110   }
00111   *<a class="code" href="classSocket.html#o6">mpWrite</a> = c;
00112   <a class="code" href="classSocket.html#o6">mpWrite</a>++;
00113   <span class="keywordflow">return</span>;
00114 }
00115 
<a name="l00133"></a><a class="code" href="classSocket.html#a5">00133</a> <span class="keywordtype">void</span> <a class="code" href="classSocket.html#a4">Socket::Write</a>(<span class="keyword">const</span> string&amp; r_str) {
00134   string::const_iterator si = r_str.begin();
00135   <span class="keywordflow">while</span>(si != r_str.end()) {
00136     <a class="code" href="classSocket.html#a4">Write</a>(*si);
00137     si++;
00138   }
00139 }
00140 
<a name="l00160"></a><a class="code" href="classSocket.html#a6">00160</a> <span class="keywordtype">void</span> <a class="code" href="classSocket.html#a4">Socket::Write</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* p_char) {
00161   <span class="keywordflow">while</span>(p_char) {
00162     <a class="code" href="classSocket.html#a4">Write</a>(*p_char);
00163     p_char++;
00164   }
00165 }
00166 
<a name="l00185"></a><a class="code" href="classSocket.html#a7">00185</a> <span class="keywordtype">void</span> <a class="code" href="classSocket.html#a4">Socket::Write</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* p_char, <span class="keywordtype">int</span> len) {
00186   <span class="keywordflow">while</span>(p_char &amp;&amp; len) {
00187     <a class="code" href="classSocket.html#a4">Write</a>(*p_char);
00188     p_char++;
00189     len--;
00190   }
00191 }
00192 
<a name="l00203"></a><a class="code" href="classSocket.html#a8">00203</a> <span class="keywordtype">void</span> <a class="code" href="classSocket.html#a8">Socket::Flush</a>() {
00204   <span class="keywordtype">int</span> wlen = <a class="code" href="classSocket.html#o6">mpWrite</a> - <a class="code" href="classSocket.html#o7">mpStartWrite</a>;
00205   <span class="keywordflow">if</span> (wlen == 0) {  <span class="comment">// Nothing to write</span>
00206     <span class="keywordflow">if</span> (<a class="code" href="classSocket.html#o7">mpStartWrite</a> == <a class="code" href="classSocket.html#o3">mpOutBuffer</a> + <a class="code" href="classSocket.html#o1">mSize</a>) { <span class="comment">// Oh we're at end of buffer</span>
00207       <a class="code" href="classSocket.html#o6">mpWrite</a> = <a class="code" href="classSocket.html#o7">mpStartWrite</a> = <a class="code" href="classSocket.html#o3">mpOutBuffer</a>; <span class="comment">// reinitialize buffer</span>
00208     }
00209     <span class="keywordflow">return</span>;
00210   }
00211   <span class="keywordtype">int</span> bytes = send (<a class="code" href="classSocket.html#o0">mSock</a>, <a class="code" href="classSocket.html#o7">mpStartWrite</a>, wlen, 0);
00212   <span class="keywordflow">if</span> (bytes == SOCKET_ERROR) {
00213     <span class="keywordtype">int</span> err = WSAGetLastError ();
00214     <span class="keywordflow">if</span> (err == WSAEWOULDBLOCK) {
00215       <span class="keywordflow">throw</span> <a class="code" href="classBlockingException.html">BlockingException</a>(); <span class="comment">// will block</span>
00216     } <span class="keywordflow">else</span> {
00217       <span class="keywordflow">throw</span> <a class="code" href="classIOErrorException.html">IOErrorException</a>(err); <span class="comment">// severe error</span>
00218     }
00219   } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (bytes &lt; wlen) {  <span class="comment">// We haven't written it all</span>
00220     <a class="code" href="classSocket.html#o7">mpStartWrite</a> += bytes;
00221     <span class="keywordflow">return</span>;
00222   }
00223   <span class="comment">// Okay everything was written - reinitalize buffer</span>
00224   <a class="code" href="classSocket.html#o6">mpWrite</a> = <a class="code" href="classSocket.html#o7">mpStartWrite</a> = <a class="code" href="classSocket.html#o3">mpOutBuffer</a>; <span class="comment">// reinitialize buffer</span>
00225   <span class="keywordflow">return</span>;
00226 }
00227 
<a name="l00233"></a><a class="code" href="classSocket.html#a9">00233</a> SOCKET <a class="code" href="classSocket.html#a9">Socket::GetSocket</a>() {
00234   <span class="keywordflow">return</span> <a class="code" href="classSocket.html#o0">mSock</a>;
00235 }
00236 
<a name="l00240"></a><a class="code" href="classSocket.html#a10">00240</a> <span class="keywordtype">void</span> <a class="code" href="classSocket.html#a10">Socket::Close</a>() {
00241   shutdown(<a class="code" href="classSocket.html#o0">mSock</a>, SD_SEND); <span class="comment">// Inform the client so they don't hang</span>
00242   <span class="keywordflow">try</span> {
00243     <span class="comment">// Attempt to read all the data left in the socket's buffer.  This</span>
00244     <span class="comment">// should throw an exception which we will catch gracefully.</span>
00245     <span class="keywordflow">while</span> (true) <a class="code" href="classSocket.html#a3">Read</a>();
00246   }
00247   <span class="keywordflow">catch</span> (exception &amp;ex) {
00248     closesocket(<a class="code" href="classSocket.html#o0">mSock</a>);
00249   }
00250 }
00251 
</pre></div><hr><address style="align: right;"><small>Generated on Mon Mar 29 23:12:53 2004 for Paradigm by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 
width=110 height=53></a>1.2.17 </small></address>
</body>
</html>