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 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
Beispiel #4
0
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