# HG changeset patch # User terom # Date 1227221728 0 # Node ID cfb8b6e2a35f9a21a938f1a60db598031c7571ce # Parent 4189b8bf3a5ba0560e0417bd5a225f13d3114217 almost playable diff -r 4189b8bf3a5b -r cfb8b6e2a35f src/proto2/NetworkNode.cc --- 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); } diff -r 4189b8bf3a5b -r cfb8b6e2a35f src/proto2/NetworkSession.cc --- 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 @@ -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); } diff -r 4189b8bf3a5b -r cfb8b6e2a35f src/proto2/NetworkSession.hh --- 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 _sig_node_connected; + CL_Signal_v1 _sig_node_connected; public: void send_all (NetworkChannelID channel_id, const NetworkPacket &pkt, bool reliable = true); diff -r 4189b8bf3a5b -r cfb8b6e2a35f src/proto2/NetworkTCP.cc --- 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); diff -r 4189b8bf3a5b -r cfb8b6e2a35f src/proto2/NetworkTCP.hh --- 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 _sig_packet; + CL_Signal_v1 _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& sig_packet (void) { return _sig_packet; } + CL_Signal_v1& sig_packet (void) { return _sig_packet; } CL_Signal_v0& sig_disconnect (void) { return _sig_disconnect; } }; diff -r 4189b8bf3a5b -r cfb8b6e2a35f src/proto2/NetworkUDP.cc --- 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) diff -r 4189b8bf3a5b -r cfb8b6e2a35f src/proto2/NetworkUDP.hh --- 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 _sig_packet; + CL_Signal_v2 _sig_packet; public: bool sendto (const NetworkPacket &packet, const NetworkAddress &dst); - CL_Signal_v2& sig_packet (void) { return _sig_packet; } + CL_Signal_v2& sig_packet (void) { return _sig_packet; } }; #endif /* NETWORK_UDP_HH */