--- 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);
}