1 /* GIO - GLib Input, Output and Streaming Library
3 * Copyright © 2008 Christian Kellner, Samuel Cormier-Iijima
4 * Copyright © 2009 codethink
5 * Copyright © 2009 Red Hat, Inc
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General
18 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
20 * Authors: Christian Kellner <gicmo@gnome.org>
21 * Samuel Cormier-Iijima <sciyoshi@gmail.com>
22 * Ryan Lortie <desrt@desrt.ca>
23 * Alexander Larsson <alexl@redhat.com>
27 #include "gsocketlistener.h"
29 #include <gio/gioenumtypes.h>
30 #include <gio/gtask.h>
31 #include <gio/gcancellable.h>
32 #include <gio/gsocketaddress.h>
33 #include <gio/ginetaddress.h>
34 #include <gio/gioerror.h>
35 #include <gio/gsocket.h>
36 #include <gio/gsocketconnection.h>
37 #include <gio/ginetsocketaddress.h>
42 * SECTION:gsocketlistener
43 * @title: GSocketListener
44 * @short_description: Helper for accepting network client connections
46 * @see_also: #GThreadedSocketService, #GSocketService.
48 * A #GSocketListener is an object that keeps track of a set
49 * of server sockets and helps you accept sockets from any of the
50 * socket, either sync or async.
52 * Add addresses and ports to listen on using g_socket_listener_add_address()
53 * and g_socket_listener_add_inet_port(). These will be listened on until
54 * g_socket_listener_close() is called. Dropping your final reference to the
55 * #GSocketListener will not cause g_socket_listener_close() to be called
56 * implicitly, as some references to the #GSocketListener may be held
59 * If you want to implement a network server, also look at #GSocketService
60 * and #GThreadedSocketService which are subclasses of #GSocketListener
61 * that make this even easier.
78 static guint signals
[LAST_SIGNAL
] = { 0 };
80 static GQuark source_quark
= 0;
82 struct _GSocketListenerPrivate
85 GMainContext
*main_context
;
90 G_DEFINE_TYPE_WITH_PRIVATE (GSocketListener
, g_socket_listener
, G_TYPE_OBJECT
)
93 g_socket_listener_finalize (GObject
*object
)
95 GSocketListener
*listener
= G_SOCKET_LISTENER (object
);
97 if (listener
->priv
->main_context
)
98 g_main_context_unref (listener
->priv
->main_context
);
100 /* Do not explicitly close the sockets. Instead, let them close themselves if
101 * their final reference is dropped, but keep them open if a reference is
102 * held externally to the GSocketListener (which is possible if
103 * g_socket_listener_add_socket() was used).
105 g_ptr_array_free (listener
->priv
->sockets
, TRUE
);
107 G_OBJECT_CLASS (g_socket_listener_parent_class
)
112 g_socket_listener_get_property (GObject
*object
,
117 GSocketListener
*listener
= G_SOCKET_LISTENER (object
);
121 case PROP_LISTEN_BACKLOG
:
122 g_value_set_int (value
, listener
->priv
->listen_backlog
);
126 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
131 g_socket_listener_set_property (GObject
*object
,
136 GSocketListener
*listener
= G_SOCKET_LISTENER (object
);
140 case PROP_LISTEN_BACKLOG
:
141 g_socket_listener_set_backlog (listener
, g_value_get_int (value
));
145 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
150 g_socket_listener_class_init (GSocketListenerClass
*klass
)
152 GObjectClass
*gobject_class G_GNUC_UNUSED
= G_OBJECT_CLASS (klass
);
154 gobject_class
->finalize
= g_socket_listener_finalize
;
155 gobject_class
->set_property
= g_socket_listener_set_property
;
156 gobject_class
->get_property
= g_socket_listener_get_property
;
157 g_object_class_install_property (gobject_class
, PROP_LISTEN_BACKLOG
,
158 g_param_spec_int ("listen-backlog",
159 P_("Listen backlog"),
160 P_("outstanding connections in the listen queue"),
164 G_PARAM_CONSTRUCT
| G_PARAM_READWRITE
| G_PARAM_STATIC_STRINGS
));
167 * GSocketListener::event:
168 * @listener: the #GSocketListener
169 * @event: the event that is occurring
170 * @socket: the #GSocket the event is occurring on
172 * Emitted when @listener's activity on @socket changes state.
173 * Note that when @listener is used to listen on both IPv4 and
174 * IPv6, a separate set of signals will be emitted for each, and
175 * the order they happen in is undefined.
180 g_signal_new (I_("event"),
181 G_TYPE_FROM_CLASS (gobject_class
),
183 G_STRUCT_OFFSET (GSocketListenerClass
, event
),
186 G_TYPE_SOCKET_LISTENER_EVENT
,
189 source_quark
= g_quark_from_static_string ("g-socket-listener-source");
193 g_socket_listener_init (GSocketListener
*listener
)
195 listener
->priv
= g_socket_listener_get_instance_private (listener
);
196 listener
->priv
->sockets
=
197 g_ptr_array_new_with_free_func ((GDestroyNotify
) g_object_unref
);
198 listener
->priv
->listen_backlog
= 10;
202 * g_socket_listener_new:
204 * Creates a new #GSocketListener with no sockets to listen for.
205 * New listeners can be added with e.g. g_socket_listener_add_address()
206 * or g_socket_listener_add_inet_port().
208 * Returns: a new #GSocketListener.
213 g_socket_listener_new (void)
215 return g_object_new (G_TYPE_SOCKET_LISTENER
, NULL
);
219 check_listener (GSocketListener
*listener
,
222 if (listener
->priv
->closed
)
224 g_set_error_literal (error
, G_IO_ERROR
, G_IO_ERROR_CLOSED
,
225 _("Listener is already closed"));
233 * g_socket_listener_add_socket:
234 * @listener: a #GSocketListener
235 * @socket: a listening #GSocket
236 * @source_object: (nullable): Optional #GObject identifying this source
237 * @error: #GError for error reporting, or %NULL to ignore.
239 * Adds @socket to the set of sockets that we try to accept
240 * new clients from. The socket must be bound to a local
241 * address and listened to.
243 * @source_object will be passed out in the various calls
244 * to accept to identify this particular source, which is
245 * useful if you're listening on multiple addresses and do
246 * different things depending on what address is connected to.
248 * The @socket will not be automatically closed when the @listener is finalized
249 * unless the listener held the final reference to the socket. Before GLib 2.42,
250 * the @socket was automatically closed on finalization of the @listener, even
251 * if references to it were held elsewhere.
253 * Returns: %TRUE on success, %FALSE on error.
258 g_socket_listener_add_socket (GSocketListener
*listener
,
260 GObject
*source_object
,
263 if (!check_listener (listener
, error
))
266 /* TODO: Check that socket it is bound & not closed? */
268 if (g_socket_is_closed (socket
))
270 g_set_error_literal (error
, G_IO_ERROR
, G_IO_ERROR_FAILED
,
271 _("Added socket is closed"));
275 g_object_ref (socket
);
276 g_ptr_array_add (listener
->priv
->sockets
, socket
);
279 g_object_set_qdata_full (G_OBJECT (socket
), source_quark
,
280 g_object_ref (source_object
), g_object_unref
);
283 if (G_SOCKET_LISTENER_GET_CLASS (listener
)->changed
)
284 G_SOCKET_LISTENER_GET_CLASS (listener
)->changed (listener
);
290 * g_socket_listener_add_address:
291 * @listener: a #GSocketListener
292 * @address: a #GSocketAddress
293 * @type: a #GSocketType
294 * @protocol: a #GSocketProtocol
295 * @source_object: (nullable): Optional #GObject identifying this source
296 * @effective_address: (out) (optional): location to store the address that was bound to, or %NULL.
297 * @error: #GError for error reporting, or %NULL to ignore.
299 * Creates a socket of type @type and protocol @protocol, binds
300 * it to @address and adds it to the set of sockets we're accepting
303 * Note that adding an IPv6 address, depending on the platform,
304 * may or may not result in a listener that also accepts IPv4
305 * connections. For more deterministic behavior, see
306 * g_socket_listener_add_inet_port().
308 * @source_object will be passed out in the various calls
309 * to accept to identify this particular source, which is
310 * useful if you're listening on multiple addresses and do
311 * different things depending on what address is connected to.
313 * If successful and @effective_address is non-%NULL then it will
314 * be set to the address that the binding actually occurred at. This
315 * is helpful for determining the port number that was used for when
316 * requesting a binding to port 0 (ie: "any port"). This address, if
317 * requested, belongs to the caller and must be freed.
319 * Call g_socket_listener_close() to stop listening on @address; this will not
320 * be done automatically when you drop your final reference to @listener, as
321 * references may be held internally.
323 * Returns: %TRUE on success, %FALSE on error.
328 g_socket_listener_add_address (GSocketListener
*listener
,
329 GSocketAddress
*address
,
331 GSocketProtocol protocol
,
332 GObject
*source_object
,
333 GSocketAddress
**effective_address
,
336 GSocketAddress
*local_address
;
337 GSocketFamily family
;
340 if (!check_listener (listener
, error
))
343 family
= g_socket_address_get_family (address
);
344 socket
= g_socket_new (family
, type
, protocol
, error
);
348 g_socket_set_listen_backlog (socket
, listener
->priv
->listen_backlog
);
350 g_signal_emit (listener
, signals
[EVENT
], 0,
351 G_SOCKET_LISTENER_BINDING
, socket
);
353 if (!g_socket_bind (socket
, address
, TRUE
, error
))
355 g_object_unref (socket
);
359 g_signal_emit (listener
, signals
[EVENT
], 0,
360 G_SOCKET_LISTENER_BOUND
, socket
);
361 g_signal_emit (listener
, signals
[EVENT
], 0,
362 G_SOCKET_LISTENER_LISTENING
, socket
);
364 if (!g_socket_listen (socket
, error
))
366 g_object_unref (socket
);
370 g_signal_emit (listener
, signals
[EVENT
], 0,
371 G_SOCKET_LISTENER_LISTENED
, socket
);
373 local_address
= NULL
;
374 if (effective_address
)
376 local_address
= g_socket_get_local_address (socket
, error
);
377 if (local_address
== NULL
)
379 g_object_unref (socket
);
384 if (!g_socket_listener_add_socket (listener
, socket
,
389 g_object_unref (local_address
);
390 g_object_unref (socket
);
394 if (effective_address
)
395 *effective_address
= local_address
;
397 g_object_unref (socket
); /* add_socket refs this */
403 * g_socket_listener_add_inet_port:
404 * @listener: a #GSocketListener
405 * @port: an IP port number (non-zero)
406 * @source_object: (nullable): Optional #GObject identifying this source
407 * @error: #GError for error reporting, or %NULL to ignore.
409 * Helper function for g_socket_listener_add_address() that
410 * creates a TCP/IP socket listening on IPv4 and IPv6 (if
411 * supported) on the specified port on all interfaces.
413 * @source_object will be passed out in the various calls
414 * to accept to identify this particular source, which is
415 * useful if you're listening on multiple addresses and do
416 * different things depending on what address is connected to.
418 * Call g_socket_listener_close() to stop listening on @port; this will not
419 * be done automatically when you drop your final reference to @listener, as
420 * references may be held internally.
422 * Returns: %TRUE on success, %FALSE on error.
427 g_socket_listener_add_inet_port (GSocketListener
*listener
,
429 GObject
*source_object
,
432 gboolean need_ipv4_socket
= TRUE
;
433 GSocket
*socket4
= NULL
;
436 g_return_val_if_fail (listener
!= NULL
, FALSE
);
437 g_return_val_if_fail (port
!= 0, FALSE
);
439 if (!check_listener (listener
, error
))
442 /* first try to create an IPv6 socket */
443 socket6
= g_socket_new (G_SOCKET_FAMILY_IPV6
,
444 G_SOCKET_TYPE_STREAM
,
445 G_SOCKET_PROTOCOL_DEFAULT
,
449 /* IPv6 is supported on this platform, so if we fail now it is
450 * a result of being unable to bind to our port. Don't fail
451 * silently as a result of this!
454 GInetAddress
*inet_address
;
455 GSocketAddress
*address
;
457 inet_address
= g_inet_address_new_any (G_SOCKET_FAMILY_IPV6
);
458 address
= g_inet_socket_address_new (inet_address
, port
);
459 g_object_unref (inet_address
);
461 g_socket_set_listen_backlog (socket6
, listener
->priv
->listen_backlog
);
463 g_signal_emit (listener
, signals
[EVENT
], 0,
464 G_SOCKET_LISTENER_BINDING
, socket6
);
466 if (!g_socket_bind (socket6
, address
, TRUE
, error
))
468 g_object_unref (address
);
469 g_object_unref (socket6
);
473 g_object_unref (address
);
475 g_signal_emit (listener
, signals
[EVENT
], 0,
476 G_SOCKET_LISTENER_BOUND
, socket6
);
477 g_signal_emit (listener
, signals
[EVENT
], 0,
478 G_SOCKET_LISTENER_LISTENING
, socket6
);
480 if (!g_socket_listen (socket6
, error
))
482 g_object_unref (socket6
);
486 g_signal_emit (listener
, signals
[EVENT
], 0,
487 G_SOCKET_LISTENER_LISTENED
, socket6
);
490 g_object_set_qdata_full (G_OBJECT (socket6
), source_quark
,
491 g_object_ref (source_object
),
494 /* If this socket already speaks IPv4 then we are done. */
495 if (g_socket_speaks_ipv4 (socket6
))
496 need_ipv4_socket
= FALSE
;
499 if (need_ipv4_socket
)
500 /* We are here for exactly one of the following reasons:
502 * - our platform doesn't support IPv6
503 * - we successfully created an IPv6 socket but it's V6ONLY
505 * In either case, we need to go ahead and create an IPv4 socket
506 * and fail the call if we can't bind to it.
509 socket4
= g_socket_new (G_SOCKET_FAMILY_IPV4
,
510 G_SOCKET_TYPE_STREAM
,
511 G_SOCKET_PROTOCOL_DEFAULT
,
515 /* IPv4 is supported on this platform, so if we fail now it is
516 * a result of being unable to bind to our port. Don't fail
517 * silently as a result of this!
520 GInetAddress
*inet_address
;
521 GSocketAddress
*address
;
523 inet_address
= g_inet_address_new_any (G_SOCKET_FAMILY_IPV4
);
524 address
= g_inet_socket_address_new (inet_address
, port
);
525 g_object_unref (inet_address
);
527 g_socket_set_listen_backlog (socket4
,
528 listener
->priv
->listen_backlog
);
530 g_signal_emit (listener
, signals
[EVENT
], 0,
531 G_SOCKET_LISTENER_BINDING
, socket4
);
533 if (!g_socket_bind (socket4
, address
, TRUE
, error
))
535 g_object_unref (address
);
536 g_object_unref (socket4
);
538 g_object_unref (socket6
);
543 g_object_unref (address
);
545 g_signal_emit (listener
, signals
[EVENT
], 0,
546 G_SOCKET_LISTENER_BOUND
, socket4
);
547 g_signal_emit (listener
, signals
[EVENT
], 0,
548 G_SOCKET_LISTENER_LISTENING
, socket4
);
550 if (!g_socket_listen (socket4
, error
))
552 g_object_unref (socket4
);
554 g_object_unref (socket6
);
559 g_signal_emit (listener
, signals
[EVENT
], 0,
560 G_SOCKET_LISTENER_LISTENED
, socket4
);
563 g_object_set_qdata_full (G_OBJECT (socket4
), source_quark
,
564 g_object_ref (source_object
),
568 /* Ok. So IPv4 is not supported on this platform. If we
569 * succeeded at creating an IPv6 socket then that's OK, but
570 * otherwise we need to tell the user we failed.
574 g_clear_error (error
);
580 g_assert (socket6
!= NULL
|| socket4
!= NULL
);
583 g_ptr_array_add (listener
->priv
->sockets
, socket6
);
586 g_ptr_array_add (listener
->priv
->sockets
, socket4
);
588 if (G_SOCKET_LISTENER_GET_CLASS (listener
)->changed
)
589 G_SOCKET_LISTENER_GET_CLASS (listener
)->changed (listener
);
595 add_sources (GSocketListener
*listener
,
596 GSocketSourceFunc callback
,
597 gpointer callback_data
,
598 GCancellable
*cancellable
,
599 GMainContext
*context
)
607 for (i
= 0; i
< listener
->priv
->sockets
->len
; i
++)
609 socket
= listener
->priv
->sockets
->pdata
[i
];
611 source
= g_socket_create_source (socket
, G_IO_IN
, cancellable
);
612 g_source_set_callback (source
,
613 (GSourceFunc
) callback
,
614 callback_data
, NULL
);
615 g_source_attach (source
, context
);
617 sources
= g_list_prepend (sources
, source
);
624 free_sources (GList
*sources
)
627 while (sources
!= NULL
)
629 source
= sources
->data
;
630 sources
= g_list_delete_link (sources
, sources
);
631 g_source_destroy (source
);
632 g_source_unref (source
);
642 accept_callback (GSocket
*socket
,
643 GIOCondition condition
,
646 struct AcceptData
*data
= user_data
;
648 data
->socket
= socket
;
649 g_main_loop_quit (data
->loop
);
655 * g_socket_listener_accept_socket:
656 * @listener: a #GSocketListener
657 * @source_object: (out) (transfer none) (optional) (nullable): location where #GObject pointer will be stored, or %NULL.
658 * @cancellable: (nullable): optional #GCancellable object, %NULL to ignore.
659 * @error: #GError for error reporting, or %NULL to ignore.
661 * Blocks waiting for a client to connect to any of the sockets added
662 * to the listener. Returns the #GSocket that was accepted.
664 * If you want to accept the high-level #GSocketConnection, not a #GSocket,
665 * which is often the case, then you should use g_socket_listener_accept()
668 * If @source_object is not %NULL it will be filled out with the source
669 * object specified when the corresponding socket or address was added
672 * If @cancellable is not %NULL, then the operation can be cancelled by
673 * triggering the cancellable object from another thread. If the operation
674 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned.
676 * Returns: (transfer full): a #GSocket on success, %NULL on error.
681 g_socket_listener_accept_socket (GSocketListener
*listener
,
682 GObject
**source_object
,
683 GCancellable
*cancellable
,
686 GSocket
*accept_socket
, *socket
;
688 g_return_val_if_fail (G_IS_SOCKET_LISTENER (listener
), NULL
);
690 if (!check_listener (listener
, error
))
693 if (listener
->priv
->sockets
->len
== 1)
695 accept_socket
= listener
->priv
->sockets
->pdata
[0];
696 if (!g_socket_condition_wait (accept_socket
, G_IO_IN
,
703 struct AcceptData data
;
706 if (listener
->priv
->main_context
== NULL
)
707 listener
->priv
->main_context
= g_main_context_new ();
709 loop
= g_main_loop_new (listener
->priv
->main_context
, FALSE
);
711 sources
= add_sources (listener
,
715 listener
->priv
->main_context
);
716 g_main_loop_run (loop
);
717 accept_socket
= data
.socket
;
718 free_sources (sources
);
719 g_main_loop_unref (loop
);
722 if (!(socket
= g_socket_accept (accept_socket
, cancellable
, error
)))
726 *source_object
= g_object_get_qdata (G_OBJECT (accept_socket
), source_quark
);
732 * g_socket_listener_accept:
733 * @listener: a #GSocketListener
734 * @source_object: (out) (transfer none) (optional) (nullable): location where #GObject pointer will be stored, or %NULL
735 * @cancellable: (nullable): optional #GCancellable object, %NULL to ignore.
736 * @error: #GError for error reporting, or %NULL to ignore.
738 * Blocks waiting for a client to connect to any of the sockets added
739 * to the listener. Returns a #GSocketConnection for the socket that was
742 * If @source_object is not %NULL it will be filled out with the source
743 * object specified when the corresponding socket or address was added
746 * If @cancellable is not %NULL, then the operation can be cancelled by
747 * triggering the cancellable object from another thread. If the operation
748 * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned.
750 * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
755 g_socket_listener_accept (GSocketListener
*listener
,
756 GObject
**source_object
,
757 GCancellable
*cancellable
,
760 GSocketConnection
*connection
;
763 socket
= g_socket_listener_accept_socket (listener
,
770 connection
= g_socket_connection_factory_create_connection (socket
);
771 g_object_unref (socket
);
777 accept_ready (GSocket
*accept_socket
,
778 GIOCondition condition
,
781 GTask
*task
= user_data
;
782 GError
*error
= NULL
;
784 GObject
*source_object
;
786 socket
= g_socket_accept (accept_socket
, g_task_get_cancellable (task
), &error
);
789 source_object
= g_object_get_qdata (G_OBJECT (accept_socket
), source_quark
);
791 g_object_set_qdata_full (G_OBJECT (task
),
793 g_object_ref (source_object
), g_object_unref
);
794 g_task_return_pointer (task
, socket
, g_object_unref
);
798 g_task_return_error (task
, error
);
801 g_object_unref (task
);
806 * g_socket_listener_accept_socket_async:
807 * @listener: a #GSocketListener
808 * @cancellable: (nullable): a #GCancellable, or %NULL
809 * @callback: (scope async): a #GAsyncReadyCallback
810 * @user_data: (closure): user data for the callback
812 * This is the asynchronous version of g_socket_listener_accept_socket().
814 * When the operation is finished @callback will be
815 * called. You can then call g_socket_listener_accept_socket_finish()
816 * to get the result of the operation.
821 g_socket_listener_accept_socket_async (GSocketListener
*listener
,
822 GCancellable
*cancellable
,
823 GAsyncReadyCallback callback
,
828 GError
*error
= NULL
;
830 task
= g_task_new (listener
, cancellable
, callback
, user_data
);
831 g_task_set_source_tag (task
, g_socket_listener_accept_socket_async
);
833 if (!check_listener (listener
, &error
))
835 g_task_return_error (task
, error
);
836 g_object_unref (task
);
840 sources
= add_sources (listener
,
844 g_main_context_get_thread_default ());
845 g_task_set_task_data (task
, sources
, (GDestroyNotify
) free_sources
);
849 * g_socket_listener_accept_socket_finish:
850 * @listener: a #GSocketListener
851 * @result: a #GAsyncResult.
852 * @source_object: (out) (transfer none) (optional) (nullable): Optional #GObject identifying this source
853 * @error: a #GError location to store the error occurring, or %NULL to
856 * Finishes an async accept operation. See g_socket_listener_accept_socket_async()
858 * Returns: (transfer full): a #GSocket on success, %NULL on error.
863 g_socket_listener_accept_socket_finish (GSocketListener
*listener
,
864 GAsyncResult
*result
,
865 GObject
**source_object
,
868 g_return_val_if_fail (G_IS_SOCKET_LISTENER (listener
), NULL
);
869 g_return_val_if_fail (g_task_is_valid (result
, listener
), NULL
);
872 *source_object
= g_object_get_qdata (G_OBJECT (result
), source_quark
);
874 return g_task_propagate_pointer (G_TASK (result
), error
);
878 * g_socket_listener_accept_async:
879 * @listener: a #GSocketListener
880 * @cancellable: (nullable): a #GCancellable, or %NULL
881 * @callback: (scope async): a #GAsyncReadyCallback
882 * @user_data: (closure): user data for the callback
884 * This is the asynchronous version of g_socket_listener_accept().
886 * When the operation is finished @callback will be
887 * called. You can then call g_socket_listener_accept_socket()
888 * to get the result of the operation.
893 g_socket_listener_accept_async (GSocketListener
*listener
,
894 GCancellable
*cancellable
,
895 GAsyncReadyCallback callback
,
898 g_socket_listener_accept_socket_async (listener
,
905 * g_socket_listener_accept_finish:
906 * @listener: a #GSocketListener
907 * @result: a #GAsyncResult.
908 * @source_object: (out) (transfer none) (optional) (nullable): Optional #GObject identifying this source
909 * @error: a #GError location to store the error occurring, or %NULL to
912 * Finishes an async accept operation. See g_socket_listener_accept_async()
914 * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
919 g_socket_listener_accept_finish (GSocketListener
*listener
,
920 GAsyncResult
*result
,
921 GObject
**source_object
,
925 GSocketConnection
*connection
;
927 socket
= g_socket_listener_accept_socket_finish (listener
,
934 connection
= g_socket_connection_factory_create_connection (socket
);
935 g_object_unref (socket
);
940 * g_socket_listener_set_backlog:
941 * @listener: a #GSocketListener
942 * @listen_backlog: an integer
944 * Sets the listen backlog on the sockets in the listener.
946 * See g_socket_set_listen_backlog() for details
951 g_socket_listener_set_backlog (GSocketListener
*listener
,
957 if (listener
->priv
->closed
)
960 listener
->priv
->listen_backlog
= listen_backlog
;
962 for (i
= 0; i
< listener
->priv
->sockets
->len
; i
++)
964 socket
= listener
->priv
->sockets
->pdata
[i
];
965 g_socket_set_listen_backlog (socket
, listen_backlog
);
970 * g_socket_listener_close:
971 * @listener: a #GSocketListener
973 * Closes all the sockets in the listener.
978 g_socket_listener_close (GSocketListener
*listener
)
983 g_return_if_fail (G_IS_SOCKET_LISTENER (listener
));
985 if (listener
->priv
->closed
)
988 for (i
= 0; i
< listener
->priv
->sockets
->len
; i
++)
990 socket
= listener
->priv
->sockets
->pdata
[i
];
991 g_socket_close (socket
, NULL
);
993 listener
->priv
->closed
= TRUE
;
997 * g_socket_listener_add_any_inet_port:
998 * @listener: a #GSocketListener
999 * @source_object: (nullable): Optional #GObject identifying this source
1000 * @error: a #GError location to store the error occurring, or %NULL to
1003 * Listens for TCP connections on any available port number for both
1004 * IPv6 and IPv4 (if each is available).
1006 * This is useful if you need to have a socket for incoming connections
1007 * but don't care about the specific port number.
1009 * @source_object will be passed out in the various calls
1010 * to accept to identify this particular source, which is
1011 * useful if you're listening on multiple addresses and do
1012 * different things depending on what address is connected to.
1014 * Returns: the port number, or 0 in case of failure.
1019 g_socket_listener_add_any_inet_port (GSocketListener
*listener
,
1020 GObject
*source_object
,
1023 GSList
*sockets_to_close
= NULL
;
1024 guint16 candidate_port
= 0;
1025 GSocket
*socket6
= NULL
;
1026 GSocket
*socket4
= NULL
;
1030 * multi-step process:
1031 * - first, create an IPv6 socket.
1032 * - if that fails, create an IPv4 socket and bind it to port 0 and
1033 * that's it. no retries if that fails (why would it?).
1034 * - if our IPv6 socket also speaks IPv4 then we are done.
1035 * - if not, then we need to create a IPv4 socket with the same port
1036 * number. this might fail, of course. so we try this a bunch of
1037 * times -- leaving the old IPv6 sockets open so that we get a
1038 * different port number to try each time.
1039 * - if all that fails then just give up.
1044 GInetAddress
*inet_address
;
1045 GSocketAddress
*address
;
1048 g_assert (socket6
== NULL
);
1049 socket6
= g_socket_new (G_SOCKET_FAMILY_IPV6
,
1050 G_SOCKET_TYPE_STREAM
,
1051 G_SOCKET_PROTOCOL_DEFAULT
,
1054 if (socket6
!= NULL
)
1056 inet_address
= g_inet_address_new_any (G_SOCKET_FAMILY_IPV6
);
1057 address
= g_inet_socket_address_new (inet_address
, 0);
1058 g_object_unref (inet_address
);
1060 g_signal_emit (listener
, signals
[EVENT
], 0,
1061 G_SOCKET_LISTENER_BINDING
, socket6
);
1063 result
= g_socket_bind (socket6
, address
, TRUE
, error
);
1064 g_object_unref (address
);
1067 !(address
= g_socket_get_local_address (socket6
, error
)))
1069 g_object_unref (socket6
);
1074 g_signal_emit (listener
, signals
[EVENT
], 0,
1075 G_SOCKET_LISTENER_BOUND
, socket6
);
1077 g_assert (G_IS_INET_SOCKET_ADDRESS (address
));
1079 g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address
));
1080 g_assert (candidate_port
!= 0);
1081 g_object_unref (address
);
1083 if (g_socket_speaks_ipv4 (socket6
))
1087 g_assert (socket4
== NULL
);
1088 socket4
= g_socket_new (G_SOCKET_FAMILY_IPV4
,
1089 G_SOCKET_TYPE_STREAM
,
1090 G_SOCKET_PROTOCOL_DEFAULT
,
1091 socket6
? NULL
: error
);
1093 if (socket4
== NULL
)
1094 /* IPv4 not supported.
1095 * if IPv6 is supported then candidate_port will be non-zero
1096 * (and the error parameter above will have been NULL)
1097 * if IPv6 is unsupported then candidate_port will be zero
1098 * (and error will have been set by the above call)
1102 inet_address
= g_inet_address_new_any (G_SOCKET_FAMILY_IPV4
);
1103 address
= g_inet_socket_address_new (inet_address
, candidate_port
);
1104 g_object_unref (inet_address
);
1106 g_signal_emit (listener
, signals
[EVENT
], 0,
1107 G_SOCKET_LISTENER_BINDING
, socket4
);
1109 /* a note on the 'error' clause below:
1111 * if candidate_port is 0 then we report the error right away
1112 * since it is strange that this binding would fail at all.
1113 * otherwise, we ignore the error message (ie: NULL).
1115 * the exception to this rule is the last time through the loop
1116 * (ie: attempts == 0) in which case we want to set the error
1117 * because failure here means that the entire call will fail and
1118 * we need something to show to the user.
1120 * an english summary of the situation: "if we gave a candidate
1121 * port number AND we have more attempts to try, then ignore the
1124 result
= g_socket_bind (socket4
, address
, TRUE
,
1125 (candidate_port
&& attempts
) ? NULL
: error
);
1126 g_object_unref (address
);
1130 g_assert (socket6
!= NULL
);
1133 /* got our candidate port successfully */
1135 g_signal_emit (listener
, signals
[EVENT
], 0,
1136 G_SOCKET_LISTENER_BOUND
, socket4
);
1140 /* we failed to bind to the specified port. try again. */
1142 g_object_unref (socket4
);
1145 /* keep this open so we get a different port number */
1146 sockets_to_close
= g_slist_prepend (sockets_to_close
,
1153 /* we didn't tell it a port. this means two things.
1154 * - if we failed, then something really bad happened.
1155 * - if we succeeded, then we need to find out the port number.
1158 g_assert (socket6
== NULL
);
1161 !(address
= g_socket_get_local_address (socket4
, error
)))
1163 g_object_unref (socket4
);
1168 g_signal_emit (listener
, signals
[EVENT
], 0,
1169 G_SOCKET_LISTENER_BOUND
, socket4
);
1171 g_assert (G_IS_INET_SOCKET_ADDRESS (address
));
1173 g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address
));
1174 g_assert (candidate_port
!= 0);
1175 g_object_unref (address
);
1180 /* should only be non-zero if we have a socket */
1181 g_assert ((candidate_port
!= 0) == (socket4
|| socket6
));
1183 while (sockets_to_close
)
1185 g_object_unref (sockets_to_close
->data
);
1186 sockets_to_close
= g_slist_delete_link (sockets_to_close
,
1190 /* now we actually listen() the sockets and add them to the listener */
1191 if (socket6
!= NULL
)
1193 g_socket_set_listen_backlog (socket6
, listener
->priv
->listen_backlog
);
1195 g_signal_emit (listener
, signals
[EVENT
], 0,
1196 G_SOCKET_LISTENER_LISTENING
, socket6
);
1198 if (!g_socket_listen (socket6
, error
))
1200 g_object_unref (socket6
);
1202 g_object_unref (socket4
);
1207 g_signal_emit (listener
, signals
[EVENT
], 0,
1208 G_SOCKET_LISTENER_LISTENED
, socket6
);
1211 g_object_set_qdata_full (G_OBJECT (socket6
), source_quark
,
1212 g_object_ref (source_object
),
1215 g_ptr_array_add (listener
->priv
->sockets
, socket6
);
1218 if (socket4
!= NULL
)
1220 g_socket_set_listen_backlog (socket4
, listener
->priv
->listen_backlog
);
1222 g_signal_emit (listener
, signals
[EVENT
], 0,
1223 G_SOCKET_LISTENER_LISTENING
, socket4
);
1225 if (!g_socket_listen (socket4
, error
))
1227 g_object_unref (socket4
);
1229 g_object_unref (socket6
);
1234 g_signal_emit (listener
, signals
[EVENT
], 0,
1235 G_SOCKET_LISTENER_LISTENED
, socket4
);
1238 g_object_set_qdata_full (G_OBJECT (socket4
), source_quark
,
1239 g_object_ref (source_object
),
1242 g_ptr_array_add (listener
->priv
->sockets
, socket4
);
1245 if ((socket4
!= NULL
|| socket6
!= NULL
) &&
1246 G_SOCKET_LISTENER_GET_CLASS (listener
)->changed
)
1247 G_SOCKET_LISTENER_GET_CLASS (listener
)->changed (listener
);
1249 return candidate_port
;