code: func NewDefaultListener(protocol string, lAddr string, skipUPNP bool) Listener {
  	// Local listen IP & port
  	lAddrIP, lAddrPort := splitHostPort(lAddr)
  
  	// Create listener
  	var listener net.Listener
  	var err error
  	for i := 0; i < tryListenSeconds; i++ {
  		listener, err = net.Listen(protocol, lAddr)
  		if err == nil {
  			break
  		} else if i < tryListenSeconds-1 {
  			time.Sleep(time.Second * 1)
  		}
  	}
  	if err != nil {
  		PanicCrisis(err)
  	}
  	// Actual listener local IP & port
  	listenerIP, listenerPort := splitHostPort(listener.Addr().String())
  	log.Info("Local listener", "ip", listenerIP, "port", listenerPort)
  
  	// Determine internal address...
  	var intAddr *NetAddress
  	intAddr, err = NewNetAddressString(lAddr)
  	if err != nil {
  		PanicCrisis(err)
  	}
  
  	// Determine external address...
  	var extAddr *NetAddress
  	if !skipUPNP {
  		// If the lAddrIP is INADDR_ANY, try UPnP
  		if lAddrIP == "" || lAddrIP == "0.0.0.0" {
  			extAddr = getUPNPExternalAddress(lAddrPort, listenerPort)
  		}
  	}
  	// Otherwise just use the local address...
  	if extAddr == nil {
  		extAddr = getNaiveExternalAddress(listenerPort)
  	}
  	if extAddr == nil {
  		PanicCrisis("Could not determine external address!")
  	}
  
  	dl := &DefaultListener{
  		listener:    listener,
  		intAddr:     intAddr,
  		extAddr:     extAddr,
  		connections: make(chan net.Conn, numBufferedConnections),
  	}
  	dl.BaseService = *NewBaseService(log, "DefaultListener", dl)
  	dl.Start() // Started upon construction
  	return dl
  }
docs: // skipUPNP: If true, does not try getUPNPExternalAddress()