-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgbn_receiver.py
92 lines (70 loc) · 2.57 KB
/
gbn_receiver.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import logging
import random
import socket
import sys
import coloredlogs
import verboselogs
import packet
# Configure logging
verboselogs.install()
logger = logging.getLogger(__name__)
coloredlogs.install(level="DEBUG", fmt="%(asctime)s - %(message)s", datefmt="%H:%M:%S")
def receiver():
expected_seq_no = 0
# To store received message
data_recvd = []
while True:
try:
# Wait for packet
pkt = packet.recv_packet(sock)
# EOF
if pkt.seq_no == -1:
logger.debug("[RECV]: Received EOF")
break
# If packet is corrupt, consecutive frames will be discarded
if pkt.is_corrupt():
logger.error("[ERR]: %s is corrupt. Discarding" % pkt)
# Packet Acknowledgement
elif pkt.seq_no == expected_seq_no:
logger.debug("[RECV]: Received %s." % pkt)
# Increment expected_seq_no as current frame is received successfully
expected_seq_no = (expected_seq_no + 1) % (packet.MAX_SEQ_NO + 1)
# Add paket data to list
data_recvd.append(pkt.data)
else:
logger.error("[ERR]: %s arrived out of order. Discarding." % pkt)
ack_pkt = packet.Packet(expected_seq_no, ptype=packet.Packet.TYPE_ACK)
logger.info("[ACK]: %s" % ack_pkt)
packet.send_packet(sock, ack_pkt)
except socket.error as e:
logger.critical(str(e))
break
except KeyboardInterrupt as e:
sock.close()
sys.exit(0)
logger.success('Transfer complete. Data received = "%s"' % "".join(data_recvd))
if __name__ == "__main__":
# Socket for listening for incoming connections
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(
(socket.gethostname(), 3300 if len(sys.argv) <= 1 else int(sys.argv[1]))
)
logger.debug("Connected to server.")
# Set vars if given (Default set in packet module)
if len(sys.argv) >= 3:
packet.SEQ_NO_BIT_WIDTH = int(sys.argv[2])
packet.LOSS_PROB = float(sys.argv[3])
packet.GBN_WINDOW_SIZE = (2 ** packet.SEQ_NO_BIT_WIDTH) - 1
packet.MAX_SEQ_NO = packet.GBN_WINDOW_SIZE
logger.verbose(
"SEQ_NO_BIT_WIDTH: {0}, LOSS_PROB: {1}, GBN_WINDOW_SIZE: {2}, MAX_SEQ_NO: {3}"
.format(
packet.SEQ_NO_BIT_WIDTH,
packet.LOSS_PROB,
packet.GBN_WINDOW_SIZE,
packet.MAX_SEQ_NO,
)
)
receiver()
sock.close()
sys.exit(0)