/
server.h
108 lines (98 loc) · 3.24 KB
/
server.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#ifndef _SERVER_H_
#define _SERVER_H_
#include <unordered_set>
#include <list>
#include "utils.h"
#include "lrucache.h"
#define CACHE_SIZE 1000
struct Connection
{
ipaddr client;
vIndex index;
vSegment seg;
Connection(ipaddr c=0, vIndex i=0, vSegment s=0) :
client(c), index(i), seg(s) {
}
bool operator<(const Connection& b) const {
if (client < b.client)
return true;
else if (client > b.client)
return false;
else if (index < b.index)
return true;
else if (index > b.index)
return false;
else
return (seg < b.seg);
}
bool operator==(const Connection& b) const {
return (client == b.client &&
index == b.index &&
seg == b.seg);
}
};
enum ConnType {
LOCAL, // requested video is in local disk
CACHED, // requested video is in cache
NEW // requested video is not found
};
struct ConnData
{
ipaddr c; // Client IP address
vIndex i; // Video ID Index
vSegment s; // Video Segment Index
vSequence v; // Packet sequence number
ConnType t; // Connection Type
ConnData(ipaddr c_, vIndex i_, vSegment s_, vSequence v_, ConnType t_):
c(c_), i(i_), s(s_), v(v_), t(t_) {
}
};
namespace std {
template <>
struct hash < Connection >
{
size_t operator()(const Connection& k) const {
return hash<ipaddr>()(k.client) ^
hash<vIndex>()(k.index) ^
hash<vSegment>()(k.seg);
}
};
};
typedef std::list<ConnData> ConnTable;
typedef ConnTable::iterator ConnTableIterator;
typedef std::unordered_map<Connection, ConnTableIterator> ConnHash;
typedef LRUCache<VideoSegment, vSequence> Cache;
class Server: public cSimpleModule
{
private:
cMessage *handleRequestEvent;
ConnHash connServ;
ConnTable connTable;
protected:
ipaddr addr;
cModule *parent;
ipaddr centralServerIP;
Cache cache;
protected:
virtual void initialize();
virtual void handleMessage(cMessage*);
bool exists(vIndex i, vSegment s) const;
void handleRequests();
void queryVideoSegment(vIndex i, vSegment s);
void requestVideoSegement(ipaddr, vIndex, vSegment);
void scheduleRequestEvent();
void sendTearDownNotify(ipaddr, vIndex, vSegment);
void servRequest(ipaddr, vIndex, vSegment, cValue);
void setTimer(cMessage*, simtime_t);
void setupConnection(ipaddr, vIndex, vSegment);
void teardownConnection(ipaddr c, vIndex i, vSegment s);
public:
Server() : cSimpleModule(), cache(CACHE_SIZE) {
handleRequestEvent = NULL;
parent = NULL;
}
virtual ~Server() {
cancelAndDelete(handleRequestEvent);
}
};
#endif /* _SERVER_H_ */