0

我正在开发一个 php 套接字客户端脚本。我希望脚本能够处理服务器停机时间。

我按如下方式开始连接

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

function connect()
{
    global $socket;
    global $ip;
    global $port;
    $connected = FALSE;
    while( $connected === FALSE )
    {
        sleep(5);
        $connected = socket_connect($socket, $ip, $port);
    }
}

connect();

在服务器可用之前尝试连接。

再往下,我检测到服务器不再响应,断开套接字,并尝试重新连接到服务器。

$ret = socket_write($socket, $str, strlen($str));
if ($ret === false)
{
    socket_shutdown($socket, 2);
    socket_close($socket);
    connect();
}

但是,我从 socket_connect 收到以下错误:

A connect request was made on an already connected socket.

此时,即使服务器重新联机,我的脚本重新连接的唯一方法是杀死它并重新启动它。还有更多关闭客户端套接字连接的方法吗?我在该主题上找到的大部分内容都与侦听传入连接的套接字有关。

我尝试使用“unset”和“socket_create”再次重新创建 $socket,但这也没有帮助。

编辑:我的意思是,如果我将最后一段代码更改为以下

$ret = socket_write($socket, $str, strlen($str));
if ($ret === false)
{
    socket_shutdown($socket, 2);
    socket_close($socket);
    unset($socket);
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    connect();
}

然后我仍然得到同样的错误。

任何帮助将不胜感激。

已解决:原来这确实是一个全局变量未设置问题。带有 socket_write 的那段代码在一个单独的函数中。我在函数的开头添加了“global $socket”,但事实证明我还需要在取消设置后添加它。另外,要取消设置全局,我应该使用 unset($GLOBALS['socket']); 感谢 EJP 让我重新审视这一点。

4

1 回答 1

2

您无法重新连接套接字。你必须创建一个新的。

于 2013-04-26T23:42:08.787 回答