almost playable no-netsession
authorterom
Thu, 20 Nov 2008 22:55:28 +0000
branchno-netsession
changeset 39 cfb8b6e2a35f
parent 38 4189b8bf3a5b
child 40 4b2867fb5c12
almost playable
src/proto2/NetworkNode.cc
src/proto2/NetworkSession.cc
src/proto2/NetworkSession.hh
src/proto2/NetworkTCP.cc
src/proto2/NetworkTCP.hh
src/proto2/NetworkUDP.cc
src/proto2/NetworkUDP.hh
--- a/src/proto2/NetworkNode.cc	Thu Nov 20 22:10:28 2008 +0000
+++ b/src/proto2/NetworkNode.cc	Thu Nov 20 22:55:28 2008 +0000
@@ -8,6 +8,7 @@
     
     // connect signals
     slots.connect(tcp->sig_disconnect(), this, &NetworkNode::on_disconnect);
+    slots.connect(tcp->sig_packet(), &session, &NetworkSession::handle_message, this);
     
 }
 
--- a/src/proto2/NetworkSession.cc	Thu Nov 20 22:10:28 2008 +0000
+++ b/src/proto2/NetworkSession.cc	Thu Nov 20 22:55:28 2008 +0000
@@ -1,5 +1,6 @@
 
 #include "NetworkSession.hh"
+#include "Engine.hh"
 
 #include <cassert>
 
@@ -18,6 +19,7 @@
     
     // connect signals
     slots.connect(tcp_srv->sig_client(), this, &NetworkSession::on_tcp_client);
+    slots.connect(udp_srv->sig_packet(), this, &NetworkSession::on_udp_packet);
 }
         
 NetworkNode *NetworkSession::build_node (NetworkTCPTransport *tcp, NetworkUDP *udp, const NetworkAddress &addr, enum NetworkNodeType type) {
@@ -29,23 +31,41 @@
 }
 
 NetworkNode* NetworkSession::connect (const NetworkAddress &addr) {
-    // create new UDP client if needed
-    if (udp_client == NULL)
-        udp_client = new NetworkUDP();
+    // XXX: only one connect
+    assert(!udp_client);
 
-    // connect
+    // connect TCP
     NetworkTCPClient *tcp_client = new NetworkTCPClient(addr);
+        
+    // create UDP socket on same address
+    udp_client = new NetworkUDP(tcp_client->getLocalAddress());
     
     // build client
     NetworkNode *client_node = build_node(tcp_client, udp_client, addr, NETWORK_NODE_CLIENT_SERVER);
 
     // add to nodes
     nodes[addr] = client_node;
-    
+
+    // connect signals
+    slots.connect(udp_client->sig_packet(), this, &NetworkSession::on_udp_packet);
+        
     // return the "server" node
     return client_node;
 }
+                
+void NetworkSession::handle_disconnect (NetworkNode *node) {
+    // remove from nodes
+    nodes.erase(node->getRemoteAddress());
+}
         
+void NetworkSession::handle_message (NetworkPacket &pkt, NetworkNode *node) {
+    // read the channel id
+    NetworkChannelID channel_id = pkt.read_uint16();
+
+    // fire signal
+    _map_sig_chan_message[channel_id](pkt, node);
+}
+ 
 void NetworkSession::on_tcp_client (NetworkTCPTransport *tcp_client) {
     // get remote address manually, because NetworkTCPServer doesn't pass it in to us
     NetworkAddress addr = tcp_client->getRemoteAddress();
@@ -55,16 +75,24 @@
 
     // add to nodes
     nodes[addr] = client_node;
-
+    
     // fire signals
     _sig_node_connected(client_node);
 }
         
-void NetworkSession::handle_disconnect (NetworkNode *node) {
-    // remove from nodes
-    nodes.erase(node->getRemoteAddress());
+void NetworkSession::on_udp_packet (NetworkPacket &pkt, const NetworkAddress &addr) {
+    NetworkNode *node = nodes[addr];
+    
+    // drop from unknown sources
+    if (!node) {
+        Engine::log(WARN, "net_session.on_udp_packet") << "dropping unsolicted UDP packet from " << addr;
+        return;
+    }
+
+    // handle
+    handle_message(pkt, node);
 }
-        
+       
 void NetworkSession::send_all (NetworkChannelID channel_id, const NetworkPacket &pkt, bool reliable) {
     send_all_except(channel_id, pkt, NULL, reliable);
 }
--- a/src/proto2/NetworkSession.hh	Thu Nov 20 22:10:28 2008 +0000
+++ b/src/proto2/NetworkSession.hh	Thu Nov 20 22:55:28 2008 +0000
@@ -38,11 +38,13 @@
         virtual NetworkNode *build_node (NetworkTCPTransport *tcp, NetworkUDP *udp, const NetworkAddress &addr, enum NetworkNodeType type);
         
         void handle_disconnect (NetworkNode *node);
+        void handle_message (NetworkPacket &pkt, NetworkNode *node);
 
     private:
         void on_tcp_client (NetworkTCPTransport *client);
+        void on_udp_packet (NetworkPacket &pkt, const NetworkAddress &addr);
 
-         CL_Signal_v1<NetworkNode*> _sig_node_connected;
+        CL_Signal_v1<NetworkNode*> _sig_node_connected;
 
     public:
         void send_all (NetworkChannelID channel_id, const NetworkPacket &pkt, bool reliable = true);
--- a/src/proto2/NetworkTCP.cc	Thu Nov 20 22:10:28 2008 +0000
+++ b/src/proto2/NetworkTCP.cc	Thu Nov 20 22:55:28 2008 +0000
@@ -139,7 +139,8 @@
     
     // copy the data over, unless it's too large
     if (prefix <= buf_max) {
-        memcpy(buf_ptr, buf, prefix);
+        // ...don't copy the prefix, though
+        memcpy(buf_ptr, buf + sizeof(PrefixType), prefix);
     
         // trim the bytes out
         trim(sizeof(PrefixType) + prefix);
--- a/src/proto2/NetworkTCP.hh	Thu Nov 20 22:10:28 2008 +0000
+++ b/src/proto2/NetworkTCP.hh	Thu Nov 20 22:55:28 2008 +0000
@@ -63,15 +63,16 @@
         void on_write (void);
         void on_disconnected (void);
 
-        CL_Signal_v1<const NetworkPacket &> _sig_packet;
+        CL_Signal_v1<NetworkPacket &> _sig_packet;
         CL_Signal_v0 _sig_disconnect;
 
     public:
+        NetworkAddress getLocalAddress (void) { return socket.get_source_address(); }
         NetworkAddress getRemoteAddress (void) { return socket.get_dest_address(); }
 
         void write_packet (const NetworkPacket &packet);
         
-        CL_Signal_v1<const NetworkPacket&>& sig_packet (void) { return _sig_packet; }
+        CL_Signal_v1<NetworkPacket&>& sig_packet (void) { return _sig_packet; }
         CL_Signal_v0& sig_disconnect (void) { return _sig_disconnect; }
 };
 
--- a/src/proto2/NetworkUDP.cc	Thu Nov 20 22:10:28 2008 +0000
+++ b/src/proto2/NetworkUDP.cc	Thu Nov 20 22:55:28 2008 +0000
@@ -30,7 +30,7 @@
     
     // attempt to recv
     try {
-        ret = socket.recv(pkt.get_buf(), pkt.get_buf_size());
+        ret = socket.recv(pkt.get_buf(), pkt.get_buf_size(), src);
 
     } catch (CL_Error &e) {
         if (errno == EAGAIN)
--- a/src/proto2/NetworkUDP.hh	Thu Nov 20 22:10:28 2008 +0000
+++ b/src/proto2/NetworkUDP.hh	Thu Nov 20 22:55:28 2008 +0000
@@ -18,12 +18,12 @@
     private:
         void on_recv (void);
 
-        CL_Signal_v2<NetworkPacket &, const NetworkAddress> _sig_packet;
+        CL_Signal_v2<NetworkPacket &, const NetworkAddress&> _sig_packet;
 
     public:
         bool sendto (const NetworkPacket &packet, const NetworkAddress &dst);
         
-        CL_Signal_v2<NetworkPacket &, const NetworkAddress>& sig_packet (void) { return _sig_packet; }
+        CL_Signal_v2<NetworkPacket &, const NetworkAddress&>& sig_packet (void) { return _sig_packet; }
 };
 
 #endif /* NETWORK_UDP_HH */