int discovery_service_start(discovery_service *svc, discovery_strategy *strategy) { JNXCHECK(svc); // *** TODO Set up brodcast or multicast *** // It should just be a simple matter of passing a flag to the service // or changing the function signature and calling either // set_up_sockets_for_broadcast or set_up_sockets_for_multicast. // set_up_sockets_for_broadcast(svc); svc->sock_send = jnx_socket_udp_create(svc->family); svc->udp_listener = jnx_socket_udp_listener_broadcast_create( port_to_string(svc), svc->family); svc->isrunning = 1; if (0 != listen_for_discovery_packets(svc)) { JNXLOG(0, "[DISCOVERY] Couldn't start the discovery listener.\n"); return ERR_DISCOVERY_START; } initiate_discovery(svc); if (strategy == NULL) { svc->peers->is_active_peer = is_active_peer_ask_once; send_discovery_request(svc); } else { svc->peers->is_active_peer = is_active_peer_periodic_update; strategy(svc); } return 0; }
static void test_udp_broadcast(){ jnx_udp_listener *listener = jnx_socket_udp_listener_broadcast_create(UDPTESTPORT,AF_INET,NULL); JNXLOG(LDEBUG,"Firing broadcast packet"); fire_threaded_udp_packet_broadcast(UDPTESTPORT); int x = 0; while(x < 20) { JNXLOG(LDEBUG,"Ticking jnx_socket_udp_listener_tick"); jnx_socket_udp_listener_tick(listener,test_udp_listener_callback,NULL); if(test_udp_listener_complete)break; sleep(.5); ++x; } jnx_socket_udp_listener_destroy(&listener); JNXCHECK(test_udp_listener_complete); JNXCHECK(listener == NULL); }