0

SocketServer.class.php を使用して、GPS 追跡ユニットからサーバーへの接続を行っています。何が起こっているかの簡単な例。

ユニットがサーバーに接続し、接続が確立され、データ/バッファがサーバーに送信され、ユニットが切断され、ソケットを閉じるように指示されます。しかし、ユニットの一部のバージョンでは、ユニットは接続を閉じず、ソケットは開いたままになり、他のユニットが接続して情報を送信するプロセスを保留します。カーテンタイムの後にユニットからの接続/ソケットを閉じたり、しばらくしてからソケットタイムアウトを行うために、どのように、またはどのようなphpコードを使用できますか?

これは私にとって2つの問題を引き起こすからです。私はどちらか一方を持つことができます。1) 情報の最初のバッチが送受信された後、接続を閉じます。しかし、ユニットが時々送信する情報は3つのバッファ送信にあるため(正しく言ったことを願っています)、接続/ソケットを開いたままにして、ユニットが「完了しました。ソケットを閉じます」と言うのを待ちます。それはうまくいきます。しかし、ユニットが「完了しました」と言わず、ソケットは開いたままですが、すべての情報が受信されると、問題が発生します。ここに私が持っているコードがあります:

<?php
class SocketServer
{
    protected $config;
    protected $master_socket;
    public $max_clients = 99999;
    public $max_read = 32768;
    public $clients;
    public $complete_string = "";

    public function __construct($bind_ip,$port)
    {
        set_time_limit(0);
        $this->hooks = array();

        $this->config["ip"] = $bind_ip;
        $this->config["port"] = $port;

        $this->master_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        socket_bind($this->master_socket,$this->config["ip"],$this->config["port"]) or die("Port ".$this->config["port"]." is still open\r\n");
        socket_getsockname($this->master_socket,$bind_ip,$port);
        socket_listen($this->master_socket);
        SocketServer::debug("Listenting for connections on {$bind_ip}:{$port}");
    }

    public function loop_once()
    {
        // Setup Clients Listen Socket For Reading
        $read[0] = $this->master_socket;
        for($i = 1; $i <= $this->max_clients; $i++)
        {
            if(isset($this->clients[$i]))
            {
                $read[$i + 1] = $this->clients[$i]->socket;
            }
        }


        // Set up a blocking call to socket_select
        if(socket_select($read,$write = NULL, $except = NULL, $tv_sec = 8) < 1)
        {
            return true;
        }

        // Handle new Connections
        if(in_array($this->master_socket, $read))
        {
            for($i = 1; $i <= $this->max_clients; $i++)
            {
                if(empty($this->clients[$i]))
                {
                    $temp_sock = $this->master_socket;
                    $this->clients[$i] = new SocketServerClient($this->master_socket,$i);
                    SocketServer::debug("Client {$i} from {$this->clients[$i]->ip} connected @ ".date("d-M-Y H:i:s"), time());
                    break;
                }
                elseif($i == ($this->max_clients-1))
                {
                    SocketServer::debug("Too many clients... :( ");
                }
            }

        }

        // Handle Input
            for($i = 0; $i < $this->max_clients; $i++) // for each client
            {
                if(isset($this->clients[$i]))
                {
                    if(in_array($this->clients[$i]->socket, $read))
                    {
                        $input = socket_read($this->clients[$i]->socket, $this->max_read);
                        if($input == null)
                        {
                            $this->disconnect($i);
                        }
                        else
                        {

                            $this->clients[$i]->complete_string .= $input;
                        }
                    }
                }
            }
            return true;
    }

    public function disconnect($client_index,$message = "")
    {
        $i = $client_index;
        SocketServer::debug("Lets interpret the string\r\n");
        SocketServer::interpret();
        SocketServer::debug("Client {$i} from {$this->clients[$i]->ip} disconnected");
        SocketServer::debug("------------------------------------------------------------------------------------------------------------------------------------------");
        $this->clients[$i]->destroy();
        unset($this->clients[$i]);  
    }       

    public function interpret()
    {
        //Lets get the info to start
        for($i = 0; $i < $this->max_clients; $i++) // for each client
        {
            if(isset($this->clients[$i]))
            {
                $complete_string = $this->clients[$i]->complete_string;
                SocketServer::debug($complete_string);
                //Do something with the string here

                //Clear the Complete String Variable for next use
                $this->clients[$i]->complete_string = "";
            }
        }
    }

    public function infinite_loop()
    {
        $test = true;
        do
        {
            $test = $this->loop_once();
        }
        while($test);
    }

    public static function debug($text)
    {
        echo("{$text}\r\n");

    }

    function &__get($name)
    {
        return $this->{$name};
    }
}

class SocketServerClient
{
    protected $socket;
    protected $ip;
    protected $hostname;
    protected $server_clients_index;

    public function __construct(&$socket,$i)
    {
        $this->server_clients_index = $i;
        $this->socket = socket_accept($socket) or die("Failed to Accept");
        socket_getpeername($this->socket,$ip);
        $this->ip = $ip;
    }

    public function lookup_hostname()
    {
        $this->hostname = gethostbyaddr($this->ip);
        return $this->hostname;
    }

    public function destroy()
    {
        socket_close($this->socket);
    }

    function &__get($name)
    {
        return $this->{$name};
    }

    function __isset($name)
    {
        return isset($this->{$name});
    }
}
4

0 に答える 0