src/proto2/NetworkSession.cc
branchno-netsession
changeset 39 cfb8b6e2a35f
parent 37 ed2957490bbf
--- 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);
 }