-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrdt.py
75 lines (65 loc) · 2.35 KB
/
rdt.py
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
from socket import socket, AF_INET, SOCK_DGRAM, timeout
from common import calcChecksum
class Socket:
send_socket = socket(AF_INET,SOCK_DGRAM)
recv_socket = socket(AF_INET,SOCK_DGRAM)
seq = 0
expected_seq = 0
def bind(self, recv_addr, recv_port): # Bind the receiver socket
self.recv_port = recv_port
self.recv_socket.bind((recv_addr, recv_port))
self.recv_socket.settimeout(1)
def send(self, data, server_addr, server_port): # Send data to server
dest = (server_addr, server_port)
pack = (
str(self.recv_port) +
calcChecksum(data) +
str(self.seq) +
data
).encode('utf-8')
ack_received = False
while not ack_received:
self.send_socket.sendto(pack, dest)
try:
message, address = self.recv_socket.recvfrom(4096)
except timeout:
pass
else:
checksum = message.decode('utf-8')[:2]
seq = int(message.decode('utf-8')[5])
if calcChecksum(message.decode('utf-8')[2:]) == checksum and seq == self.seq:
ack_received = True
self.seq = 1-self.seq
def receive(self): # Receive data from the client
while True:
try:
message, address = self.recv_socket.recvfrom(4096)
except timeout:
pass
else:
break
cli_addr = 'localhost'
cli_port = int(message.decode('utf-8')[:5])
checksum = message.decode('utf-8')[5:7]
seq = int(message.decode('utf-8')[7])
content = message.decode('utf-8')[8:]
dest = (cli_addr, cli_port)
resp = 'ACK' + str(seq)
pack = (
calcChecksum(resp) +
resp
).encode('utf-8')
inv_resp = 'ACK' + str(1-self.expected_seq)
inv_pack = (
calcChecksum(inv_resp) +
inv_resp
).encode('utf-8')
if calcChecksum(content) == checksum:
self.send_socket.sendto(pack, dest)
if seq == self.expected_seq:
self.expected_seq = 1-self.expected_seq
return (cli_addr, cli_port, content)
else:
self.send_socket.sendto(inv_pack, dest)
return -1
return -1