void init_gsoap()

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");
    }
}