socket = new UDPSocket($server, $port, (bool) $listen, $serverip); if($this->socket->connected === false){ console("[SEVERE] Couldn't bind to $serverip:".$port, true, true, 0); exit(1); } $this->bandwidth = array(0, 0, microtime(true)); $this->client = (bool) $client; $this->start = microtime(true); $this->packets = array(); } public function close(){ return $this->socket->close(false); } public function readPacket(){ $pk = $this->popPacket(); if($this->socket->connected === false){ return $pk; } $buf = ""; $source = false; $port = 1; $len = $this->socket->read($buf, $source, $port); if($len === false or $len === 0){ return $pk; } $this->bandwidth[0] += $len; $this->parsePacket($buf, $source, $port); return ($pk !== false ? $pk : $this->popPacket()); } private function parsePacket($buffer, $source, $port){ $pid = ord($buffer{0}); if(RakNetInfo::isValid($pid)){ $parser = new RakNetParser($buffer); if($parser->packet !== false){ $parser->packet->ip = $source; $parser->packet->port = $port; $this->packets[] = $parser->packet; } }else{ $packet = new Packet(); $packet->ip = $source; $packet->port = $port; $packet->buffer = $buffer; if(ServerAPI::request()->api->dhandle("server.unknownpacket.$pid", $packet) !== true){ console("[ERROR] Unknown Packet ID 0x".Utils::strToHex(chr($pid)), true, true, 2); } return false; } return true; } public function popPacket(){ if(count($this->packets) > 0){ $p = each($this->packets); unset($this->packets[$p[0]]); return $p[1]; } return false; } public function writePacket(Packet $packet){ if($packet instanceof RakNetPacket){ $codec = new RakNetCodec($packet); } $write = $this->socket->write($packet->buffer, $packet->ip, $packet->port); $this->bandwidth[1] += $write; return $write; } } ?>