startServer(host, port, multicastAddress, ttl) {
		return new this.Promise(resolve => {
			try {
				const server = dgram.createSocket({
					type: "udp4",
					reuseAddr: this.opts.udpReuseAddr
				});

				server.on("message", this.onMessage.bind(this));

				server.on("error", err => {
					this.logger.warn("UDP server binding error!", err);
					resolve();
				});

				host = host || "0.0.0.0";
				port = port || 4445;

				server.bind({ port, host, exclusive: true }, () => {
					try {
						if (multicastAddress) {
							this.logger.info(
								`UDP Multicast Server is listening on ${host}:${port}. Membership: ${multicastAddress}`
							);
							server.setMulticastInterface(host);
							server.addMembership(multicastAddress, host);
							server.setMulticastTTL(ttl || 1);
							server.destinations = [multicastAddress];
						} else {
							this.logger.info(
								`UDP Broadcast Server is listening on ${host}:${port}`
							);
							server.setBroadcast(true);

							if (typeof this.opts.udpBroadcast == "string")
								server.destinations = [this.opts.udpBroadcast];
							else if (Array.isArray(this.opts.udpBroadcast))
								server.destinations = this.opts.udpBroadcast;
							else server.destinations = this.getBroadcastAddresses();

							this.logger.info(
								"    Broadcast addresses:",
								server.destinations.join(", ")
							);
						}
					} catch (err) {
						// In cluster it throw error
						this.logger.debug("UDP multicast membership error. Message:", err.message);
					}

					this.servers.push(server);

					resolve();
				});
			} catch (err) {
				this.logger.warn("Unable to start UDP Discovery Server. Message:", err.message);
				resolve();
			}
		});
	}
Start an UDP broadcast/multicast server

@param {String?} host
@param {Number?} port
@param {String?} multicastAddress
@param {Number?} ttl