Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.15 KB | None | 0 0
  1. def rudp_recv(sock):
  2. tmr = select.select([sock], [], [], 1)
  3. if tmr[0]:
  4. data, client = sock.recvfrom(BUFFSIZE)
  5. packetUnpickle = pickle.loads(data)
  6. return(packetUnpickle[3], packetUnpickle[1], packetUnpickle[0], client)
  7. else:
  8. print("Time out error")
  9. return(False, -1, -1, -1)
  10.  
  11. def rudp_send(sock, datatype, data, seq, dest):
  12. pckt = (datatype, seq, len(data), data)
  13. packetPickle = pickle.dumps(pckt)
  14. sock.sendto(packetPickle, dest)
  15. return pckt
  16.  
  17. # msgtype 1 = client in state 1, still data left
  18. # msgtype 2 = client in state 1, on last packet
  19. # msgtype 3 = server ack for some data
  20. def rudp_server_bit(host, port, fileObj):
  21. s = socket(AF_INET, SOCK_DGRAM)
  22. s.bind(("0.0.0.0", port))
  23. print ("UDP Bit Server ready")
  24. bit = 0
  25. previousBit = 0
  26. firstRecv = True
  27. clientaddr = ()
  28. state = 1 # 1 = receiving, 2 = sending ack
  29. while 1:
  30. buff, recv, msgtype, client = rudp_recv(s)
  31. print(buff)
  32. # print(client)
  33. if firstRecv == True:
  34. if client != -1:
  35. clientaddr = client
  36. if bit == recv:
  37. firstRecv = False
  38. fileObj.write(buff)
  39. rudp_send(s, 3, "ack".encode(), bit, clientaddr)
  40. previousBit = bit
  41. if bit:
  42. bit = 0
  43. else:
  44. bit = 1
  45. if msgtype == 2: # received last packet
  46. break
  47. else: #if incorrect alternating bit
  48. if (not firstRecv):
  49. rudp_send(s, 3, "ack".encode(), previousBit, clientaddr)
  50. print("Incorrect packet received")
  51. s.close()
  52.  
  53. def rudp_client_bit(host, port, fileObj):
  54. s = socket(AF_INET, SOCK_DGRAM)
  55. s.setblocking(0)
  56. addr = ("10.10.2.10", port)
  57. print("UDP bit client ready")
  58. buff = fileObj.read(BUFFSIZE)
  59. bit = 0
  60. firstSent = True
  61. state = 1
  62. pckt = []
  63.  
  64. packetnum = 0
  65. # state 1 = sending packets, state 2 = receiving acks
  66.  
  67. #while there is still a message to send:
  68. while buff:
  69. if state == 1:
  70. if firstSent:
  71. pckt = rudp_send(s, 1, buff, bit, addr)
  72. else:
  73. # if remaining buff is less than buffsize, on last packet
  74. if len(buff) < BUFFSIZE:
  75. print("Last packet")
  76. pckt = rudp_send(s, 2, buff, bit, addr)
  77. else:
  78. pckt = rudp_send(s, 1, buff, bit, addr)
  79. state = 2
  80. elif state == 2:
  81. print("Made it to state 2")
  82. rcved = rudp_recv(s)
  83. print("Received")
  84. # if timeout or mismatch or some error
  85. if rcved[1] != bit:
  86. pckt = rudp_send(s, pckt[0], pckt[3], bit, addr)
  87. print("Resend packet: " + str(bit))
  88. elif rcved[1] == bit:
  89. firstSent = False
  90. if bit:
  91. bit = 0
  92. else:
  93. bit = 1
  94. buff = fileObj.read(BUFFSIZE)
  95. state = 1
  96. #close after transfer finishes
  97. s.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement