# HG changeset patch # User terom # Date 1227219028 0 # Node ID 4189b8bf3a5ba0560e0417bd5a225f13d3114217 # Parent ed2957490bbfdffa8edc699f85db1f2cec74c3e3 kind of works diff -r ed2957490bbf -r 4189b8bf3a5b src/proto2/Application.cc --- a/src/proto2/Application.cc Thu Nov 20 20:27:12 2008 +0000 +++ b/src/proto2/Application.cc Thu Nov 20 22:10:28 2008 +0000 @@ -119,9 +119,13 @@ // XXX: handle --help return 1; + } catch (CL_Error &e) { + std::cerr << "main: CL_Error:" << e.message << std::endl; + + return 1; } catch (std::exception &e) { - std::cerr << e.what() << std::endl; + std::cerr << "FATAL [uncaught_exception] " << e.what() << std::endl; return 1; } diff -r ed2957490bbf -r 4189b8bf3a5b src/proto2/Error.hh --- a/src/proto2/Error.hh Thu Nov 20 20:27:12 2008 +0000 +++ b/src/proto2/Error.hh Thu Nov 20 22:10:28 2008 +0000 @@ -1,6 +1,9 @@ #ifndef ERROR_HH #define ERROR_HH +#include +#include + class Error : public std::exception { private: const char *message; diff -r ed2957490bbf -r 4189b8bf3a5b src/proto2/Network.cc --- a/src/proto2/Network.cc Thu Nov 20 20:27:12 2008 +0000 +++ b/src/proto2/Network.cc Thu Nov 20 22:10:28 2008 +0000 @@ -1,11 +1,30 @@ #include "Network.hh" #include "NetworkAddress.hh" +#include "NetworkSocket.hh" #include "Engine.hh" +#include +#include + std::ostream& operator<< (std::ostream &s, const NetworkAddress &addr) { s << "[" << addr.get_address() << ":" << addr.get_port() << "]"; return s; } + +std::string NetworkSocketError::build_str (const NetworkSocket &socket, const char *op, const char *err) { + std::stringstream ss; + + ss << "socket #" << socket.get_socket() << " " << op << ": " << err; + + return ss.str(); +} + +NetworkSocketError::NetworkSocketError (const NetworkSocket &socket, const char *op, const char *err) : + Error(build_str(socket, op, err)) { + + // nothing +} + diff -r ed2957490bbf -r 4189b8bf3a5b src/proto2/NetworkNode.cc --- a/src/proto2/NetworkNode.cc Thu Nov 20 20:27:12 2008 +0000 +++ b/src/proto2/NetworkNode.cc Thu Nov 20 22:10:28 2008 +0000 @@ -23,7 +23,7 @@ _sig_disconnected(); // delete - delete this; +// delete this; } void NetworkNode::send (NetworkChannelID channel_id, const NetworkPacket &pkt, bool reliable) { diff -r ed2957490bbf -r 4189b8bf3a5b src/proto2/NetworkObject.cc --- a/src/proto2/NetworkObject.cc Thu Nov 20 20:27:12 2008 +0000 +++ b/src/proto2/NetworkObject.cc Thu Nov 20 22:10:28 2008 +0000 @@ -88,7 +88,7 @@ } std::ostream& operator<< (std::ostream &s, const NetworkObject &obj) { - return s << ""; + return s << ""; } /* diff -r ed2957490bbf -r 4189b8bf3a5b src/proto2/NetworkObject.hh --- a/src/proto2/NetworkObject.hh Thu Nov 20 20:27:12 2008 +0000 +++ b/src/proto2/NetworkObject.hh Thu Nov 20 22:10:28 2008 +0000 @@ -73,6 +73,7 @@ class NetworkObject { friend class NetworkObjectController; + friend std::ostream& operator<< (std::ostream &s, const NetworkObject &obj); protected: NetworkObjectID obj_id; diff -r ed2957490bbf -r 4189b8bf3a5b src/proto2/NetworkServer.cc --- a/src/proto2/NetworkServer.cc Thu Nov 20 20:27:12 2008 +0000 +++ b/src/proto2/NetworkServer.cc Thu Nov 20 22:10:28 2008 +0000 @@ -80,7 +80,7 @@ obj.send_all(NETMSG_PLAYER_QUIT, pkt, true); // free - delete this; +// delete this; } void NetworkServerPlayer::on_move (NetworkNode *src, NetworkPacket &pkt) { diff -r ed2957490bbf -r 4189b8bf3a5b src/proto2/NetworkSocket.hh --- a/src/proto2/NetworkSocket.hh Thu Nov 20 20:27:12 2008 +0000 +++ b/src/proto2/NetworkSocket.hh Thu Nov 20 22:10:28 2008 +0000 @@ -1,9 +1,31 @@ #ifndef NETWORK_SOCKET_HH #define NETWORK_SOCKET_HH +#include "Error.hh" + #include #include typedef CL_Socket NetworkSocket; +// Network.cc +class NetworkSocketError : public Error { + protected: + std::string build_str (const NetworkSocket &socket, const char *op, const char *err); + + NetworkSocketError (const NetworkSocket &socket, const char *op, const char *err); +}; + +class NetworkSocketOSError : public NetworkSocketError { + public: + NetworkSocketOSError (const NetworkSocket &socket, const char *op) : + NetworkSocketError(socket, op, strerror(errno)) { } +}; + +class NetworkSocketEOFError : public NetworkSocketError { + public: + NetworkSocketEOFError (const NetworkSocket &socket, const char *op) : + NetworkSocketError(socket, op, "EOF") { } +}; + #endif /* NETWORK_SOCKET_HH */ 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); } diff -r ed2957490bbf -r 4189b8bf3a5b src/proto2/NetworkTCP.hh --- a/src/proto2/NetworkTCP.hh Thu Nov 20 20:27:12 2008 +0000 +++ b/src/proto2/NetworkTCP.hh Thu Nov 20 22:10:28 2008 +0000 @@ -12,11 +12,6 @@ const size_t NETWORK_TCP_INITIAL_IN_BUF = 4096; const size_t NETWORK_TCP_INITIAL_OUT_BUF = 0; -class NetworkDisconnectError : public Error { - public: - NetworkDisconnectError (const std::string &message) : Error(message) { } -}; - class NetworkBufferError : public Error { public: NetworkBufferError (const std::string &message) : Error(message) { } @@ -24,7 +19,7 @@ class NetworkBuffer { private: - NetworkSocket &socket; + NetworkSocket socket; char *buf; size_t size, offset; @@ -43,7 +38,8 @@ public: void push_write (char *buf_ptr, size_t buf_size); void flush_write (void); - template void write_prefix (char *buf, PrefixType prefix); + void write_prefix (char *buf, uint16_t prefix); + void write_prefix (char *buf, uint32_t prefix); bool try_read (size_t item_size); bool peek_prefix (uint16_t &ref);