diff --git a/src/net/SocketAddress.hxx b/src/net/SocketAddress.hxx
index ccbb571fa..b143c5358 100644
--- a/src/net/SocketAddress.hxx
+++ b/src/net/SocketAddress.hxx
@@ -33,6 +33,7 @@
 #include "Features.hxx"
 
 #include <cstddef>
+#include <span>
 
 #ifdef _WIN32
 #include <winsock2.h> // IWYU pragma: export
@@ -69,6 +70,10 @@ public:
 				size_type _size) noexcept
 		:address(_address), size(_size) {}
 
+	explicit SocketAddress(std::span<const std::byte> src) noexcept
+		:address((const struct sockaddr *)(const void *)src.data()),
+		 size(src.size()) {}
+
 	static constexpr SocketAddress Null() noexcept {
 		return nullptr;
 	}
@@ -154,6 +159,14 @@ public:
 	unsigned GetPort() const noexcept;
 #endif
 
+	operator std::span<const std::byte>() const noexcept {
+		const void *q = reinterpret_cast<const void *>(address);
+		return {
+			(const std::byte *)q,
+			(std::size_t)size,
+		};
+	}
+
 	/**
 	 * Return a buffer pointing to the "steady" portion of the
 	 * address, i.e. without volatile parts like the port number.