{
GstTCPClientSink *this = GST_TCP_CLIENT_SINK (bsink);
GError *err = NULL;
- GInetAddress *addr;
- GSocketAddress *saddr;
- GResolver *resolver;
+ GList *addrs;
+ GList *cur_addr;
+ GSocketAddress *saddr = NULL;
if (GST_OBJECT_FLAG_IS_SET (this, GST_TCP_CLIENT_SINK_OPEN))
return TRUE;
- /* look up name if we need to */
- addr = g_inet_address_new_from_string (this->host);
- if (!addr) {
- GList *results;
+ addrs =
+ tcp_get_addresses (GST_ELEMENT (this), this->host, this->cancellable,
+ &err);
+ if (!addrs)
+ goto name_resolve;
- resolver = g_resolver_get_default ();
+ GST_DEBUG_OBJECT (this, "opening sending client socket to %s:%d", this->host,
+ this->port);
- results =
- g_resolver_lookup_by_name (resolver, this->host, this->cancellable,
+ cur_addr = addrs;
+ while (cur_addr) {
+ /* iterate over addresses until one works */
+ this->socket =
+ tcp_create_socket (GST_ELEMENT (this), &cur_addr, this->port, &saddr,
&err);
- if (!results)
- goto name_resolve;
- addr = G_INET_ADDRESS (g_object_ref (results->data));
+ if (!this->socket)
+ break;
- g_resolver_free_addresses (results);
- g_object_unref (resolver);
- }
-#ifndef GST_DISABLE_GST_DEBUG
- {
- gchar *ip = g_inet_address_to_string (addr);
+ GST_DEBUG_OBJECT (this, "opened sending client socket");
- GST_DEBUG_OBJECT (this, "IP address for host %s is %s", this->host, ip);
- g_free (ip);
- }
-#endif
- saddr = g_inet_socket_address_new (addr, this->port);
- g_object_unref (addr);
+ /* connect to server */
+ if (g_socket_connect (this->socket, saddr, this->cancellable, &err))
+ break;
- /* create sending client socket */
- GST_DEBUG_OBJECT (this, "opening sending client socket to %s:%d", this->host,
- this->port);
- this->socket =
- g_socket_new (g_socket_address_get_family (saddr), G_SOCKET_TYPE_STREAM,
- G_SOCKET_PROTOCOL_TCP, &err);
+ /* failed to connect, release and try next address... */
+ g_clear_object (&this->socket);
+ g_clear_object (&saddr);
+ }
+ g_list_free_full (addrs, g_object_unref);
if (!this->socket)
goto no_socket;
- GST_DEBUG_OBJECT (this, "opened sending client socket");
-
- /* connect to server */
- if (!g_socket_connect (this->socket, saddr, this->cancellable, &err))
+ /* we should only have a valid saddr if connect was successful */
+ if (!saddr)
goto connect_failed;
g_object_unref (saddr);
GST_ELEMENT_ERROR (this, RESOURCE, OPEN_READ, (NULL),
("Failed to create socket: %s", err->message));
g_clear_error (&err);
- g_object_unref (saddr);
return FALSE;
}
name_resolve:
{
if (g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
- GST_DEBUG_OBJECT (this, "Cancelled name resolval");
+ GST_DEBUG_OBJECT (this, "Cancelled name resolution");
} else {
GST_ELEMENT_ERROR (this, RESOURCE, OPEN_READ, (NULL),
("Failed to resolve host '%s': %s", this->host, err->message));
}
g_clear_error (&err);
- g_object_unref (resolver);
return FALSE;
}
connect_failed:
err->message));
}
g_clear_error (&err);
- g_object_unref (saddr);
/* pretend we opened ok for proper cleanup to happen */
GST_OBJECT_FLAG_SET (this, GST_TCP_CLIENT_SINK_OPEN);
gst_tcp_client_sink_stop (GST_BASE_SINK (this));