diff --git a/src/net/socketaddress.hpp b/src/net/socketaddress.hpp
index 289ab0ad71f8296a8ee8e9a26e2a9b53eb2eb6e1..0c0034d643b6e3532e6281d74ac1325bfe5317bf 100644
--- a/src/net/socketaddress.hpp
+++ b/src/net/socketaddress.hpp
@@ -149,6 +149,31 @@ COMPILER_RESTORE("-Weffc++");
         return len;
     }
 
+    inline bool operator==(const socketaddr& _other) const {
+        if (!(this->family() == _other.family())) {
+            return false;
+        }
+
+        switch (_other.family()) {
+        case AF_INET:
+            return (((sockaddr_in*) &this->addr)->sin_addr.s_addr == ((sockaddr_in*) &_other.addr)->sin_addr.s_addr)
+                    && (((sockaddr_in*) &this->addr)->sin_port == ((sockaddr_in*) &_other.addr)->sin_port);
+        case AF_INET6:
+            return 0 == memcmp(&((sockaddr_in6*) &this->addr)->sin6_addr, &((sockaddr_in6*) &_other.addr)->sin6_addr, sizeof(in6_addr))
+                    && (((sockaddr_in6*) &this->addr)->sin6_port == ((sockaddr_in6*) &_other.addr)->sin6_port);
+        default:
+            return
+                this->len == _other.len &&
+                0 == memcmp(&this->addr, &_other.addr, this->len);
+        }
+
+        return true;
+    }
+
+    inline bool operator!=(const socketaddr& _other) const {
+        return !(*this == _other);
+    }
+
     std::string str() const {
         std::ostringstream oss;
         oss << "SocketAddress: ";