Beispiel #1
0
    def __sendCnct(self):

        #create packet
        self.log("Creating init packet......\n")

        try:
            self.log("Setting flags...\n")
            flags = (True, False, False, False, False, False)
        except Exception as e:
            self.log("Exception: " + str(e))
            sys.exit(0)
        self.log("Flags created...\n")

        try:
            cnctPacket = RxPacket.getCnct(
                        srcPort = self.srcRxPPort,
                        desPort = self.desRxPPort,
                        seqNum = self.seqNum,
                        ackNum = self.ackNum,
                        winSize = self.recvWindowSize,
                        )
        except Exception as e:
            self.log("Exception: " + str(e))
            sys.exit(0)

        #increment seq num
        self.log("Incrementing sequence number......\n")
        self.seqNum = self.seqNum + 1 #increment by number of bytes (20 byte header only)
        if self.seqNum > RxPacket.maxSeqNum():
            self.seqNum = 0

        #transfer packet
        resetsLeft = self.resetLimit
        self.log("Entering send loop for CNCT packet......\n")
        while resetsLeft:
            self.log("Sending init to IP: " + self.desAddr + " and Port:" + str(self.desUDPPort) +"...\n")

            try:
                self.sendto(cnctPacket.toByteArray(), (self.desAddr, self.desUDPPort))
            except Exception as e:
                self.log("Exception while calling sendto: " + str(e) + "\n")

            self.log("SENT INIT PACKET!\n")

            try:
                self.log("Waiting for ack......\n")
                data, address = self.recvfrom(self.recvWindowSize)
                log("Packet received successfully, calling reconstructPacket from _sendCNCT...\n")
                packet = self.__reconstructPacket(data = bytearray(data))
                log("Packet successfully reconstructed inside _sendCNCT...\n")

                if not packet:
                    self.log("Checksum failed......\n")
                    resetsLeft -= 1
                    continue
            except socket.timeout:
                resetsLeft -= 1
            except Exception:
                resetsLeft -= 1
            else:
                if packet.isAck() and packet.header['ackNum'] == self.seqNum:
                    self.log("init has been acked......\n")
                    break
                else:
                    self.log("Wrong packet recieved, restarting cnct loop......\n")
                    resetsLeft -= 1

        if not resetsLeft:
            self.log("socket timeout......\n")
            raise Exception('socket timeout')

        return packet