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); }
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)); } } } }
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; }