From 4a1a07b2fe9dcd3327312aa092fe60d315f9ea37 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Wed, 1 Oct 2014 02:02:51 +0200 Subject: sending remove client command when closed --- src/sydra.c | 3 +++ src/udp.c | 43 ++++++++++++++++++++++++++++++++++--------- src/udp.h | 1 + 3 files changed, 38 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/sydra.c b/src/sydra.c index a4d2d05..9eed676 100644 --- a/src/sydra.c +++ b/src/sydra.c @@ -204,6 +204,9 @@ int main_loop(options_t* opt) g_unix_signal_add(SIGTERM, sig_handler_terminate, loop); g_main_loop_run(loop); + if(opt->mode_ == RECEIVER) + detach_udpsources(&sources); + if (deep_notify_id != 0) g_signal_handler_disconnect(pipeline, deep_notify_id); diff --git a/src/udp.c b/src/udp.c index 9de5d7a..d9133aa 100644 --- a/src/udp.c +++ b/src/udp.c @@ -230,13 +230,8 @@ gboolean attach_udpsinks(struct udp_sinks *sinks) return TRUE; } -static gboolean send_keepalive(GstElement* source, const char* name, GInetAddress* remote, guint port) +static gboolean send_udpsrc_buf(GstElement* source, const char* name, GInetAddress* remote, guint port, u_int8_t* buf, size_t buflen) { - if(!remote) { - log_printf(WARNING, "keepalives are enabled but no remote address is set... disabling keep alives"); - return FALSE; - } - GSocket *sock; g_object_get(G_OBJECT(source), "used-socket", &sock, NULL); int fd = g_socket_get_fd(sock); @@ -264,13 +259,34 @@ static gboolean send_keepalive(GstElement* source, const char* name, GInetAddres default: log_printf(ERROR, "remote address has unsupported protocol family - disabling keep alives"); return FALSE; } - log_printf(DEBUG, "sending keep-alive out on to %s %d - %s (fd=%d)", g_inet_address_to_string(remote), port, name, fd); - gchar buf[] = UDP_PROTO_MAGIC UDP_PROTO_CMD_ADD_CLIENT; - sendto(fd, buf, UDP_PROTO_MAGIC_LEN+UDP_PROTO_CMD_ADD_CLIENT_LEN, 0, (struct sockaddr *)&(addr), addrlen); + log_printf(DEBUG, "sending cmd out on to %s %d - %s (fd=%d)", g_inet_address_to_string(remote), port, name, fd); + sendto(fd, buf, buflen, 0, (struct sockaddr *)&(addr), addrlen); return TRUE; } +static void send_remove(GstElement* source, const char* name, GInetAddress* remote, guint port) +{ + if(!remote) + return; + + u_int8_t buf[] = UDP_PROTO_MAGIC UDP_PROTO_CMD_RM_CLIENT; + size_t buflen = UDP_PROTO_MAGIC_LEN+UDP_PROTO_CMD_RM_CLIENT_LEN; + send_udpsrc_buf(source, name, remote, port, buf, buflen); +} + +static gboolean send_keepalive(GstElement* source, const char* name, GInetAddress* remote, guint port) +{ + if(!remote) { + log_printf(WARNING, "keepalives are enabled but no remote address is set... disabling keep alives"); + return FALSE; + } + + u_int8_t buf[] = UDP_PROTO_MAGIC UDP_PROTO_CMD_ADD_CLIENT; + size_t buflen = UDP_PROTO_MAGIC_LEN+UDP_PROTO_CMD_ADD_CLIENT_LEN; + return send_udpsrc_buf(source, name, remote, port, buf, buflen); +} + static gboolean send_keepalives(gpointer user_data) { struct udp_sources* sources = (struct udp_sources*)user_data; @@ -328,3 +344,12 @@ gboolean attach_udpsources(struct udp_sources *sources, gchar* rtphost) return TRUE; } + +void detach_udpsources(struct udp_sources *sources) +{ + guint port = sources->port_base_; + send_remove(sources->rtp_video_, "RTP(video)", sources->remote_addr_, port++); + send_remove(sources->rtcp_video_, "RTCP(video)", sources->remote_addr_, port++); + send_remove(sources->rtp_audio_, "RTP(audio)", sources->remote_addr_, port++); + send_remove(sources->rtcp_audio_, "RTCP(audio)", sources->remote_addr_, port++); +} diff --git a/src/udp.h b/src/udp.h index c9606c4..fca7ca3 100644 --- a/src/udp.h +++ b/src/udp.h @@ -40,5 +40,6 @@ gboolean attach_udpsinks(struct udp_sinks *sinks); gboolean attach_udpsources(struct udp_sources *sources, gchar* rtphost); +void detach_udpsources(struct udp_sources *sources); #endif -- cgit v1.2.3