kind of works no-netsession
authorterom
Thu, 20 Nov 2008 22:10:28 +0000
branchno-netsession
changeset 38 4189b8bf3a5b
parent 37 ed2957490bbf
child 39 cfb8b6e2a35f
kind of works
src/proto2/Application.cc
src/proto2/Error.hh
src/proto2/Network.cc
src/proto2/NetworkNode.cc
src/proto2/NetworkObject.cc
src/proto2/NetworkObject.hh
src/proto2/NetworkServer.cc
src/proto2/NetworkSocket.hh
src/proto2/NetworkTCP.cc
src/proto2/NetworkTCP.hh
--- 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);