public function run($handlerCallable, $invalidRequestHandlerCallable = null) { $this->handlerCallable = $handlerCallable; $this->invalidRequestHandlerCallable = $invalidRequestHandlerCallable; $loop = \React\EventLoop\Factory::create(); $factory = new \React\Datagram\Factory($loop); $listener = $this; $factory->createServer($this->udpServerIp . ':' . $this->udpServerPort)->then(function (\React\Datagram\Socket $server) use($listener) { $server->on('message', [$listener, "receive"]); }); $loop->run(); }
/** * Start servers for UDP Discovery and set timer for sending packets * @param LoopInterface $loop */ public function start($loop) { $factory = new \React\Datagram\Factory($loop); // IPv4 Server $factory->createServer('0.0.0.0:' . $this->discoveryPort)->then(function (\React\Datagram\Socket $client) { $client->on('message', function ($message, $serverAddress, $client) { // echo 'received ip4 "' . bin2hex($message) . '" from ' . $serverAddress . PHP_EOL; $this->handlePacket(Packet::createFromString($message, $this->stripPort($serverAddress))); }); }); // IPv6 Server $factory->createServer('[::]:' . $this->discoveryPort)->then(function (\React\Datagram\Socket $client) { $client->on('message', function ($message, $serverAddress, $client) { // echo 'received ip6 "' . bin2hex($message) . '" from ' . $serverAddress . PHP_EOL; $this->handlePacket(Packet::createFromString($message, $this->stripPort($serverAddress))); }); }); $loop->addPeriodicTimer($this->syncInterval, function () { $this->sendAnnouncement(); }); $this->sendAnnouncement(); // TODO remove known hosts after some time }