Add Endpoint

This commit is contained in:
Eugen Wissner 2021-05-28 09:43:40 +02:00
parent d9fda61fe1
commit be8fcb3e1c
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
1 changed files with 82 additions and 0 deletions

View File

@ -14,6 +14,7 @@
*/
module tanya.net.ip;
import core.sys.posix.sys.socket;
import std.algorithm.comparison;
import std.ascii;
import std.typecons;
@ -1324,3 +1325,84 @@ struct Address
assert(address == Address4.loopback);
}
}
/**
* Service endpoint specified by a version independent IP address and port.
*/
struct Endpoint
{
private sa_family_t family = AF_UNSPEC;
private ubyte[ushort.sizeof] service;
private Address4 address4; // Unused sin6_flowinfo if IPv6
private Address6 address6; // Unused if IPv4
static assert(Address4.sizeof == 4);
/// Allows the system to select a free port.
enum ushort anyPort = 0;
/**
* Constructs an endpoint.
*
* Params:
* address = IP address that should be associated with the endpoint.
* port = Port number in network byte order.
*/
this(Address address, const ushort port = anyPort)
{
this.address = address;
this.port = port;
}
/**
* Returns: Port number in network byte order.
*/
@property ushort port() const @nogc nothrow pure @safe
{
return this.service[].toHostOrder!ushort();
}
/**
* Params:
* port = Port number in network byte order.
*/
@property void port(const ushort port) @nogc nothrow pure @safe
{
NetworkOrder!(ushort.sizeof)(port).copy(this.service[]);
}
/**
* Returns: IP address associated with the endpoint.
*/
@property Address address() @nogc nothrow pure @safe
{
if (this.family == AF_INET)
{
return Address(this.address4);
}
else if (this.family == AF_INET6)
{
return Address(this.address6);
}
return Address.init;
}
/**
* Params:
* address = IP address associated with the endpoint.
*/
@property void address(Address address) @nogc nothrow pure @safe
{
if (address.isV4())
{
this.family = AF_INET;
this.address4 = address.toV4();
}
else if (address.isV6())
{
this.family = AF_INET6;
this.address4 = Address4(0);
this.address6 = address.toV6();
}
}
}