--- 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 */