-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathReciever.py
More file actions
87 lines (78 loc) · 3.02 KB
/
Reciever.py
File metadata and controls
87 lines (78 loc) · 3.02 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
from socket import (socket,
AF_INET,
SOCK_DGRAM)
from Helpers import *
import sys
import time
import matplotlib.pyplot as plt
from datetime import datetime
class FileReceiver:
def __init__(self, port, secret_key):
self.port = port
self.sock = socket(AF_INET, SOCK_DGRAM)
self.sock.bind(("localhost", port))
self.packet_log = []
self.secret_key = secret_key[:8].encode()
def send_acknowledgement(self, sequence, file_id, address):
ack_packet = MakeReceiverPacket(sequence, file_id)
self.sock.sendto(ack_packet, address)
def order_packets(self, packets):
ordered_packets = sorted(packets, key=lambda x: x["Sequence"])
return ordered_packets
def write_to_file(self, ordered_packets, save_path):
with open(save_path, "wb") as file:
for packet in ordered_packets:
file.write(packet["Data"])
def receive_file(self, save_path):
start_T = time.time()
packets = []
recieved_seq = set()
numOfBytes = 0
while True:
packet, address = self.sock.recvfrom(512)
recv_T = datetime.now()
unpacked_packet = Unpack(packet, self.secret_key)
if unpacked_packet["HashedKey"] != hashlib.sha256(self.secret_key).digest():
continue
self.send_acknowledgement(
unpacked_packet["Sequence"], unpacked_packet["FileID"], address)
if not unpacked_packet["Sequence"] in recieved_seq:
packets.append(unpacked_packet)
recieved_seq.add(unpacked_packet["Sequence"])
self.packet_log.append(
(recv_T, unpacked_packet["Sequence"]))
numOfBytes += len(unpacked_packet["Data"])
if unpacked_packet["Trailer"] == 1:
break
ordered_packets = self.order_packets(packets)
self.write_to_file(ordered_packets, save_path)
end_T = time.time()
overall_time = end_T - start_T
print(f"File received: {save_path}",
f"Start time: {start_T}",
f"End time: {end_T}",
f"Elapsed time: {overall_time} seconds",
f"Number of packets: {len(packets)}",
f"Number of bytes: {numOfBytes}",
"Dn", sep="\n")
print()
self.plot_packet_log()
def plot_packet_log(self):
times, sequences = zip(*self.packet_log)
plt.figure(figsize=(10, 6))
plt.plot(times, sequences, 'bo-', label='Received Packets')
plt.xlabel('Time')
plt.ylabel('Packet Sequence Number')
plt.title('Packet Sequence Number vs Time')
plt.grid(True)
plt.legend()
plt.show()
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python Reciever.py [file destination]")
sys.exit()
secret_key = "pass1234"
file = sys.argv[1]
receiver = FileReceiver(1255, secret_key)
receiver.receive_file(file)
print("Done!")