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 *worker_broadcast(void *args) { char *port = (char*)args; jnx_socket *t = jnx_socket_udp_create(AF_INET); JNXLOG(LDEBUG,"worker_broadcast firing..."); jnx_socket_udp_broadcast_send(t,"255.255.255.255",port,(jnx_uint8*)"ping",5); return NULL; }
static void *worker_multicast(void *args) { char *port = (char*)args; jnx_socket *t = jnx_socket_udp_create(AF_INET); jnx_socket_udp_multicast_send(t,BGROUP,port,(jnx_uint8*)"ping",5); return NULL; }
static void *worker_ipv6(void *args) { char *port = (char*)args; jnx_socket *t = jnx_socket_udp_create(AF_INET6); jnx_socket_udp_send(t,"::1",port,(jnx_uint8*)"ping",5); return NULL; }