-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexample.cpp
More file actions
101 lines (87 loc) · 3.49 KB
/
example.cpp
File metadata and controls
101 lines (87 loc) · 3.49 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
#include "netctrl.hpp"
#include <iostream>
#include <string>
#include <sstream>
#include <csignal>
netctrl::NetCtrl* g_ctrl = nullptr;
void cleanup(int) {
std::cout << "\n\nRestoring network..." << std::endl;
if (g_ctrl) g_ctrl->disable();
exit(0);
}
int main() {
signal(SIGINT, cleanup);
signal(SIGTERM, cleanup);
if (!netctrl::NetCtrl::isAdmin()) {
std::cerr << "ERROR: Need root/admin privileges!\n";
std::cerr << "Run with: sudo ./example\n";
return 1;
}
netctrl::NetCtrl ctrl;
g_ctrl = &ctrl;
std::cout << "╔════════════════════════════════════════╗" << std::endl;
std::cout << "║ NetCtrl - Network Control Tool ║" << std::endl;
std::cout << "╚════════════════════════════════════════╝\n" << std::endl;
std::cout << "⚠️ WARNING: Affects ALL network traffic!\n" << std::endl;
std::cout << "Commands:" << std::endl;
std::cout << " block - Block 100%" << std::endl;
std::cout << " lag <ms> <%> - Apply lag + drop" << std::endl;
std::cout << " off - Disable" << std::endl;
std::cout << " quit - Exit\n" << std::endl;
std::cout << "Examples:" << std::endl;
std::cout << " block - Complete block" << std::endl;
std::cout << " lag 1 99.5 - Clumsy preset" << std::endl;
std::cout << " lag 100 50 - 100ms + 50% loss" << std::endl;
std::cout << " lag 200 0 - 200ms delay only" << std::endl;
std::cout << " lag 0 50 - 50% loss only\n" << std::endl;
std::string line;
while (true) {
std::string status = ctrl.isActive() ? "[ACTIVE]" : "[OFF]";
std::cout << status << " > ";
std::cout.flush();
if (!std::getline(std::cin, line)) break;
std::istringstream iss(line);
std::string cmd;
iss >> cmd;
if (cmd == "block" || cmd == "b") {
if (ctrl.block()) {
std::cout << "✓ Blocked!\n" << std::endl;
} else {
std::cout << "✗ Failed!\n" << std::endl;
}
}
else if (cmd == "lag" || cmd == "l") {
int ms;
double pct;
if (iss >> ms >> pct) {
if (ctrl.lag(ms, pct)) {
std::cout << "✓ Applied: " << ms << "ms + " << pct << "% drop\n" << std::endl;
} else {
std::cout << "✗ Failed!\n" << std::endl;
}
} else {
std::cout << "Usage: lag <ms> <%>\n" << std::endl;
}
}
else if (cmd == "off" || cmd == "disable" || cmd == "d") {
ctrl.disable();
std::cout << "✓ Disabled\n" << std::endl;
}
else if (cmd == "status" || cmd == "s") {
std::cout << "Active: " << (ctrl.isActive() ? "Yes" : "No") << std::endl;
if (ctrl.isActive()) {
std::cout << "Lag: " << ctrl.getLag() << "ms" << std::endl;
std::cout << "Drop: " << ctrl.getDrop() << "%\n" << std::endl;
}
}
else if (cmd == "quit" || cmd == "q") {
break;
}
else {
std::cout << "Unknown command\n" << std::endl;
}
}
ctrl.disable();
std::cout << "Goodbye!" << std::endl;
return 0;
}