static bool set_address(sockaddr_storage &t, const address &addr) { if (addr.family() == AF_INET) memcpy(&t, addr.v4(), addr.addrlen()); else if (addr.family() == AF_INET6) memcpy(&t, addr.v6(), addr.addrlen()); else return false; return true; }
bool address::is_equal(const address &a) const { if (stor.ss_family != a.stor.ss_family) return false; if (stor.ss_family == AF_INET6) return memcmp(&v6()->sin6_addr, &a.v6()->sin6_addr, sizeof(in6_addr)) == 0; else if (stor.ss_family == AF_INET) return v4()->sin_addr.s_addr == a.v4()->sin_addr.s_addr; return false; }
bool address::copy_address(const address &source) { if (family() != source.family()) return false; if (stor.ss_family == AF_INET6) v6()->sin6_addr = source.v6()->sin6_addr; else v4()->sin_addr = source.v4()->sin_addr; return true; }
int _McastListenOldAPI(int sock, const address &grpaddr) { if (grpaddr.family() == AF_INET6) { ipv6_mreq mreq; mreq.ipv6mr_interface = mcastInterface; mreq.ipv6mr_multiaddr = grpaddr.v6()->sin6_addr; return setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq)); } else { ip_mreq mreq; memset(&mreq, 0, sizeof(mreq)); // Specifying the interface doesn't work, there's ip_mreqn in linux.. // but what about other OSs? -hugo mreq.imr_multiaddr = grpaddr.v4()->sin_addr; return setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); } }