PHP 警告:socket_read():无法从套接字 [104] 读取:连接被对等方重置

Posted

技术标签:

【中文标题】PHP 警告:socket_read():无法从套接字 [104] 读取:连接被对等方重置【英文标题】:PHP Warning: socket_read(): unable to read from socket [104]: Connection reset by peer 【发布时间】:2014-12-24 03:19:57 【问题描述】:

我使用socket_create()创建套接字资源,然后我通过socket_bind()IP地址绑定到它,它工作正常;

但在socket_read($sock, 2048) 行一段时间后(超过30分钟)抛出此错误:

"php Warning: socket_read(): unable to read from socket [104]: Connection reset by peer in test.php on line 198"

这是我的简化代码:

$this->sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// check if tcp socket ceated or not
if ($this->sock === false) 
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
     die("Couldn't create socket: [$errorcode] $errormsg");


// Bind the source address
socket_bind($this->sock, $this->ip);
// Connect to destination address
socket_connect($this->sock, $this->mxHost, $this->port);
$buf = socket_read($this->sock, 2048);

这段代码与另一端的 MX 主机建立了 SMTP(端口 25)连接。 也许是你的连接另一端的问题,但我怎么能检测到另一端现在还没有准备好连接。换句话说,我怎样才能发现“对等连接重置”发生了?

【问题讨论】:

【参考方案1】:

嗯...您的对等方重置了连接。也许这是您连接另一端的错误?另一端可能正在运行超时机制。

您可以在使用socket_last_error 函数写入套接字之前测试套接字并在断开连接时重新创建连接。

【讨论】:

socket_last_error() 在 socket_create() 之后没有显示任何错误。 但它是否会在您执行在给定时间导致警告的表达式之前显示错误?您应该在发出socket_read 之前测试您的套接字。如果 'socket_last_error` 报告错误,请重新创建您的 SMTP 会话。通过再次执行整个 socket_create 部分。【参考方案2】:

在读取socket_connect() 之前,您应该检查它是否成功。

所以你可以像这样重写你的代码:

-- 更新--

$this->sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// Bind the source address
socket_bind($this->sock, $this->ip);
// Connect to destination address
if (socket_connect($this->sock, $this->mxHost, $this->port)) 
    // suppress the warning for now since we have error checking below
    $buf = @socket_read($this->sock, 2048);

    // socket_read() returns a zero length string ("") when there is no more data to read.
    // This indicates that the socket is closed on the other side. 
    if ($buf === '') 
     
        throw new \Exception('Connection reset by peer'); 
     
 else 
    // Connection was not successful. Get the last error and throw an exception
    $errorMessage = socket_strerror(socket_last_error());
    throw new \Exception($errorMessage);

【讨论】:

我添加了一些看起来像你的代码,但是socket连接成功,并且通过了检查if语句,然后socket_read行抛出错误。 我已经更新了代码,以便检查 socket_read 是否返回任何数据。 我把socket_connect放在if语句中,但是socket_connect返回true,但是socket_read抛出了那个错误。 :( 即使服务器完全在那里,您的代码不会抛出连接重置错误吗?您只检查一个空字符串,可以是超时、连接重置或只是没有发送数据的服务器。

以上是关于PHP 警告:socket_read():无法从套接字 [104] 读取:连接被对等方重置的主要内容,如果未能解决你的问题,请参考以下文章

如何将socket_read值获取为从PHP websocket中的javascript发送的纯文本

`PHP 警告:PHP 启动:无法加载动态库 'mcrypt.so'

PHP 警告:PHP 启动:无法加载动态库 'bz2'

Composer 安装“PHP 警告:PHP 启动:无法加载动态库 'gd2'”

PHP 警告:PHP 启动:无法加载动态库

PHP 警告:PHP 启动:无法加载动态库