def receiver(): # receive data from server (data, addr) global LASTACK global EXIT_THREAD global SEND_BUF global SEND_BUF_SEQ global TIMER global EXPIRED recv_buf = [] toDisplay = -1 time.sleep(0.01) while EXIT_THREAD != 1: try: d = s.recvfrom(64) recv_buf.append(d) # print "Receiving.." except: # print "error here" pass for datagram in recv_buf: errno, seq_no = util.parseDatagram(datagram[0], 1) if errno == 0: if len(SEND_BUF_SEQ) > 0 and (seq_no >= SEND_BUF_SEQ[0]): # print "ACK #" + str(seq_no) # print SEND_BUF_SEQ diff = seq_no - SEND_BUF_SEQ[0] THREAD_LOCK.acquire() for tc in range(diff): SEND_BUF.pop(0) SEND_BUF_SEQ.pop(0) THREAD_LOCK.release() recv_buf.pop(0) TIMER.cancel() # TIMER.join() THREAD_LOCK.acquire() EXPIRED = 0 TIMER = threading.Timer(TIMER_SET, timerHandler) TIMER.start() THREAD_LOCK.release() LASTACK = seq_no - 1 elif errno == 1: print "Unmatched checksum, datagram is corrupted" elif errno == 2: print "Unmatched indicator, datagram is corrupted"
def FTPReceiver(s, p=0.05): global P # Probability of packet loss P = p # Initialize the Sequence number lastSEQNO = -1 max_seq_no = -1 firstTime = True MSS = 0 oldSEQNO = -1 buffer="" while 1: packet = s.recvfrom(1100) data = packet[0] serverAddr = packet[1] if not data: continue if firstTime: MSS = len(data) - 64 firstTime = False # Simulate a random drop process randomNum = random.random() # print randomNum if randomNum <= P: if oldSEQNO != lastSEQNO: oldSEQNO = lastSEQNO print "Packet loss, sequence num = " + str((lastSEQNO + 1) * MSS) continue errno, seq_no, dataText = util.parseDatagram(data, 0) # print "SEQ_NO:" + str(seq_no) # print "LAST_ACK:" + str(lastSEQNO) if seq_no > max_seq_no: max_seq_no = seq_no if errno == 0: if seq_no == lastSEQNO + 1: lastSEQNO = seq_no buffer+=dataText reply = util.buildHeader(lastSEQNO+1, '', 1) s.sendto(reply, serverAddr) elif errno == 1: print "Unmatched checksum, datagram is corrupted" break elif errno == 2: print "Unmatched indicator, datagram is corrupted" break else: if seq_no == lastSEQNO + 1: lastSEQNO = seq_no reply = util.buildHeader(lastSEQNO+1, '', 3) s.sendto(reply, serverAddr) if max_seq_no == lastSEQNO: print "Transfer finished!" print "SEQ_NO "+str((lastSEQNO+1)*MSS)+ " is sent!" break s.close() return buffer
def FTPReceiver(s, p=0.05): global P # Probability of packet loss P = p # Initialize the Sequence number lastSEQNO = -1 max_seq_no = -1 firstTime = True MSS = 0 oldSEQNO = -1 buffer = "" while 1: packet = s.recvfrom(1100) data = packet[0] serverAddr = packet[1] if not data: continue if firstTime: MSS = len(data) - 64 firstTime = False # Simulate a random drop process randomNum = random.random() # print randomNum if randomNum <= P: if oldSEQNO != lastSEQNO: oldSEQNO = lastSEQNO print "Packet loss, sequence num = " + str( (lastSEQNO + 1) * MSS) continue errno, seq_no, dataText = util.parseDatagram(data, 0) # print "SEQ_NO:" + str(seq_no) # print "LAST_ACK:" + str(lastSEQNO) if seq_no > max_seq_no: max_seq_no = seq_no if errno == 0: if seq_no == lastSEQNO + 1: lastSEQNO = seq_no buffer += dataText reply = util.buildHeader(lastSEQNO + 1, '', 1) s.sendto(reply, serverAddr) elif errno == 1: print "Unmatched checksum, datagram is corrupted" break elif errno == 2: print "Unmatched indicator, datagram is corrupted" break else: if seq_no == lastSEQNO + 1: lastSEQNO = seq_no reply = util.buildHeader(lastSEQNO + 1, '', 3) s.sendto(reply, serverAddr) if max_seq_no == lastSEQNO: print "Transfer finished!" print "SEQ_NO " + str((lastSEQNO + 1) * MSS) + " is sent!" break s.close() return buffer