15declare(strict_types=1);
17namespace raklib\server;
33use
function get_class;
44 private \SplFixedArray $packetPool;
46 public function __construct(
50 $this->registerPackets();
60 $pk = $this->getPacketFromPool($payload);
64 $reader =
new PacketSerializer($payload);
70 $remains = substr($reader->getBuffer(), $reader->getOffset());
71 $this->server->getLogger()->debug(
"Still " . strlen($remains) .
" bytes unread in " . get_class($pk) .
" from $address");
73 return $this->handle($pk, $address);
76 private function handle(OfflineMessage $packet, InternetAddress $address) : bool{
77 if($packet instanceof UnconnectedPing){
78 $this->
server->sendPacket(UnconnectedPong::create($packet->sendPingTime, $this->server->getID(), $this->server->getName()), $address);
79 }elseif($packet instanceof OpenConnectionRequest1){
80 if(!$this->protocolAcceptor->accepts($packet->protocol)){
81 $this->
server->sendPacket(IncompatibleProtocolVersion::create($this->protocolAcceptor->getPrimaryVersion(), $this->server->getID()), $address);
82 $this->
server->getLogger()->notice(
"Refused connection from $address due to incompatible RakNet protocol version (version $packet->protocol)");
85 $this->
server->sendPacket(OpenConnectionReply1::create($this->
server->getID(),
false, $packet->mtuSize + 28), $address);
87 }elseif($packet instanceof OpenConnectionRequest2){
88 if($packet->serverAddress->getPort() === $this->server->getPort() or !$this->server->portChecking){
89 if($packet->mtuSize < Session::MIN_MTU_SIZE){
90 $this->
server->getLogger()->debug(
"Not creating session for $address due to bad MTU size $packet->mtuSize");
93 $existingSession = $this->
server->getSessionByAddress($address);
94 if($existingSession !==
null && $existingSession->isConnected()){
97 $this->
server->getLogger()->debug(
"Not creating session for $address due to session already opened");
100 $mtuSize = min($packet->mtuSize, $this->server->getMaxMtuSize());
101 $this->
server->sendPacket(OpenConnectionReply2::create($this->
server->getID(), $address, $mtuSize,
false), $address);
102 $this->
server->createSession($address, $packet->clientID, $mtuSize);
104 $this->
server->getLogger()->debug(
"Not creating session for $address due to mismatched port, expected " . $this->
server->getPort() .
", got " . $packet->serverAddress->getPort());
116 private function registerPacket(
int $id,
string $class) : void{
117 $this->packetPool[$id] = new $class;
120 public function getPacketFromPool(
string $buffer) : ?OfflineMessage{
121 $pk = $this->packetPool[ord($buffer[0])];
129 private function registerPackets() : void{
130 $this->packetPool = new \SplFixedArray(256);
132 $this->registerPacket(MessageIdentifiers::ID_UNCONNECTED_PING, UnconnectedPing::class);
133 $this->registerPacket(MessageIdentifiers::ID_UNCONNECTED_PING_OPEN_CONNECTIONS, UnconnectedPingOpenConnections::class);
134 $this->registerPacket(MessageIdentifiers::ID_OPEN_CONNECTION_REQUEST_1, OpenConnectionRequest1::class);
135 $this->registerPacket(MessageIdentifiers::ID_OPEN_CONNECTION_REQUEST_2, OpenConnectionRequest2::class);
handleRaw(string $payload, InternetAddress $address)