def sequential_connect(self):
        """
        Sequential connect is designed to return a connection to the
        Rendezvous Server but it does so in a way that the local port
        ranges (both for the server and used for subsequent hole
        punching) are allocated sequentially and predictably. This is
        because Delta+1 type NATs only preserve the delta value when
        the source ports increase by one.
        """

        # Connect to rendezvous server.
        try:
            mappings = sequential_bind(self.mapping_no + 1, self.interface)
            con = self.server_connect(mappings[0]["sock"])
        except Exception as e:
            log.debug(e)
            log.debug("this err")
            return None

        # First mapping is used to talk to server.
        mappings.remove(mappings[0])

        # Receive port mapping.
        msg = "SOURCE TCP %s" % (str(mappings[0]["source"]))
        con.send_line(msg)
        reply = con.recv_line(timeout=2)
        remote_port = self.parse_remote_port(reply)
        if not remote_port:
            return None

        # Generate port predictions.
        predictions = ""
        if self.nat_type != "random":
            mappings = self.predict_mappings(mappings)
            for mapping in mappings:
                predictions += str(mapping["remote"]) + " "
            predictions = predictions.rstrip()
        else:
            predictions = "1337"

        return [con, mappings, predictions]
Sequential connect is designed to return a connection to the
        Rendezvous Server but it does so in a way that the local port
        ranges (both for the server and used for subsequent hole
        punching) are allocated sequentially and predictably. This is
        because Delta+1 type NATs only preserve the delta value when
        the source ports increase by one.