<!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> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> </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>& 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& 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 && 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 < 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 &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>