code: private boolean gatherCandidate(IceComponent component, InetAddress address, int startingPort, RtpPortManager portManager, Selector selector) {
  		// Recursion stop criteria
  		if(startingPort == portManager.peek()) {
  			return false;
  		}
  		
  		// Gather the candidate using current port
  		try {
  			int port = portManager.current();
  			DatagramChannel channel = openUdpChannel(address, port, selector);
  			HostCandidate candidate = new HostCandidate(component, address, port);
  			this.foundations.assignFoundation(candidate);
  			component.addLocalCandidate(new LocalCandidateWrapper(candidate, channel));
  			return true;
  		} catch (IOException e) {
  			// The port is occupied. Try again with next logical port.
  			portManager.next();
  			return gatherCandidate(component, address, startingPort, portManager, selector);
  		}
  	}
docs: Gathers a candidate and registers it in the respective ICE Component. A
  datagram channel will be bound to the local candidate address.
  
  @param component
  The component the candidate belongs to
  @param address
  The address of the candidate
  @param startingPort
  The preferred port for the candidate to use.<br>
  The candidate port will change if the preferred port is
  already taken.
  @param portManager
  The port manager that keeps track of port range that can be
  used for candidate gathering.
  @param selector
  The selector to bind the candidate address to.
  @return Whether a candidate was successfully gathered. The portManager
  will keep track of the effective port.