Сброс соединения через равноправный сокет php - PullRequest
0 голосов
/ 02 июня 2018

У меня есть аппаратное устройство отслеживания, и я слушаю его с помощью PHP-сокетов.Я запускаю файл сокета как файл демона, что означает, что скрипт работает вечно.Но после запуска какое-то время я получаю эту ошибку

Сброс соединения по пиру

Я использую этот сокет Library https://github.com/navarr/Sockets и для запуска файлав качестве демона я использую навсегда

После некоторого запуска я получаю эту ошибку

<br />
<b>Fatal error</b>:  Uncaught exception 'Navarr\Socket\Exception\SocketException' with message 'Connection reset by peer' in /var/www/html/tracker2/src/Socket.php:685
Stack trace:
#0 /var/www/html/tracker2/src/Socket.php(532): Navarr\Socket\Socket::exceptionOnFalse(Resource id #10117, Object(Closure))
#1 /var/www/html/tracker2/src/Server.php(236): Navarr\Socket\Socket-&gt;read(1024, 2)
#2 /var/www/html/tracker2/src/Server.php(202): Navarr\Socket\Server-&gt;read(Object(Navarr\Socket\Socket))
#3 /var/www/html/tracker2/src/Server.php(158): Navarr\Socket\Server-&gt;loopOnce()
#4 /var/www/html/tracker2/socket.php(33): Navarr\Socket\Server-&gt;run()
#5 /var/www/html/tracker2/socket.php(96): EchoServer-&gt;__construct('172.xx.xx.xxx')
#6 {main}
  thrown in <b>/var/www/html/tracker2/src/Socket.php</b> on line <b>685</b><br />
error: Forever detected script exited with code: 255
error: Script restart attempt #1
<br />
<b>Fatal error</b>:  Uncaught exception 'Navarr\Socket\Exception\SocketException' with message 'Address already in use' in /var/www/html/tracker2/src/Socket.php:685
Stack trace:
#0 /var/www/html/tracker2/src/Socket.php(138): Navarr\Socket\Socket::exceptionOnFalse(Resource id #28, Object(Closure))
#1 /var/www/html/tracker2/src/Server.php(136): Navarr\Socket\Socket-&gt;bind('172.xx.xx.xxx', 8153)
#2 /var/www/html/tracker2/socket.php(20): Navarr\Socket\Server-&gt;__construct('172.xx.xx.xxx', 8153)
#3 /var/www/html/tracker2/socket.php(96): EchoServer-&gt;__construct('172.xx.xx.xxx')
#4 {main}
  thrown in <b>/var/www/html/tracker2/src/Socket.php</b> on line <b>685</b><br />
error: Forever detected script exited with code: 255

Я хочу точно знать, что является причиной этой ошибки.Я не хочу, чтобы мой сценарий остановился.почему я получаю сообщение об ошибке сброса соединения по пиру.Как я могу это исправить

Если не существует решения, чтобы исправить сброс соединения по peer , тогда есть ли вероятность, что я смогу запустить скрипт снова через 5 минут после получения ошибки Сброс соединения по пиру .

почему 5 минут - потому что сокет переходит в стадию ожидания, а когда вечно пытаются запустить снова скрипт, он говорит, что адрес уже используется

Код:

<?php

use Navarr\Socket\Socket;
use Navarr\Socket\Server;

class EchoServer extends Server
{
    const DEFAULT_PORT = 7;

    public function __construct($ip = null, $port = self::DEFAULT_PORT)
    {
        parent::__construct($ip, $port);
        $this->addHook(Server::HOOK_CONNECT, array($this, 'onConnect'));
        $this->addHook(Server::HOOK_INPUT, array($this, 'onInput'));
        $this->addHook(Server::HOOK_DISCONNECT, array($this, 'onDisconnect'));
        $this->run();
    }

    public function onConnect(Server $server, Socket $client, $message)
    {
        echo 'Connection Established',"\n";
    }

    public function onInput(Server $server, Socket $client, $message)
    {
        echo 'Received "',$message,'"',"\n";
        $client->write($message, strlen($message));
    }

    public function onDisconnect(Server $server, Socket $client, $message)
    {
        echo 'Disconnection',"\n";
    }
}

Так какошибка появляется в строке № 685 ниже приведена та функция, которая записана в Socket.php файл

protected static function exceptionOnFalse($resource, callable $closure)
    {
        $result = $closure($resource);

        if ($result === false) {
            throw new SocketException($resource);
        }

        return $result;
    }

1 Ответ

0 голосов
/ 03 июня 2018

Ошибка connection reset by peer произошла из-за того, что ваш сервер мог пытаться записать или прочитать сообщение из сокета, который был закрыт равноправным узлом, фактически, на основе трассировки стека исключений, ошибка произошла, когда сервер прочитал данные,Вы должны убедиться, что библиотека сокетов использует пинг и понг, если клиент отправляет пинговое сообщение, он ожидает получить сообщение pong или закрыть соединение.

Если это не решило вашу проблему, попробуйтепоймав исключение, выйдите из скрипта PHP и запустите его снова.Существует так много возможностей, которые могут вызвать эту ошибку.

...