<!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>