33
|
1 |
#ifndef NETWORK_SESSION_HH
|
|
2 |
#define NETWORK_SESSION_HH
|
|
3 |
|
|
4 |
#include "NetworkTCP.hh"
|
|
5 |
#include "NetworkUDP.hh"
|
|
6 |
|
|
7 |
#include <map>
|
|
8 |
|
|
9 |
/*
|
|
10 |
* Should be set to some 8-char magic value to identify the application
|
|
11 |
*/
|
|
12 |
typedef char[8] NetworkSessionMagic;
|
|
13 |
|
|
14 |
/*
|
|
15 |
* Used to separate packets, ID zero is reserved for NetworkSession use
|
|
16 |
*/
|
|
17 |
typedef uint16_t NetworkChannelID;
|
|
18 |
|
|
19 |
class NetworkSession {
|
|
20 |
private:
|
|
21 |
NetworkSessionMagic magic;
|
|
22 |
NetworkTCPServer *tcp_srv;
|
|
23 |
NetworkUDP *udp_srv, *udp_client;
|
|
24 |
|
|
25 |
CL_SlotContainer slots;
|
|
26 |
|
|
27 |
std::map<NetworkAddress, NetworkNode*> nodes;
|
34
|
28 |
std::map<NetworkChannelID, CL_Signal_v2<const NetworkPacket&, NetworkNode *>> _map_sig_chan_message;
|
33
|
29 |
|
|
30 |
public:
|
|
31 |
NetworkSession (NetworkSessionMagic magic);
|
|
32 |
|
|
33 |
void listen (const NetworkAddress &addr);
|
|
34 |
NetworkNode* connect (const NetworkAddress &addr);
|
|
35 |
|
|
36 |
private:
|
|
37 |
void on_tcp_client (const NetworkTCPTransport *client);
|
|
38 |
void on_disconnect (NetworkNode *node);
|
|
39 |
|
34
|
40 |
CL_Signal_v1<NetworkNode*> _sig_node_connected;
|
|
41 |
CL_Signal_v1<NetworkNode*> _sig_node_disconnected;
|
|
42 |
|
33
|
43 |
public:
|
|
44 |
void send_all (NetworkChannelID channel_id, const NetworkPacket &pkt, bool reliable = true);
|
|
45 |
void send_all_except (NetworkChannelID channel_id, const NetworkPacket &pkt, const NetworkNode *node, bool reliable = true);
|
|
46 |
|
34
|
47 |
CL_Signal_v1<NetworkNode*> sig_node_connected (void) { return _sig_node_connected; }
|
|
48 |
CL_Signal_v1<NetworkNode*> sig_node_disconnected (void) { return _sig_node_disconnected; }
|
|
49 |
CL_Signal_v2<const NetworkPacket&, NetworkNode *>& sig_chan_message (NetworkChannelID cid) { return _map_sig_chan_message(cid); }
|
33
|
50 |
};
|
|
51 |
|
|
52 |
#endif /* NETWORK_SESSION_HH */
|