/* * Starts the element. If the sockfd property was not the default, this method * will create a new socket and connect to the server. * * @param bsink - the element * @return TRUE if the send operation was successful, FALSE otherwise. */ static gboolean gst_dccp_client_sink_start (GstBaseSink * bsink) { GstDCCPClientSink *sink = GST_DCCP_CLIENT_SINK (bsink); if (sink->sock_fd == DCCP_DEFAULT_SOCK_FD) { gchar *ip = NULL; /* look up name if we need to */ if (!(ip = gst_dccp_host_to_ip (GST_ELEMENT (sink), sink->host))) { GST_ERROR_OBJECT (sink, "cannot resolve hostname"); gst_dccp_client_sink_stop (GST_BASE_SINK (sink)); return FALSE; } /* name the server socket */ memset (&sink->server_sin, 0, sizeof (sink->server_sin)); sink->server_sin.sin_family = AF_INET; /* network socket */ sink->server_sin.sin_port = htons (sink->port); /* on port */ sink->server_sin.sin_addr.s_addr = inet_addr (ip); /* on host ip */ g_free (ip); /* create socket */ if ((sink->sock_fd = gst_dccp_create_new_socket (GST_ELEMENT (sink))) < 0) { return FALSE; } if (!gst_dccp_set_ccid (GST_ELEMENT (sink), sink->sock_fd, sink->ccid)) { gst_dccp_client_sink_stop (GST_BASE_SINK (sink)); return FALSE; } if (!gst_dccp_connect_to_server (GST_ELEMENT (sink), sink->server_sin, sink->sock_fd)) { gst_dccp_client_sink_stop (GST_BASE_SINK (sink)); return FALSE; } /* the socket is connected */ g_signal_emit (sink, gst_dccp_client_sink_signals[SIGNAL_CONNECTED], 0, sink->sock_fd); } sink->pksize = gst_dccp_get_max_packet_size (GST_ELEMENT (sink), sink->sock_fd); return TRUE; }
/* * Starts the element. If the sockfd property was not the default, this method * will create a new server socket and wait for a client connection. * * @param bsrc - the element * @return TRUE if the send operation was successful, FALSE otherwise. */ static gboolean gst_dccp_server_src_start (GstBaseSrc * bsrc) { GstDCCPServerSrc *src = GST_DCCP_SERVER_SRC (bsrc); if (src->client_sock_fd == DCCP_DEFAULT_CLIENT_SOCK_FD) { /* create socket */ if ((src->sock_fd = gst_dccp_create_new_socket (GST_ELEMENT (src))) < 0) { return FALSE; } if (!gst_dccp_make_address_reusable (GST_ELEMENT (src), src->sock_fd)) { return FALSE; } /* name the server socket */ memset (&src->server_sin, 0, sizeof (src->server_sin)); src->server_sin.sin_family = AF_INET; /* network socket */ src->server_sin.sin_port = htons (src->port); /* on port */ src->server_sin.sin_addr.s_addr = htonl (INADDR_ANY); /* for hosts */ if (!gst_dccp_bind_server_socket (GST_ELEMENT (src), src->sock_fd, src->server_sin)) { return FALSE; } if (!gst_dccp_set_ccid (GST_ELEMENT (src), src->sock_fd, src->ccid)) { return FALSE; } if (!gst_dccp_listen_server_socket (GST_ELEMENT (src), src->sock_fd)) { return FALSE; } src->client_sock_fd = gst_dccp_server_wait_connections (GST_ELEMENT (src), src->sock_fd); if (src->client_sock_fd == -1) { return FALSE; } /* the socket is connected */ g_signal_emit (src, gst_dccp_server_src_signals[SIGNAL_CONNECTED], 0, src->client_sock_fd); } return TRUE; }