src/proto2/NetworkTCP.cc
branchno-netsession
changeset 38 4189b8bf3a5b
parent 37 ed2957490bbf
child 39 cfb8b6e2a35f
--- a/src/proto2/NetworkTCP.cc	Thu Nov 20 20:27:12 2008 +0000
+++ b/src/proto2/NetworkTCP.cc	Thu Nov 20 22:10:28 2008 +0000
@@ -1,5 +1,6 @@
 
 #include "NetworkTCP.hh"
+#include "Engine.hh"
 
 #include <cstdlib>
 #include <cassert>
@@ -66,11 +67,16 @@
     } catch (CL_Error &e) {
         if (errno == EAGAIN)
             return false;
+
         else
-            throw;
+            throw NetworkSocketOSError(socket, "recv");
     }
+    
+    // handle EOF
+    if (ret == 0)
+        throw NetworkSocketEOFError(socket, "recv");
 
-    assert(ret > 0);
+    assert(ret >= 0);
 
     // update offset
     offset += ret;
@@ -136,14 +142,14 @@
         memcpy(buf_ptr, buf, prefix);
     
         // trim the bytes out
-        trim(prefix);
+        trim(sizeof(PrefixType) + prefix);
         
         // return
         return prefix;
 
     } else {
         // trim the bytes out
-        trim(prefix);
+        trim(sizeof(PrefixType) + prefix);
         
         throw NetworkBufferError("recv prefix overflow");   
     }
@@ -161,7 +167,7 @@
         } catch (CL_Error &e) {
             // ignore EAGAIN, detect this by setting ret to -1
             if (errno != EAGAIN)
-                throw;
+                throw NetworkSocketOSError(socket, "send");
 
             ret = -1;
         }
@@ -204,25 +210,30 @@
             return;
 
         else
-            throw;
+            throw NetworkSocketOSError(socket, "send");
     }
 
     // trim the buffer
     trim(ret);
 }
         
-template <typename PrefixType> void NetworkBuffer::write_prefix (char *buf, PrefixType prefix) {
-    push_write((char*) &prefix, sizeof(PrefixType)); 
+void NetworkBuffer::write_prefix (char *buf, uint16_t prefix) {
+    uint16_t nval = htons(prefix);
+
+    push_write((char*) &nval, sizeof(uint16_t)); 
     push_write(buf, prefix);
 }
 
+void NetworkBuffer::write_prefix (char *buf, uint32_t prefix) {
+    uint32_t nval = htonl(prefix);
+
+    push_write((char*) &nval, sizeof(uint32_t)); 
+    push_write(buf, prefix);
+}
 
 NetworkTCPTransport::NetworkTCPTransport (NetworkSocket socket) :
     socket(socket), in(socket, NETWORK_TCP_INITIAL_IN_BUF), out(socket, NETWORK_TCP_INITIAL_OUT_BUF) {
     
-    // use nonblocking sockets
-    socket.set_nonblocking(true);
-
     // connect signals
     slots.connect(socket.sig_read_triggered(), this, &NetworkTCPTransport::on_read);
     slots.connect(socket.sig_write_triggered(), this, &NetworkTCPTransport::on_write);
@@ -256,9 +267,18 @@
     
     if (prefix != packet.get_data_size())
         throw CL_Error("send prefix overflow");
+    
+    try {
+        // just write to the output buffer
+        out.write_prefix((char *) packet.get_buf(), prefix);
 
-    // just write to the output buffer
-    out.write_prefix<uint16_t>((char *) packet.get_buf(), prefix);
+    } catch (Error &e) {
+        const char *err = e.what();
+
+        Engine::log(ERROR, "tcp.write_packet") << err;
+        
+        throw;    
+    }
 }
 
 NetworkTCPServer::NetworkTCPServer (const NetworkAddress &listen_addr) :
@@ -272,6 +292,9 @@
 
     // listen
     socket.listen(NETWORK_LISTEN_BACKLOG);
+    
+    // use nonblocking sockets
+    socket.set_nonblocking(true);
 }
 
 
@@ -295,5 +318,7 @@
 
     // connect
     socket.connect(connect_addr);
-
+    
+    // use nonblocking sockets
+    socket.set_nonblocking(true);
 }