code: def sequential_connect(self):
          
  
          # 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]
docs: 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.