Skip to content

Instantly share code, notes, and snippets.

@tehp
Created July 5, 2020 18:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tehp/6a4d63d1cd1125cf99ce1cb0eef8cd7c to your computer and use it in GitHub Desktop.
Save tehp/6a4d63d1cd1125cf99ce1cb0eef8cd7c to your computer and use it in GitHub Desktop.
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()
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