--- 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;
}
--- 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 <stdexcept>
+#include <string>
+
class Error : public std::exception {
private:
const char *message;
--- 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 <sstream>
+#include <cstring>
+
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
+}
+
--- 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) {
--- 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 << "<NetworkObject #" << obj << ">";
+ return s << "<NetworkObject #" << obj.obj_id << ">";
}
/*
--- 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;
--- 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) {
--- 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 <ClanLib/Network/Socket/socket.h>
#include <cerrno>
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 */
--- 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);
}
--- 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 <typename PrefixType> 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);