-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuserver-gbn.py
More file actions
60 lines (42 loc) · 1.66 KB
/
userver-gbn.py
File metadata and controls
60 lines (42 loc) · 1.66 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
from socket import *
from threading import Thread
from queue import Queue
import time
serverIP = '127.0.0.1' # special IP for local host
serverPort = 15000
clientPort = 15001
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
print('The server is ready to receive')
rcv_base = 0 # next sequence number we wait for
receive_queue = Queue() # this queue is used to receive packet from client
buffer_size = 20 # set queue size
# thread for receiving and handling acks
def handling_ack():
global serverSocket
global receive_queue
global buffer_size
while True:
try:
message, clientAddress = serverSocket.recvfrom(2048)
seq_n = int(message.decode()) # extract sequence number
if receive_queue.qsize() <= buffer_size: # if queue is not full
receive_queue.put(seq_n)
except BlockingIOError:
continue
# running a thread for receiving and handling acks
th_handling_ack = Thread(target=handling_ack, args=())
th_handling_ack.start()
while True:
time.sleep(0.005) # extract packet with certain time to act like a bandwidth
if receive_queue.qsize() >= 1: # if queue size is not empty
seq_n = receive_queue.get()
if rcv_base <= seq_n: # discard already received packet
print(seq_n)
if seq_n == rcv_base: # in order delivery
rcv_base = seq_n + 1
serverSocket.sendto(str(rcv_base - 1).encode(), (serverIP, clientPort)) # send cumulative ack
if seq_n == 999:
break;
th_handling_ack.join()
serverSocket.close()