Esempio n. 1
0
     continue;
 }
 if (in_array($sock, $read)) {
     $newsock = socket_accept($sock);
     connect($newsock);
     $key = array_search($sock, $read);
     unset($read[$key]);
 }
 foreach ($read as $socket) {
     $bytes = @socket_recv($socket, $buffer, 2048, 0);
     if ($bytes == 0) {
         disconnect($socket);
     } else {
         $user = getuserbysocket($socket);
         if (!$user->handshake) {
             dohandshake($user, $buffer);
             console("User " . $user->id . " Connected!");
             send($user->socket, "You are connected. ID = " . $user->id . "<br/>");
             #global_msg("[GLOBAL MESSAGE] User ".$user->id." logged in!<br/>");
         } else {
             #console("\nprocess -> id: " . $user->id);
             #process($socket,$buffer);
             $val = json_decode(unmask($buffer), true);
             #console(var_dump(mysql_real_escape_string($val['message'])));
             //disconnect user!!!!!!!!!!!!!!!!!!!!!!! anti double login
             if (isset($val['uname'])) {
                 foreach ($users as $u) {
                     if ($val['uname'] == $u->name) {
                         if ($u->id != $user->id) {
                             disconnect($u->socket);
                         }
Esempio n. 2
0
 if ($socket == $master) {
     $client = socket_accept($master);
     if ($client < 0) {
         console("socket_accept() failed");
         continue;
     } else {
         connect($client);
     }
 } else {
     $buf = socket_read($socket, 2048);
     if (empty($buf)) {
         disconnect($socket);
     } else {
         $user = getuserbysocket($socket);
         if (!$user->handshake) {
             dohandshake($user, $buf);
         } else {
             $read = $buf;
             while (!empty($buf) && ord(substr($read, -1)) != 255) {
                 $buf = socket_read($socket, 2048);
                 $read .= $buf;
             }
             // For some reason, every now and then messages are grouped
             $msgs = explode(chr(255), $read);
             foreach ($msgs as $msg) {
                 if (strlen($msg) > 2) {
                     process($user, $msg . chr(255));
                 }
             }
         }
     }
Esempio n. 3
0
        if ($socket == $master) {
            $client = socket_accept($master);
            if ($client < 0) {
                console("socket_accept() failed");
                continue;
            } else {
                connect($client);
            }
        } else {
            $bytes = @socket_recv($socket, $stream, 2048, 0);
            if ($bytes == 0) {
                disconnect($socket);
            } else {
                $user = getuserbysocket($socket);
                if (!$user->handshake) {
                    dohandshake($user, $stream);
                } else {
                    process($user, $stream);
                }
            }
        }
    }
}
/******************** MESSAGING ********************/
function process($user, $msg)
{
    $msg = unwrap($msg);
    // remove chr(0) and chr(255)
    say("< " . $msg);
    $parts = explode("|", $msg);
    // CHAT|NICK|MESSAGE
 function wsProcessClientHandshake($clientID, &$buffer)
 {
     // fetch headers and request line
     $sep = strpos($buffer, "\r\n\r\n");
     if (!$sep) {
         return false;
     }
     $headers = explode("\r\n", substr($buffer, 0, $sep));
     $headersCount = sizeof($headers);
     // includes request line
     if ($headersCount < 1) {
         return false;
     }
     // fetch request and check it has at least 3 parts (space tokens)
     $request =& $headers[0];
     $requestParts = explode(' ', $request);
     $requestPartsSize = sizeof($requestParts);
     if ($requestPartsSize < 3) {
         return false;
     }
     // check request method is GET
     if (strtoupper($requestParts[0]) != 'GET') {
         return false;
     }
     // check request HTTP version is at least 1.1
     $httpPart =& $requestParts[$requestPartsSize - 1];
     $httpParts = explode('/', $httpPart);
     if (!isset($httpParts[1]) || (double) $httpParts[1] < 1.1) {
         return false;
     }
     // store headers into a keyed array: array[headerKey] = headerValue
     $headersKeyed = array();
     for ($i = 1; $i < $headersCount; $i++) {
         $parts = explode(':', $headers[$i]);
         if (!isset($parts[1])) {
             return false;
         }
         $headersKeyed[trim($parts[0])] = trim($parts[1]);
     }
     // check Host header was received
     if (!isset($headersKeyed['Host'])) {
         return false;
     }
     // check Sec-WebSocket-Key header was received and decoded value length is 16
     if (isset($headersKeyed['Sec-WebSocket-Key'])) {
         // RFC6455 Standard Format
         $key = $headersKeyed['Sec-WebSocket-Key'];
         if (strlen(base64_decode($key)) != 16) {
             return false;
         }
         // check Sec-WebSocket-Version header was received and value is 7
         if (!isset($headersKeyed['Sec-WebSocket-Version']) || (int) $headersKeyed['Sec-WebSocket-Version'] < 7) {
             return false;
         }
         // should really be != 7, but Firefox 7 beta users send 8
         // work out hash to use in Sec-WebSocket-Accept reply header
         $hash = base64_encode(sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));
         // build headers
         $headers = array('HTTP/1.1 101 Switching Protocols', 'Upgrade: WebSocket', 'Connection: Upgrade', 'Sec-WebSocket-Accept: ' . $hash);
         $headers = implode("\r\n", $headers) . "\r\n\r\n";
     } elseif (isset($headersKeyed['Sec-WebSocket-Key1']) && isset($headersKeyed['Sec-WebSocket-Key2'])) {
         // Deprecated Hixie-76 (Safari/iOS)
         //Does not currently support Hixie-76
         echo "--H76I: Incoming Hixie-76 connection below\r\n";
         $this->wsClients[$clientID][12] = true;
         $headers = dohandshake($buffer);
         //return false;
     } else {
         return false;
     }
     // send headers back to client
     $socket = $this->wsClients[$clientID][0];
     $left = strlen($headers);
     do {
         $sent = socket_send($socket, $headers, $left, 0);
         if ($sent === false) {
             return false;
         }
         $left -= $sent;
         if ($sent > 0) {
             $headers = substr($headers, $sent);
         }
     } while ($left > 0);
     return true;
 }