2022-09-13 13:13:11 +00:00
|
|
|
<?php
|
|
|
|
// IPEndPoint.php
|
|
|
|
// Created: 2021-04-30
|
2023-01-01 19:00:00 +00:00
|
|
|
// Updated: 2023-01-01
|
2022-09-13 13:13:11 +00:00
|
|
|
|
|
|
|
namespace Index\Net;
|
|
|
|
|
|
|
|
use InvalidArgumentException;
|
|
|
|
use Index\XString;
|
|
|
|
|
|
|
|
class IPEndPoint extends EndPoint {
|
|
|
|
private IPAddress $address;
|
|
|
|
private int $port;
|
|
|
|
|
|
|
|
public function __construct(IPAddress $address, int $port) {
|
|
|
|
if($port < 0 || $port > 0xFFFF)
|
|
|
|
throw new InvalidArgumentException('$port is not a valid port number.');
|
|
|
|
$this->address = $address;
|
|
|
|
$this->port = $port;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getAddress(): IPAddress {
|
|
|
|
return $this->address;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function hasPort(): bool {
|
|
|
|
return $this->port > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getPort(): int {
|
|
|
|
return $this->port;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function __serialize(): array {
|
|
|
|
return [$this->address, $this->port];
|
|
|
|
}
|
|
|
|
public function __unserialize(array $serialized): void {
|
|
|
|
$this->address = $serialized[0];
|
|
|
|
$this->port = $serialized[1];
|
|
|
|
}
|
|
|
|
|
|
|
|
public function equals(mixed $other): bool {
|
|
|
|
return $other instanceof IPEndPoint
|
|
|
|
&& $this->port === $other->port
|
|
|
|
&& $this->address->equals($other->address);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function parse(string $string): EndPoint {
|
|
|
|
if(str_starts_with($string, '[')) { // IPv6
|
|
|
|
$closing = strpos($string, ']');
|
|
|
|
if($closing === false)
|
|
|
|
throw new InvalidArgumentException('$string is not a valid IP end point.');
|
|
|
|
$ip = substr($string, 1, $closing - 1);
|
2023-01-01 19:00:00 +00:00
|
|
|
$port = (int)substr($string, $closing + 2);
|
2022-09-13 13:13:11 +00:00
|
|
|
} else { // IPv4
|
|
|
|
$parts = explode(':', $string, 2);
|
|
|
|
if(count($parts) < 2)
|
|
|
|
throw new InvalidArgumentException('$string is not a valid IP end point.');
|
|
|
|
$ip = $parts[0];
|
2023-01-01 19:00:00 +00:00
|
|
|
$port = (int)$parts[1];
|
2022-09-13 13:13:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return new IPEndPoint(IPAddress::parse($ip), $port);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function __toString(): string {
|
|
|
|
if($this->port < 1)
|
|
|
|
return $this->address->getAddress();
|
|
|
|
return $this->address->getAddress() . ':' . $this->port;
|
|
|
|
}
|
|
|
|
}
|