summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/tanya/net/ip.d82
1 files changed, 82 insertions, 0 deletions
diff --git a/source/tanya/net/ip.d b/source/tanya/net/ip.d
index 0f61260..8299f73 100644
--- a/source/tanya/net/ip.d
+++ b/source/tanya/net/ip.d
@@ -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();
+ }
+ }
+}