Example #1
0
function socket_client_check(&$socket, &$connects, &$devices)
{
    $connects_read = array();
    foreach ($connects as $connect) {
        $connects_read[] = $connect->Socket();
    }
    $connects_read[] = $socket;
    $write = null;
    $except = null;
    if (socket_select($connects_read, $write = NULL, $except = NULL, 0, 1000) > 0) {
        if (in_array($socket, $connects_read)) {
            //есть новое соединение
            if (($new_client = socket_accept($socket)) === false) {
                echo "socket_accept() failure: reason: " . socket_strerror(socket_last_error($socket)) . "\n\r";
                return 0;
                //!!!
            }
            $client = new Client($new_client);
            $ip = "";
            if (socket_getpeername($new_client, $ip)) {
                $client->SetIP($ip);
            }
            $connects[] = $client;
            //добавл¤ем его в список необходимых дл¤ обработки
            $sock = $client->Socket();
            $msg = "LOGIN TOKEN?\n\r";
            socket_write($client->Socket(), $msg, strlen($msg));
        }
        foreach ($connects as $key => $client) {
            // for each client
            if (in_array($client->Socket(), $connects_read)) {
                if (false === ($buf = socket_read($client->Socket(), 2048, PHP_NORMAL_READ))) {
                    echo "socket_read() failure: reason: " . socket_strerror(socket_last_error($client->Socket())) . "\n\r";
                    return 0;
                    //!!!
                }
                if (!($buf = trim($buf))) {
                    return 1;
                }
                $talkback = "";
                if ($client->Logined()) {
                    $cmd = strtolower(shift_word($buf));
                    if ($cmd == 'device' || $cmd == 'dev') {
                        $devname = strtolower(shift_word($buf));
                        $finded = false;
                        $all = $devname == "all";
                        foreach ($devices as $device) {
                            if ($all || $device->GetName() == $devname) {
                                if (!$device->Logined()) {
                                    continue;
                                }
                                $finded = true;
                                $to_sent = "CLIENT " . $client->GetLogin() . " {$buf}\n\r";
                                socket_write($device->Socket(), $to_sent, strlen($to_sent));
                                if (!$all) {
                                    break;
                                }
                            }
                        }
                        if (!$finded) {
                            $talkback = "ERR device was not found\n\r";
                        }
                    } elseif ($cmd == 'client' || $cmd == 'clt') {
                        $cltname = strtolower(shift_word($buf));
                        $finded = false;
                        $all = $devname == "all";
                        foreach ($connects as $cur_client) {
                            if ($all || $cur_client->GetLogin() == $cltname) {
                                if (!$cur_client->Logined() || $cur_client->GetLogin() == $client->GetLogin()) {
                                    continue;
                                }
                                $finded = true;
                                $to_sent = "CLIENT " . $client->GetLogin() . " {$buf}\n\r";
                                socket_write($cur_client->Socket(), $to_sent, strlen($to_sent));
                                if (!$all) {
                                    break;
                                }
                            }
                        }
                        if (!$finded) {
                            $talkback = "ERR client was not found\n\r";
                        }
                    } elseif ($cmd == 'devlist') {
                        $talkback = "Devices list:\n\r";
                        if ($devices) {
                            foreach ($devices as $device) {
                                if ($device->Logined()) {
                                    $talkback .= $device->GetName() . " " . $device->GetIP() . "\n\r";
                                }
                            }
                        } else {
                            $talkback .= "<no devices>\n\r";
                        }
                    } elseif ($cmd == 'userlist') {
                        $talkback = "User list:\n\r";
                        foreach ($connects as $connect) {
                            if ($connect->Logined()) {
                                $talkback .= $connect->GetLogin() . " " . $connect->GetIP() . "\n\r";
                            }
                        }
                    } elseif ($cmd == 'quit') {
                        socket_close($client->Socket());
                        unset($connects[$key]);
                        return 1;
                    } elseif ($cmd == 'shutdown' || $cmd == 'sd') {
                        //socket_close($client->Socket()); //Closed at the ent of main file
                        return 0;
                    } else {
                        $talkback = "(dev <name> <command>) devlist userlist quit shutdown\n\r";
                    }
                } else {
                    $cred = split(" ", $buf);
                    echo "login: {$cred['0']}:{$cred['1']}\n\r";
                    $exists = false;
                    foreach ($connects as $connect) {
                        if ($connect->GetLogin() == $cred[0]) {
                            $exists = true;
                            break;
                        }
                    }
                    if ($except) {
                        $talkback = "ERR ALREDY LOGINED LOGIN TOKEN?\n\r";
                    } elseif ($client->Auth($cred[0], $cred[1])) {
                        $talkback = "HELLO {$cred['0']}\n\r";
                    } else {
                        $talkback = "ERR LOGIN TOKEN?\n\r";
                    }
                }
                if ($talkback) {
                    socket_write($client->Socket(), $talkback, strlen($talkback));
                }
            }
        }
    }
    return 1;
}