Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def rudp_recv(sock):
- tmr = select.select([sock], [], [], 1)
- if tmr[0]:
- data, client = sock.recvfrom(BUFFSIZE)
- packetUnpickle = pickle.loads(data)
- return(packetUnpickle[3], packetUnpickle[1], packetUnpickle[0], client)
- else:
- print("Time out error")
- return(False, -1, -1, -1)
- def rudp_send(sock, datatype, data, seq, dest):
- pckt = (datatype, seq, len(data), data)
- packetPickle = pickle.dumps(pckt)
- sock.sendto(packetPickle, dest)
- return pckt
- # msgtype 1 = client in state 1, still data left
- # msgtype 2 = client in state 1, on last packet
- # msgtype 3 = server ack for some data
- def rudp_server_bit(host, port, fileObj):
- s = socket(AF_INET, SOCK_DGRAM)
- s.bind(("0.0.0.0", port))
- print ("UDP Bit Server ready")
- bit = 0
- previousBit = 0
- firstRecv = True
- clientaddr = ()
- state = 1 # 1 = receiving, 2 = sending ack
- while 1:
- buff, recv, msgtype, client = rudp_recv(s)
- print(buff)
- # print(client)
- if firstRecv == True:
- if client != -1:
- clientaddr = client
- if bit == recv:
- firstRecv = False
- fileObj.write(buff)
- rudp_send(s, 3, "ack".encode(), bit, clientaddr)
- previousBit = bit
- if bit:
- bit = 0
- else:
- bit = 1
- if msgtype == 2: # received last packet
- break
- else: #if incorrect alternating bit
- if (not firstRecv):
- rudp_send(s, 3, "ack".encode(), previousBit, clientaddr)
- print("Incorrect packet received")
- s.close()
- def rudp_client_bit(host, port, fileObj):
- s = socket(AF_INET, SOCK_DGRAM)
- s.setblocking(0)
- addr = ("10.10.2.10", port)
- print("UDP bit client ready")
- buff = fileObj.read(BUFFSIZE)
- bit = 0
- firstSent = True
- state = 1
- pckt = []
- packetnum = 0
- # state 1 = sending packets, state 2 = receiving acks
- #while there is still a message to send:
- while buff:
- if state == 1:
- if firstSent:
- pckt = rudp_send(s, 1, buff, bit, addr)
- else:
- # if remaining buff is less than buffsize, on last packet
- if len(buff) < BUFFSIZE:
- print("Last packet")
- pckt = rudp_send(s, 2, buff, bit, addr)
- else:
- pckt = rudp_send(s, 1, buff, bit, addr)
- state = 2
- elif state == 2:
- print("Made it to state 2")
- rcved = rudp_recv(s)
- print("Received")
- # if timeout or mismatch or some error
- if rcved[1] != bit:
- pckt = rudp_send(s, pckt[0], pckt[3], bit, addr)
- print("Resend packet: " + str(bit))
- elif rcved[1] == bit:
- firstSent = False
- if bit:
- bit = 0
- else:
- bit = 1
- buff = fileObj.read(BUFFSIZE)
- state = 1
- #close after transfer finishes
- s.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement