81 {
82 if (x.ss_family != y.ss_family) {
83 return x.ss_family < y.ss_family;
84 }
85
86 if (x.ss_family == AF_INET) {
87 const auto &sin_x =
88 reinterpret_cast<const sockaddr_in &>(x);
89 const auto &sin_y =
90 reinterpret_cast<const sockaddr_in &>(y);
91
92 if (sin_x.sin_addr.s_addr != sin_y.sin_addr.s_addr) {
93 return sin_x.sin_addr.s_addr < sin_y.sin_addr.s_addr;
94 }
95 return sin_x.sin_port < sin_y.sin_port;
96 } else if (x.ss_family == AF_INET6) {
97 const auto &sin_x =
98 reinterpret_cast<const sockaddr_in6 &>(x);
99 const auto &sin_y =
100 reinterpret_cast<const sockaddr_in6 &>(y);
101
102 for (int i = 0; i < 16; ++i) {
103 if (sin_x.sin6_addr.s6_addr[i] != sin_y.sin6_addr.s6_addr[i]) {
104 return sin_x.sin6_addr.s6_addr[i] < sin_y.sin6_addr.s6_addr[i];
105 }
106 }
107
108 return sin_x.sin6_port < sin_y.sin6_port;
109 }
110 abort();
111 }