int main(AVAHI_GCC_UNUSED int argc, AVAHI_GCC_UNUSED char *argv[]) { sw_ipv4_address a; char t[256]; uint8_t a1, a2, a3, a4; ASSERT_SW_OKAY(sw_ipv4_address_init_from_name(&a, "heise.de")); ASSERT_NOT_NULL(sw_ipv4_address_name(a, t, sizeof(t))); printf("%s\n", t); ASSERT_SW_OKAY(sw_ipv4_address_init_from_this_host(&a)); ASSERT_NOT_NULL(sw_ipv4_address_name(a, t, sizeof(t))); printf("%s\n", t); ASSERT_SW_OKAY(sw_ipv4_address_decompose(a, &a1, &a2, &a3, &a4)); printf("%i.%i.%i.%i\n", a1, a2, a3, a4); return 0; }
sw_result sw_socket_join_multicast_group( sw_socket self, sw_ipv4_address local_address, sw_ipv4_address multicast_address, sw_uint32 ttl) { struct in_addr addr; struct ip_mreq mreq; #if defined(__sun) || defined(__VXWORKS__) || defined(__NetBSD__) || defined(__OpenBSD__) sw_uint8 real_ttl = (sw_uint8) ttl; #else sw_uint32 real_ttl = ttl; #endif int res; sw_result err; /* initialize the group membership */ sw_memset(&addr, 0, sizeof(addr)); addr.s_addr = sw_ipv4_address_saddr(local_address); sw_memset(&mreq, 0, sizeof(mreq)); #if defined(__VXWORKS__) /* VxWorks doesn't like it if we try and use INADDR_ANY for use in setting up multicast sockets. So we please it. */ if (sw_ipv4_address_is_any(local_address)) { sw_ipv4_address current_address; err = sw_ipv4_address_init_from_this_host(¤t_address); sw_check_okay(err, exit); mreq.imr_interface.s_addr = sw_ipv4_address_saddr(current_address); } else { mreq.imr_interface = addr; } #else mreq.imr_interface = addr; #endif mreq.imr_multiaddr.s_addr = sw_ipv4_address_saddr(multicast_address); res = setsockopt(self->m_desc, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*) &mreq, sizeof(mreq)); err = sw_translate_error(res == 0, sw_socket_errno()); sw_check_okay_log(err, exit); res = setsockopt(self->m_desc, IPPROTO_IP, IP_MULTICAST_IF, (char*) &addr, sizeof(addr)); err = sw_translate_error(res == 0, sw_socket_errno()); sw_check_okay_log(err, exit); res = setsockopt(self->m_desc, IPPROTO_IP, IP_TTL, (char*) &ttl, sizeof(ttl)); err = sw_translate_error(res == 0, sw_socket_errno()); sw_check_okay_log(err, exit); res = setsockopt(self->m_desc, IPPROTO_IP, IP_MULTICAST_TTL, (char*) &real_ttl, sizeof(real_ttl)); err = sw_translate_error(res == 0, sw_socket_errno()); sw_check_okay_log(err, exit); exit: return err; }