对等php套接字重置连接 [英] Connection reset by peer php socket

查看:62
本文介绍了对等php套接字重置连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个硬件跟踪器设备,我正在使用 PHP 套接字监听它.我将套接字文件作为守护程序文件运行,这意味着脚本将永远运行.但是运行一段时间后,我收到此错误

I have a hardware tracker device and I am listening to it by using PHP sockets. I am running the socket file as daemon file meaning the script is running forever. But after running for a while I am getting this error

对等方重置连接

我正在使用这个套接字库 https://github.com/navarr/Sockets 和将文件作为守护进程运行我正在使用 forever

I am using this socket Library https://github.com/navarr/Sockets and for running the file as daemon I am using forever

运行一段时间后出现此错误

After running for a while I get this error

<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

我想确切地知道是什么导致了这个错误.我不希望我的脚本停止.为什么我收到对等方重置的错误连接.我该如何解决这个问题

I want to know exactly what causes this error. I don't want my script to stop. why I am getting error connection reset by peer. How can I fix this

如果没有解决对等连接重置的解决方案,那么我是否有可能在收到错误后 5 分钟后再次运行脚本对等连接重置>.

If there is no solution to fix connection reset by peer then is there any possibility that I can run the script again after 5 minutes after getting an error Connection reset by peer.

为什么 5 分钟是因为套接字进入等待阶段,并且当永远尝试再次运行脚本时,它说地址已在使用中

why 5 minutes is because socket go in wait stage and when forever try to run again the script it says address already in use

代码:

<?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 文件

Since the error is coming in line no 685 below is that function which is written in Socket.php file

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

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

        return $result;
    }

推荐答案

connection reset by peer 发生错误,因为您的服务器可能正在尝试从一个已经被对端关闭的套接字写入或读取消息,实际上,根据异常堆栈跟踪,服务器读取数据时发生了错误.您需要确保您使用的套接字库实现 ping 和 pong 消息传递,如果客户端发送 ping 消息,它希望收到 pong 消息返回或关闭连接.

The error connection reset by peer occurred because your server might be trying to write or read a message from a socket that has been closed by the peer, in fact, base on the exception stack trace, the error occurred when the server read data. You need to make sure the socket library your using implement ping and pong messaging if the client sends ping message, it expects to receive pong message back or close the connection.

如果这不能解决您的问题,请尝试捕获异常,退出 PHP 脚本并重新启动它.导致此错误的可能性有很多.

If that didn't solve your problem, try catching the exception, exit the PHP script and start it again. There are so many possibilities that might cause this error.

这篇关于对等php套接字重置连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆