in sample_app/onvif_camera_mock/artifacts/wsdd/src/wsdd.c [304:350]
void init_gsoap()
{
// init gsoap server for WS-Discovery service
soap_srv = soap_new1(SOAP_IO_UDP);
if(!soap_srv)
daemon_error_exit("Can't get mem for soap: %m\n");
in_addr_t addr = inet_addr(WSDD_MULTICAST_IP);
soap_srv->ipv4_multicast_if = (char *)&addr; // see setsockopt IPPROTO_IP IP_MULTICAST_IF
soap_srv->ipv6_multicast_if = addr; // multicast sin6_scope_id
soap_srv->ipv4_multicast_ttl = 1; // see setsockopt IPPROTO_IP, IP_MULTICAST_TTL
soap_srv->connect_flags = SO_BROADCAST; // for UDP multicast
soap_srv->bind_flags = SO_REUSEADDR;
if(!soap_valid_socket(soap_bind(soap_srv, NULL, WSDD_SERVER_PORT, 100)))
{
soap_print_fault(soap_srv, stderr);
exit(EXIT_FAILURE);
}
soap_srv->user = &wsdd_param; // set our data for handlers
// Join the multicast group 239.255.255.250 on the local interface
// Note that this IP_ADD_MEMBERSHIP option must be
// called for each local interface over which the multicast
// datagrams are to be received.
struct ip_mreqn mcast;
mcast.imr_multiaddr.s_addr = inet_addr(WSDD_MULTICAST_IP);
if( get_addr_of_if(wsdd_param.if_name, AF_INET, &mcast.imr_address) != 0 )
{
daemon_error_exit("Cant get addr for interface error: %m\n");
}
setsockopt(soap_srv->master, IPPROTO_IP, IP_MULTICAST_IF, &mcast.imr_address.s_addr, sizeof(struct in_addr));
if(setsockopt(soap_srv->master, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mcast, sizeof(mcast)) != 0 )
{
daemon_error_exit("Cant adding multicast group error: %m\n");
}
}