From c272681c11c842538cfc04585969c0f5fdf80b8d Mon Sep 17 00:00:00 2001 From: Angel Carpintero Date: Thu, 7 Aug 2003 17:56:09 +0000 Subject: Add a new parameter _socketop_ to allow use REUSEADDR and KEEPALIVE socket options Original commit message from CVS: Add a new parameter _socketop_ to allow use REUSEADDR and KEEPALIVE socket options --- gst/tcp/gsttcpsrc.c | 32 ++++++++++++++++++++++++++++++-- gst/tcp/gsttcpsrc.h | 1 + 2 files changed, 31 insertions(+), 2 deletions(-) (limited to 'gst') diff --git a/gst/tcp/gsttcpsrc.c b/gst/tcp/gsttcpsrc.c index eb93b2521..987cd650a 100644 --- a/gst/tcp/gsttcpsrc.c +++ b/gst/tcp/gsttcpsrc.c @@ -47,7 +47,8 @@ enum { enum { ARG_0, ARG_PORT, - ARG_CONTROL + ARG_CONTROL, + ARG_SOCKET_OPTIONS, /* FILL ME */ }; @@ -124,6 +125,10 @@ gst_tcpsrc_class_init (GstTCPSrc *klass) g_param_spec_enum ("control", "control", "The type of control", GST_TYPE_TCPSRC_CONTROL, CONTROL_TCP, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SOCKET_OPTIONS, + g_param_spec_boolean ("socketop", "socketop", "Enable or disable socket options REUSEADDR and KEEPALIVE", + FALSE, G_PARAM_READWRITE)); + gobject_class->set_property = gst_tcpsrc_set_property; gobject_class->get_property = gst_tcpsrc_get_property; @@ -155,6 +160,7 @@ gst_tcpsrc_init (GstTCPSrc *tcpsrc) tcpsrc->sock = -1; tcpsrc->control_sock = -1; tcpsrc->client_sock = -1; + tcpsrc->socket_options = FALSE; GST_FLAG_UNSET (tcpsrc, GST_TCPSRC_OPEN); GST_FLAG_SET (tcpsrc, GST_TCPSRC_1ST_BUF); @@ -323,6 +329,9 @@ gst_tcpsrc_set_property (GObject *object, guint prop_id, const GValue *value, GP case ARG_CONTROL: tcpsrc->control = g_value_get_enum (value); break; + case ARG_SOCKET_OPTIONS: + tcpsrc->socket_options = g_value_get_boolean(value); + break; default: break; } @@ -344,6 +353,9 @@ gst_tcpsrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSp case ARG_CONTROL: g_value_set_enum (value, tcpsrc->control); break; + case ARG_SOCKET_OPTIONS: + g_value_set_boolean(value,tcpsrc->socket_options); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -354,6 +366,7 @@ gst_tcpsrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSp static gboolean gst_tcpsrc_init_receive (GstTCPSrc *src) { + guint val=0; bzero (&src->myaddr, sizeof (src->myaddr)); src->myaddr.sin_family = AF_INET; /* host byte order */ src->myaddr.sin_port = htons (src->port); /* short, network byte order */ @@ -363,7 +376,22 @@ gst_tcpsrc_init_receive (GstTCPSrc *src) perror("stream_socket"); return FALSE; } - + + if (src->socket_options) + { + g_print("Socket Options enabled\n"); + /* Sock Options */ + val = 1; + /* allow local address reuse */ + if( setsockopt( src->sock,SOL_SOCKET,SO_REUSEADDR, &val, sizeof( int )) <0) + perror( "setsockopt()" ); + val = 1; + /* periodically test if connection still alive */ + if( setsockopt( src->sock,SOL_SOCKET,SO_KEEPALIVE, &val, sizeof( int )) <0) + perror( "setsockopt()" ); + /* Sock Options */ + } + if (bind (src->sock, (struct sockaddr *) &src->myaddr, sizeof (src->myaddr)) == -1) { perror("stream_sock bind"); return FALSE; diff --git a/gst/tcp/gsttcpsrc.h b/gst/tcp/gsttcpsrc.h index c7166be18..9e2063f98 100644 --- a/gst/tcp/gsttcpsrc.h +++ b/gst/tcp/gsttcpsrc.h @@ -71,6 +71,7 @@ struct _GstTCPSrc { int sock; int client_sock; int control_sock; + gboolean socket_options; Gst_TCP_Control control; struct sockaddr_in myaddr; -- cgit v1.2.3