diff -r ed2957490bbf -r 4189b8bf3a5b src/proto2/NetworkTCP.cc --- 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 #include @@ -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 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((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); }