Created
July 5, 2020 18:19
-
-
Save tehp/6a4d63d1cd1125cf99ce1cb0eef8cd7c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from random import Random | |
import socket | |
from threading import * | |
def makeseg(contents, seq_seg, seq_ack, is_ack): | |
return "data = " + str(contents) + " seqSeg = " + str(seq_seg) + " seqAck = " + str(seq_ack) + " isack = " + str(is_ack) | |
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
host = "127.0.0.1" | |
port = 8000 | |
serversocket.bind((host, port)) | |
seq_seg = 0 | |
seq_ack = 1 | |
seed = input("Choose a seed: ") | |
prob = float(input( | |
"What is the probability that the data segment 1 or 2 has been corrupted? (between 0 inclusive and 1 exclusive) ")) | |
rand = Random() | |
rand.seed(seed) | |
serversocket.listen(5) | |
c, addr = serversocket.accept() | |
last = "" | |
while True: | |
num = rand.random() | |
received = c.recv(4096).decode() | |
if received != "": | |
print("") | |
if num >= prob: | |
# Not corrupted | |
print("Segment received contains: " + received) | |
print("An ACK" + str(seq_ack) + " is about to be sent") | |
if "seqSeg = 0" in received: | |
seq_seg = 0 | |
seq_ack = 0 | |
elif "seqSeg = 1" in received: | |
seq_seg = 1 | |
seq_ack = 1 | |
ack = makeseg(0, seq_seg, seq_ack, 1) | |
if last == received: | |
print("The receiver is moving back to state WAIT FOR " + | |
str(seq_ack) + " FROM BELOW") | |
else: | |
print("The receiver is moving to state WAIT FOR " + | |
str(seq_ack) + " FROM BELOW") | |
print("ACK to send contains: " + ack) | |
c.send(ack.encode()) | |
else: | |
# Corrupted | |
print("A Corrupted segment has been received") | |
last = received | |
c.close() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from random import Random | |
import socket | |
from threading import * | |
import time | |
def makeseg(contents, seq_seg, seq_ack, is_ack): | |
return "data = " + str(contents) + " seqSeg = " + str(seq_seg) + " seqAck = " + str(seq_ack) + " isack = " + str(is_ack) | |
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
host = "127.0.0.1" | |
port = 8000 | |
serversocket.connect((host, port)) | |
seq_seg = 0 | |
seq_ack = 0 | |
seed_timing = input("Choose a seed for timing: ") | |
num_segments = int(input("What is the number of segments to send? ")) | |
seed_corrupted = input( | |
"Choose a seed for checking if an ACK has been corrupted: ") | |
prob = float(input( | |
"What is the probability that an ACK has been corrupted? (between 0 inclusive and 1 exclusive) ")) | |
seed_data = input("What is the seed for the packet data? ") | |
travel_time = input("What is the round trip travel time? ") | |
timing_gen = Random() | |
timing_gen.seed(seed_timing) | |
rand_corrupted_gen = Random() | |
rand_corrupted_gen.seed(seed_corrupted) | |
data_gen = Random() | |
data_gen.seed(seed_data) | |
serversocket.settimeout(3.0) | |
data = int(data_gen.random() * 1024) | |
resend = 0 | |
segments = 0 | |
while segments <= num_segments: | |
print("") | |
rand_corrupted = rand_corrupted_gen.random() | |
if resend: | |
print("A data segment with sequence number " + | |
str(seq_seg) + " is about to be resent ") | |
else: | |
print("A data segment with sequence number " + | |
str(seq_seg) + " is about to be sent ") | |
seg = makeseg(data, seq_seg, seq_ack, 0) | |
serversocket.send(seg.encode()) | |
if resend: | |
if seq_seg == 0: | |
print("The sender is moving back to state WAIT FOR ACK 0") | |
elif seq_seg == 1: | |
print("The sender is moving back to state WAIT FOR ACK 1") | |
else: | |
if seq_seg == 0: | |
print("The sender is moving to state WAIT FOR ACK 0") | |
elif seq_seg == 1: | |
print("The sender is moving to state WAIT FOR ACK 1") | |
print("Segment sent: " + seg) | |
try: | |
response = serversocket.recv(4096).decode() | |
except socket.timeout: # fail after 1 second of no activity | |
resend = 1 | |
continue | |
data = int(data_gen.random() * 1024) | |
resend = 0 | |
segments += 1 | |
if seq_seg == 0: | |
seq_seg = 1 | |
elif seq_seg == 1: | |
seq_seg = 0 | |
if rand_corrupted >= prob: | |
# not corrupted | |
if "seqAck = 0" in response: | |
print("An ACK0 segment has just been received") | |
print("The sender is moving to state WAIT FOR CALL 1 FROM ABOVE") | |
elif "seqAck = 1" in response: | |
print("An ACK1 segment has just been received") | |
print("The sender is moving to state WAIT FOR CALL 0 FROM ABOVE") | |
else: | |
print("Error: can't read response") | |
else: | |
# corrupted | |
print("A Corrupted ACK segment has just been received") | |
time.sleep(int(timing_gen.random() * 5)) | |
serversocket.shutdown(socket.SHUT_RDWR) | |
serversocket.close() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment