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 に答える