forked from CSS-D/Net-Task2
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNextRoutes.cpp
More file actions
126 lines (118 loc) · 4.12 KB
/
Copy pathNextRoutes.cpp
File metadata and controls
126 lines (118 loc) · 4.12 KB
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "NextRoutes.h"
//find the corresponding router, if the distance vector exist, update its value,
//else put it into the distance_vector_table
//and indicates that the current routing information has changed
bool NextRouters::update(Message message)
{
bool is_changed = false;
if (message.message_type == Message::ROUTE_CONTROL_MESSAGE)
{
for (int i = 0; i < next_routers_.size(); i++)
{
if (next_routers_[i].ip_addr == message.source_ip_addr)
{
bool find_flag = false;
DistanceVectorTable &curr_vector = next_routers_[i].distance_vecor_table;
for (int j = 0; j < curr_vector.size(); j++)
{
if (curr_vector[j].ip_addr == message.dest_ip_addr)
{
find_flag = true;
if (curr_vector[j].distance != message.cost)
{
curr_vector[j].distance = message.cost;
is_changed = true;
}
break;
}
}
if (!find_flag)
{
DistanceVector distance_vector(message.dest_ip_addr, message.cost);
curr_vector.push_back(distance_vector);
is_changed = true;
}
break;
}
}
}
if(is_changed)
{
print();
}
return is_changed;
}
void NextRouters::update_time(long ip_addr)
{
for (int i = 0; i < next_routers_.size(); i++)
{
if (next_routers_[i].ip_addr == ip_addr)
{
next_routers_[i].last_update_time = time(NULL);
break;
}
}
}
void NextRouters::push(NextRouter next_router)
{
next_router.last_update_time = time(NULL);
next_routers_.push_back(next_router);
}
void NextRouters::push(long _ip_addr, u_short _port, int _link_cost)
{
NextRouter next_router;
next_router.last_update_time = time(NULL);
next_router.ip_addr = _ip_addr;
next_router.port = _port;
next_router.link_cost = _link_cost;
DistanceVector dis_vec(_ip_addr,0);
next_router.distance_vecor_table.push_back(dis_vec);
next_routers_.push_back(next_router);
}
void NextRouters::erase(int index)
{
if (index >= 0 && index < next_routers_.size())
{
vector<NextRouter>::iterator it = next_routers_.begin();
it += index;
next_routers_.erase(it);
}
}
NextRouters::NextRouter &NextRouters::operator[](int index)
{
if (index >= 0 && index < next_routers_.size())
return next_routers_[index];
cerr << "NextRouters: out of range" << endl;
return *(NextRouter *)NULL;
}
int NextRouters::size()
{
return next_routers_.size();
}
void NextRouters::print()
{
cout << "Next Routers:" << endl;
for (int i = 0; i < 2 * LEN2; i++)
cout << "-";
cout << endl;
for (int i = 0; i < next_routers_.size(); i++)
{
cout << "Router " << i << ":" << endl;
cout << std::left << setw(LEN2) << "IP Address: " << std::left << setw(LEN2) << inet_ntoa(*(in_addr *)&next_routers_[i].ip_addr) << endl;
cout << std::left << setw(LEN2) << "Port: " << std::left << setw(LEN2) << next_routers_[i].port << endl;
cout << std::left << setw(LEN2) << "Link Cost: " << std::left << setw(LEN2) << next_routers_[i].link_cost << endl;
cout << std::left << setw(LEN2) << "Last Update Time: " << std::left << setw(LEN2) << next_routers_[i].last_update_time << endl;
cout << endl;
cout << "Distance Vector Table:" << endl;
cout << std::left << setw(LEN2) << "Destination" << std::left << setw(LEN2) << "Distance" << endl;
DistanceVectorTable &dv_table = next_routers_[i].distance_vecor_table;
for (int j = 0; j < dv_table.size(); j++)
{
cout << std::left << setw(LEN2) << inet_ntoa(*(in_addr *)&dv_table[j].ip_addr);
cout << std::left << setw(LEN2) << dv_table[j].distance << endl;
}
for (int t = 0; t < 2 * LEN2; t++)
cout << "-";
cout << endl;
}
}