/**
  * @param integer $discoverTime
  * @return $this
  */
 public function discover(int $discoverTime = 10) : self
 {
     $client = new UDPClient();
     $client->setHost($this->host);
     $client->setPort($this->port);
     $client->setTimeout($discoverTime, 0);
     $client->setAllowBrowscast(true);
     $client->connect();
     $client->write($this->buildPacket('OPTIONS', max(1, $discoverTime / 2)));
     $client->write($this->buildPacket('M-SEARCH', max(1, $discoverTime / 2)));
     $endTime = time() + $discoverTime;
     while (time() < $endTime) {
         if ($this->server) {
             $this->server->listen(1);
         }
         /** @var string $msg */
         if (!($msg = $client->read())) {
             usleep(0.01);
             continue;
         }
         self::$eventHandler->fireEvent(EventDiscover::EVENT_NAME, new EventDiscover((new SsdpResponse())->setFromString($msg)));
     }
     $client->disconnect();
     return $this;
 }
 /**
  * @param InputInterface $input
  * @param OutputInterface $output
  * @return integer
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     /** @var SsdpResponse[] $services */
     $services = [];
     $server = new SimpleServiceDiscoveryProtocolServer();
     $server->addAllowedMulticastAddress('239.255.255.250');
     $server->bind();
     $client = new SimpleServiceDiscoveryProtocolClient($this->discoverTime);
     $client->setServer($server);
     $client->addEvent(EventDiscover::EVENT_NAME, function (EventDiscover $event) use(&$services) {
         $service = $event->getSsdpResponse();
         if (isset($services[$service->getLocation()])) {
             return;
         }
         $services[$service->getLocation()] = $service;
         printf("%s\n\t<%s>\n\n", $service->getServer(), $service->getLocation());
     });
     $client->discover($this->discoverTime);
     return 0;
 }