Skip to content

Commit bb31c9e

Browse files
committed
Source Files Uploaded
1 parent 5a6bdc1 commit bb31c9e

10 files changed

+975
-0
lines changed

CMakeLists.txt

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
cmake_minimum_required(VERSION 3.13)
2+
project(DVR)
3+
4+
set(CMAKE_CXX_STANDARD 17)
5+
6+
add_executable(Router router.cpp Socket.h Utils.h RouterDS.h)

RouterDS.h

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
//
2+
// Created by subangkar on 12/7/18.
3+
//
4+
5+
#ifndef DVR_ROUTERDS_H
6+
#define DVR_ROUTERDS_H
7+
8+
#include "Utils.h"
9+
#include <unistd.h>
10+
#include <ostream>
11+
#include "Socket.h"
12+
13+
#define INF (std::numeric_limits<int>::max())
14+
#define UP 1
15+
#define DOWN 0
16+
17+
#define SHOW_ROUTING_TABLE "show"
18+
#define RECV_ROUTING_TABLE string("ntbl")
19+
#define SEND_MESSAGE "send"
20+
#define FORWARD_MESSAGE string("frwd")
21+
#define UPDATE_COST "cost"
22+
#define DRIVER_CLOCK "clk"
23+
#define CLEAR_SCREEN "clscr"
24+
25+
26+
#define NONE "-\t"
27+
28+
typedef string routerip_t;
29+
typedef string packet_t;
30+
typedef int cost_t;
31+
32+
struct RoutingTableEntry {
33+
routerip_t destination;
34+
routerip_t nextHop;
35+
cost_t cost{};
36+
37+
RoutingTableEntry() = default;
38+
39+
RoutingTableEntry(const routerip_t &destination, const routerip_t &nextHop, cost_t cost) : destination(destination),
40+
nextHop(nextHop), cost(cost) {}
41+
42+
friend ostream &operator<<(ostream &os, const RoutingTableEntry &entry) {
43+
os << entry.destination << "\t" << setw(12) << entry.nextHop << "\t" << entry.cost;
44+
return os;
45+
}
46+
47+
bool operator==(const RoutingTableEntry &rhs) const {
48+
return destination == rhs.destination &&
49+
nextHop == rhs.nextHop &&
50+
cost == rhs.cost;
51+
}
52+
53+
bool operator!=(const RoutingTableEntry &rhs) const {
54+
return !(rhs == *this);
55+
}
56+
};
57+
58+
struct Link {
59+
routerip_t neighbor;
60+
int cost;
61+
int recvClock;
62+
int status;
63+
64+
Link() {
65+
cost = -1;
66+
recvClock = -1;
67+
status = DOWN;
68+
}
69+
70+
Link(const routerip_t &neighbor, int cost, int recvClock, int status) : neighbor(neighbor), cost(cost),
71+
recvClock(recvClock), status(status) {}
72+
73+
friend ostream &operator<<(ostream &os, const Link &link1) {
74+
os << "neighbor: " << link1.neighbor << " cost: " << link1.cost << " recvClock: " << link1.recvClock
75+
<< " status: " << link1.status;
76+
return os;
77+
}
78+
79+
bool operator==(const Link &rhs) const {
80+
// return neighbor == rhs.neighbor &&
81+
// cost == rhs.cost &&
82+
// recvClock == rhs.recvClock &&
83+
// status == rhs.status;
84+
return neighbor == rhs.neighbor;
85+
}
86+
87+
bool operator!=(const Link &rhs) const {
88+
return !(rhs == *this);
89+
}
90+
};
91+
92+
93+
typedef map<routerip_t, RoutingTableEntry> routingtable_t;
94+
95+
#endif //DVR_ROUTERDS_H

Socket.h

+139
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
//
2+
// Created by subangkar on 12/6/18.
3+
//
4+
5+
#ifndef DVR_SOCKET_H
6+
#define DVR_SOCKET_H
7+
8+
#include <arpa/inet.h>
9+
#include <sys/socket.h>
10+
#include <string>
11+
12+
#define BUFFER_SIZE_SOCKET 1024
13+
14+
15+
sockaddr_in getInetSocketAddress(const char *ipAddress, uint16_t port, sa_family_t sin_family = AF_INET) {
16+
sockaddr_in sockAddr{};
17+
sockAddr.sin_family = sin_family;
18+
sockAddr.sin_port = htons(port);
19+
sockAddr.sin_addr.s_addr = inet_addr(ipAddress);
20+
return sockAddr;
21+
}
22+
23+
// returns bind flag
24+
bool getSocket(int &sockfd, const sockaddr_in &inetSocketAddr, int domain = AF_INET, int type = SOCK_DGRAM,
25+
int protocol = 0) {
26+
sockfd = socket(domain, type, protocol);
27+
return !bind(sockfd, (struct sockaddr *) &inetSocketAddr, sizeof(sockaddr_in));
28+
}
29+
30+
31+
class Socket {
32+
private:
33+
std::string localInetAddress;
34+
sockaddr_in socketAddr{};
35+
size_t buffer_size;
36+
int socketFileDescriptor{};
37+
bool bound = false;
38+
39+
sockaddr_in lastRemoteAddress{};
40+
ssize_t lastBufferSize{};
41+
42+
char *buffer{};
43+
44+
void createSocket() {
45+
bound = getSocket(socketFileDescriptor, socketAddr);
46+
if (bound)
47+
buffer = new char[buffer_size];
48+
}
49+
50+
public:
51+
Socket() {
52+
bound = false;
53+
buffer = nullptr;
54+
}
55+
56+
// Socket(const sockaddr_in &socketAddr, size_t buffer_size = BUFFER_SIZE_SOCKET) : socketAddr(socketAddr),
57+
// buffer_size(buffer_size) {
58+
// createSocket();
59+
// }
60+
61+
Socket(const char *ipAddress, uint16_t port, size_t buffer_size = BUFFER_SIZE_SOCKET) :
62+
localInetAddress(ipAddress),
63+
buffer_size(buffer_size) {
64+
socketAddr = getInetSocketAddress(ipAddress, port);
65+
this->buffer_size = buffer_size;
66+
createSocket();
67+
}
68+
69+
Socket(const Socket &socket) {
70+
localInetAddress = socket.localInetAddress;
71+
socketAddr = socket.socketAddr;
72+
buffer_size = socket.buffer_size;
73+
socketFileDescriptor = socket.socketFileDescriptor;
74+
bound = socket.bound;
75+
if (bound)buffer = new char[buffer_size];
76+
}
77+
78+
const char *readBytes(sockaddr_in &remoteAddress) {
79+
socklen_t addrlen;
80+
lastBufferSize = recvfrom(socketFileDescriptor, buffer, buffer_size, 0, (struct sockaddr *) &lastRemoteAddress,
81+
&addrlen);
82+
// std::cout << lastBufferSize << std::endl;
83+
if (lastBufferSize < buffer_size) buffer[lastBufferSize] = '\0';
84+
return buffer;
85+
}
86+
87+
long dataLength() {
88+
return lastBufferSize;
89+
}
90+
91+
std::string readString(sockaddr_in &remoteAddress) {
92+
readBytes(remoteAddress);
93+
return lastBufferSize > 0 ? std::string(buffer, lastBufferSize) : "";
94+
}
95+
96+
ssize_t writeString(const sockaddr_in &remote_address, const std::string &str) {
97+
return sendto(socketFileDescriptor, str.data(), str.size(), 0, (sockaddr *) &remote_address,
98+
sizeof(sockaddr_in));
99+
}
100+
101+
const sockaddr_in &getLastRemoteAddress() const {
102+
return lastRemoteAddress;
103+
}
104+
105+
bool isBound() {
106+
return bound;
107+
}
108+
109+
virtual ~Socket() {
110+
if (bound)
111+
delete[] buffer;
112+
}
113+
114+
Socket &operator=(const Socket &socket) {
115+
localInetAddress = socket.localInetAddress;
116+
socketAddr = socket.socketAddr;
117+
buffer_size = socket.buffer_size;
118+
socketFileDescriptor = socket.socketFileDescriptor;
119+
bound = socket.bound;
120+
if (bound) {
121+
delete[] buffer;
122+
buffer = new char[buffer_size];
123+
}
124+
return *this;
125+
}
126+
127+
128+
const std::string getLocalIP() {
129+
return std::string(inet_ntoa(socketAddr.sin_addr));
130+
// return localInetAddress;
131+
}
132+
133+
in_port_t getLocalPort() {
134+
return ntohs(socketAddr.sin_port);
135+
// return socketAddr.sin_port;
136+
}
137+
};
138+
139+
#endif //DVR_SOCKET_H

Testing Commands.txt

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
show 192.168.10.
2+
3+
send 192.168.10.1 192.168.10.2 8 tata bye
4+
send 192.168.10.1 192.168.10.3 8 tata bye
5+
send 192.168.10.3 192.168.10.1 8 tata bye
6+
7+
send 192.168.10.3 192.168.10.4 4 3->4
8+
send 192.168.10.1 192.168.10.4 4 1->4
9+
send 192.168.10.3 192.168.10.2 4 3->2
10+
send 192.168.10.1 192.168.10.2 4 1->2
11+
12+
down 192.168.10.1 192.168.10.2
13+
down 192.168.10.1 192.168.10.3
14+
up 192.168.10.1 192.168.10.3
15+
cost 192.168.10.1 192.168.10.3 27
16+
17+
cost 192.168.10.1 192.168.10.2 4
18+
19+
cost 192.168.10.2 192.168.10.1 7
20+
cost 192.168.10.2 192.168.10.1 4
21+
22+
23+
show 192.168.10.1
24+
show 192.168.10.2
25+
show 192.168.10.3
26+
show 192.168.10.4
27+
28+
29+
down 192.168.10.1 192.168.10.3
30+
down 192.168.10.1 192.168.10.2
31+
32+
up 192.168.10.1 192.168.10.3
33+
up 192.168.10.1 192.168.10.2
34+
35+
36+
send 192.168.10.1 192.168.10.1 8 tata bye

Utils.h

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
//
2+
// Created by subangkar on 12/7/18.
3+
//
4+
5+
#ifndef DVR_UTILS_H
6+
#define DVR_UTILS_H
7+
8+
//#include <bits/stdc++.h>
9+
#include <cstdlib>
10+
#include <string>
11+
#include <map>
12+
#include <set>
13+
#include <vector>
14+
#include <iostream>
15+
#include <cstring>
16+
#include <algorithm>
17+
#include <iterator>
18+
#include <iomanip>
19+
#include <cmath>
20+
#include <fstream>
21+
22+
using namespace std;
23+
24+
#define IS_IN_LIST(item, list) (find(list.begin(), list.end(), item) != list.end())
25+
26+
27+
bool startsWith(string str, string start) {
28+
transform(str.begin(), str.end(), str.begin(), ::tolower);
29+
transform(start.begin(), start.end(), start.begin(), ::tolower);
30+
return str.compare(0, start.length(), start) == 0;
31+
}
32+
33+
template<typename T>
34+
void print_container(std::ostream &os, const T &container, const std::string &delimiter) {
35+
std::copy(std::begin(container),
36+
std::end(container),
37+
std::ostream_iterator<typename T::value_type>(os, delimiter.c_str()));
38+
}
39+
40+
41+
#endif //DVR_UTILS_H

0 commit comments

Comments
 (0)