Ejemplo n.º 1
0
 def sendAck(self):
     """Function for building and sending acknowledgement frame"""
     frame = Frame(self.senderAddress, self.receiverAddress,
                   self.frameType['ack'], self.seqNo,
                   'acknowledgement frame')
     self.recentACK = frame
     self.connection.send(str.encode(frame.toBinaryString(22)))
Ejemplo n.º 2
0
 def sendAck(self):
     """Function for building and sending ACK frame"""
     frame = Frame(self.senderAddress, self.receiverAddress,
                   self.frameType['ack'], self.front,
                   'acknowledgement frame')
     self.recentACK = frame
     print("Sent ACK", self.front)
     self.connection.send(str.encode(frame.toBinaryString(22)))
     self.lastACKsent = time.time()
Ejemplo n.º 3
0
    def sendFrames(self):
        """Function to handle data sending"""
        time.sleep(0.2)

        # mark the start of sending
        print("\n", self.name, " starts sending data to ", self.receiver, "\n")

        # open data file for reading
        file = open(self.fileName, 'r')

        # read data from file
        data_frame = file.read(46)

        # loop until whole data is sent
        while data_frame:
            # if window is not full, send another frame
            if (self.window_size < MAX_WINDOW_SIZE):
                # build frame using data, type and sequence number
                frame = Frame(self.senderAddress, self.receiverAddress,
                              self.frameType['data'], self.end, data_frame)

                # store current frame for re-transmission (if needed)
                self.current_window[self.end] = frame

                # acquire window write lock
                self.lock.acquire()

                # send the frame
                self.connection.send(str.encode(frame.toBinaryString(46)))

                print("\nSTATUS: FRAME", self.end, "SENT TO CHANNEL")

                self.frameTimer[self.end] = time.time()

                # update end, window size and other parameters accordingly
                self.end = ((self.end + 1) % MAX_SEQUENCE_NUMBER)
                self.window_size += 1
                self.frameCount += 1
                self.totalFrameCount += 1

                # read next data frame
                data_frame = file.read(46)

                # release window write lock
                self.lock.release()

            # if all data has been read, break
            if len(data_frame) == 0: break

        # set the end-transmitting flag True
        self.eot = True

        # close the data file
        file.close()
Ejemplo n.º 4
0
    def sendFrame(self):
        """Function to send data"""
        time.sleep(0.2)

        # open data file for reading
        file = open(self.fileName, 'r')
        # read the first data to be sent in a frame
        data = file.read(46)

        self.seqNo = 0
        self.frameCount = 0
        self.totalframeCount = 0

        # loop until whole data is sent
        while data:
            if (not self.frameSent):
                # build frame using data, type and sequence number
                frame = Frame(self.senderAddress, self.receiverAddress,
                              self.frameType['data'], self.seqNo, data)
                # store current frame for re-transmission (if needed)
                self.lastFrame = frame

                # acquire the send lock
                self.lock.acquire()

                # send the frame and start sent-timer
                self.connection.send(str.encode(frame.toBinaryString(46)))

                self.sentTime = time.time()
                self.frameSent = True

                # update sequence number and other parameters accordingly
                self.seqNo = (self.seqNo + 1) % 2
                self.frameCount += 1
                self.totalframeCount += 1

                print("\nSTATUS: FRAME", self.frameCount, "SENT TO CHANNEL")

                # release the send lock
                self.lock.release()

                # read next data
                data = file.read(46)

                # if all data has been read, break
                if len(data) == 0: break

        # set the end of transmission flag to True
        self.eot = True

        # close the data file
        file.close()
Ejemplo n.º 5
0
class Receiver:
    def __init__(self, connection, name: str, senderAddress: int,
                 receiverAddress: int, file: str):
        # get the client/receiver connection and other informations (name, data file name)
        self.connection = connection
        self.name = name
        self.filename = file
        self.senderAddress = senderAddress
        self.receiverAddress = receiverAddress

        # some transmission control variables and flags
        self.frameType = {'data': 0, 'ack': 1}
        self.seqNo = 0
        self.recentACK = Frame(senderAddress, receiverAddress, 1, 0,
                               "Acknowledgement Frame")

    def sendAck(self):
        """Function for building and sending acknowledgement frame"""
        frame = Frame(self.senderAddress, self.receiverAddress,
                      self.frameType['ack'], self.seqNo,
                      'acknowledgement frame')
        self.recentACK = frame
        self.connection.send(str.encode(frame.toBinaryString(22)))

    def resendPreviousACK(self):
        """Function for resending previous acknowledgement frame if needed"""
        self.connection.send(str.encode(self.recentACK.toBinaryString(22)))

    def startReceiving(self):
        """# Function for receiving data"""
        time.sleep(0.4)

        # receive data from sender
        data = self.connection.recv(576).decode()

        # initialise total data received
        total_data = ""

        while data != "end":
            print("\nSTATUS: FRAME RECEIVED")

            # build frame from binary data string
            frame = Frame.build(data)

            # If frame has no error
            if not frame.hasError():
                print("STATUS: NO ERROR FOUND")

                seqNo = frame.getSeqNo()
                if self.seqNo == seqNo:
                    # extract data
                    data = frame.getData()
                    # print(data)
                    total_data += data
                    # update the sequence number of ACK
                    self.seqNo = (self.seqNo + 1) % 2
                    # send the corresponding ACK
                    self.sendAck()
                    print("STATUS: ACK SENT\n")

                # if sequence number is not what is required, resend the previous ACK
                else:
                    self.resendPreviousACK()
                    print("STATUS: ACK RESENT")
            # discard erroneous frame
            else:
                print("STATUS: FRAME DISCARDED")

            # wait and receive next frame
            data = self.connection.recv(576).decode()

        file = open(self.filename, 'w')
        file.write(total_data)
        file.close()
Ejemplo n.º 6
0
 def sendNak(self):
     """Function for building and sending NAK frame"""
     frame = Frame(self.senderAddress, self.receiverAddress,
                   self.frameType['nak'], self.front, 'not acknowledgement')
     self.connection.send(str.encode(frame.toBinaryString(22)))
     print("Sent NAK", self.front)
Ejemplo n.º 7
0
class Receiver:
    def __init__(self, connection, name: str, senderAddress: int,
                 receiverAddress: int, file: str):
        # get the client/receiver connection and other informations (name, data file name)
        self.connection = connection
        self.name = name
        self.filename = file
        self.senderAddress = senderAddress
        self.receiverAddress = receiverAddress

        # some transmission control variables and flags
        self.frameType = {'data': 0, 'ack': 1, 'nak': 2}
        self.front = 0
        self.end = WINDOW_SIZE
        self.window = [0 for i in range(0, MAX_SEQUENCE_NUMBER)]
        self.filled_up = [False for i in range(0, MAX_SEQUENCE_NUMBER)]
        self.nakSent = False
        self.ackSent = False
        self.recentACK = Frame(self.senderAddress, self.receiverAddress, 1, 0,
                               "Acknowledgement Frame")
        self.eot = False
        self.lastACKsent = None

    def validSEQ(self, seq_no: int):
        """Function to check if the sequence number of incoming frame lies within window"""
        if ((self.front <= seq_no and seq_no < self.end)
                or (self.end < self.front and self.front <= seq_no)
                or (seq_no < self.end and self.end < self.front)):
            return True
        else:
            return False

    def sendAck(self):
        """Function for building and sending ACK frame"""
        frame = Frame(self.senderAddress, self.receiverAddress,
                      self.frameType['ack'], self.front,
                      'acknowledgement frame')
        self.recentACK = frame
        print("Sent ACK", self.front)
        self.connection.send(str.encode(frame.toBinaryString(22)))
        self.lastACKsent = time.time()

    def sendNak(self):
        """Function for building and sending NAK frame"""
        frame = Frame(self.senderAddress, self.receiverAddress,
                      self.frameType['nak'], self.front, 'not acknowledgement')
        self.connection.send(str.encode(frame.toBinaryString(22)))
        print("Sent NAK", self.front)

    def resendPreviousACK(self):
        """Function for resending last ACK on timeout"""
        while (not self.eot):
            if (self.lastACKsent == None):
                continue
            elapsedTime = time.time() - self.lastACKsent
            if (elapsedTime > 1):
                self.connection.send(
                    str.encode(self.recentACK.toBinaryString(22)))
                self.lastACKsent = time.time()

    def startReceiving(self):
        """Function for receiving frames"""
        time.sleep(0.4)

        ACKresendingThread = threading.Thread(target=self.resendPreviousACK)
        ACKresendingThread.start()

        # wait for data and receive
        data = self.connection.recv(576).decode()

        total_data = ""

        while data != "end":
            # build frame from binary data string
            frame = Frame.build(data)
            print("\nSTATUS: FRAME RECEIVED")

            if not frame.hasError():
                print("STATUS: NO ERROR FOUND")
                seqNo = frame.getSeqNo()

                # if frame other than first one got, send NAK
                if (seqNo != self.front and self.nakSent == False):
                    self.sendNak()
                    self.nakSent = True

                # if seq no within the window accept it
                if (self.validSEQ(seqNo) and self.filled_up[seqNo] == False):
                    self.filled_up[seqNo] = True
                    self.window[seqNo] = frame.getData()
                    print(frame.getData())

                    # take the received data sequentially into the final data string
                    # update the front, end of the window accordingly (also update flags)
                    while (self.filled_up[self.front] == True):
                        total_data += self.window[self.front]
                        self.filled_up[self.front] = False
                        self.front = (self.front + 1) % MAX_SEQUENCE_NUMBER
                        self.end = (self.end + 1) % MAX_SEQUENCE_NUMBER
                        self.ackSent = True
                        print("STATUS: FRAME RECEIVED SUCCESSFULLY")

                    # if sequential frame received, send acknowledgement
                    if (self.ackSent):
                        self.sendAck()
                        self.ackSent = False
                        self.nakSent = False

            # discard erroneous frame
            else:
                print("STATUS: ERRONEOUS FRAME")

            # wait and receive next frame
            data = self.connection.recv(576).decode()

        # stop the resending-acknowledgement thread
        self.eot = True
        ACKresendingThread.join()

        # write the whole data into file
        file = open(self.filename, 'w')
        file.write(total_data)
        file.close()