net/SocketAddress: add GetSteadyPart()

This commit is contained in:
Max Kellermann 2018-08-21 10:57:46 +02:00
parent ba3b422ce5
commit ede7434901
2 changed files with 48 additions and 0 deletions

View File

@ -107,4 +107,41 @@ SocketAddress::GetPort() const noexcept
}
}
static constexpr ConstBuffer<void>
GetSteadyPart(const struct sockaddr_in &address) noexcept
{
return {&address.sin_addr, sizeof(address.sin_addr)};
}
static constexpr ConstBuffer<void>
GetSteadyPart(const struct sockaddr_in6 &address) noexcept
{
return {&address.sin6_addr, sizeof(address.sin6_addr)};
}
#endif
ConstBuffer<void>
SocketAddress::GetSteadyPart() const noexcept
{
if (IsNull())
return nullptr;
switch (GetFamily()) {
#ifdef HAVE_UN
case AF_LOCAL:
return GetLocalRaw().ToVoid();
#endif
#ifdef HAVE_TCP
case AF_INET:
return ::GetSteadyPart(*(const struct sockaddr_in *)(const void *)GetAddress());
case AF_INET6:
return ::GetSteadyPart(*(const struct sockaddr_in6 *)(const void *)GetAddress());
#endif
default:
return nullptr;
}
}

View File

@ -41,6 +41,7 @@
#include <sys/socket.h>
#endif
template<typename T> struct ConstBuffer;
struct StringView;
/**
@ -127,6 +128,16 @@ public:
unsigned GetPort() const noexcept;
#endif
/**
* Return a buffer pointing to the "steady" portion of the
* address, i.e. without volatile parts like the port number.
* This buffer is useful for hashing the address, but not so
* much for anything else. Returns nullptr if the address is
* not supported.
*/
gcc_pure
ConstBuffer<void> GetSteadyPart() const noexcept;
gcc_pure
bool operator==(const SocketAddress other) const noexcept;