--- 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);
}