818
855
G_PARAM_READWRITE |
819
856
G_PARAM_STATIC_STRINGS));
861
* Whether the socket should allow sending to and receiving from broadcast addresses.
865
g_object_class_install_property (gobject_class, PROP_BROADCAST,
866
g_param_spec_boolean ("broadcast",
868
P_("Whether to allow sending to and receiving from broadcast addresses"),
871
G_PARAM_STATIC_STRINGS));
876
* Time-to-live for outgoing unicast packets
880
g_object_class_install_property (gobject_class, PROP_TTL,
881
g_param_spec_uint ("ttl",
883
P_("Time-to-live of outgoing unicast packets"),
886
G_PARAM_STATIC_STRINGS));
889
* GSocket:multicast-loopback:
891
* Whether outgoing multicast packets loop back to the local host.
895
g_object_class_install_property (gobject_class, PROP_MULTICAST_LOOPBACK,
896
g_param_spec_boolean ("multicast-loopback",
897
P_("Multicast loopback"),
898
P_("Whether outgoing multicast packets loop back to the local host"),
901
G_PARAM_STATIC_STRINGS));
904
* GSocket:multicast-ttl:
906
* Time-to-live out outgoing multicast packets
910
g_object_class_install_property (gobject_class, PROP_MULTICAST_TTL,
911
g_param_spec_uint ("multicast-ttl",
913
P_("Time-to-live of outgoing multicast packets"),
916
G_PARAM_STATIC_STRINGS));
1265
* @socket: a #GSocket.
1267
* Gets the unicast time-to-live setting on @socket; see
1268
* g_socket_set_ttl() for more details.
1270
* Returns: the time-to-live setting on @socket
1275
g_socket_get_ttl (GSocket *socket)
1278
guint value, optlen;
1280
g_return_val_if_fail (G_IS_SOCKET (socket), FALSE);
1282
if (socket->priv->family == G_SOCKET_FAMILY_IPV4)
1286
optlen = sizeof (optval);
1287
result = getsockopt (socket->priv->fd, IPPROTO_IP, IP_TTL,
1291
else if (socket->priv->family == G_SOCKET_FAMILY_IPV6)
1293
optlen = sizeof (value);
1294
result = getsockopt (socket->priv->fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS,
1298
g_return_val_if_reached (FALSE);
1302
int errsv = get_socket_errno ();
1303
g_warning ("error getting unicast ttl: %s", socket_strerror (errsv));
1312
* @socket: a #GSocket.
1313
* @ttl: the time-to-live value for all unicast packets on @socket
1315
* Sets the time-to-live for outgoing unicast packets on @socket.
1316
* By default the platform-specific default value is used.
1321
g_socket_set_ttl (GSocket *socket,
1326
g_return_if_fail (G_IS_SOCKET (socket));
1328
if (socket->priv->family == G_SOCKET_FAMILY_IPV4)
1330
guchar optval = (guchar)ttl;
1332
result = setsockopt (socket->priv->fd, IPPROTO_IP, IP_TTL,
1333
&optval, sizeof (optval));
1335
else if (socket->priv->family == G_SOCKET_FAMILY_IPV6)
1337
result = setsockopt (socket->priv->fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS,
1338
&ttl, sizeof (ttl));
1341
g_return_if_reached ();
1345
int errsv = get_socket_errno ();
1346
g_warning ("error setting unicast ttl: %s", socket_strerror (errsv));
1350
g_object_notify (G_OBJECT (socket), "ttl");
1354
* g_socket_get_broadcast:
1355
* @socket: a #GSocket.
1357
* Gets the broadcast setting on @socket; if %TRUE,
1358
* it is possible to send packets to broadcast
1359
* addresses or receive from broadcast addresses.
1361
* Returns: the broadcast setting on @socket
1366
g_socket_get_broadcast (GSocket *socket)
1369
guint value = 0, optlen;
1371
g_return_val_if_fail (G_IS_SOCKET (socket), FALSE);
1373
optlen = sizeof (guchar);
1374
result = getsockopt (socket->priv->fd, SOL_SOCKET, SO_BROADCAST,
1379
int errsv = get_socket_errno ();
1380
g_warning ("error getting broadcast: %s", socket_strerror (errsv));
1388
* g_socket_set_broadcast:
1389
* @socket: a #GSocket.
1390
* @loopback: whether @socket should allow sending to and receiving
1391
* from broadcast addresses
1393
* Sets whether @socket should allow sending to and receiving from
1394
* broadcast addresses. This is %FALSE by default.
1399
g_socket_set_broadcast (GSocket *socket,
1405
g_return_if_fail (G_IS_SOCKET (socket));
1407
broadcast = !!broadcast;
1408
value = (guchar)broadcast;
1410
result = setsockopt (socket->priv->fd, SOL_SOCKET, SO_BROADCAST,
1411
&value, sizeof (value));
1415
int errsv = get_socket_errno ();
1416
g_warning ("error setting broadcast: %s", socket_strerror (errsv));
1420
g_object_notify (G_OBJECT (socket), "broadcast");
1424
* g_socket_get_multicast_loopback:
1425
* @socket: a #GSocket.
1427
* Gets the multicast loopback setting on @socket; if %TRUE (the
1428
* default), outgoing multicast packets will be looped back to
1429
* multicast listeners on the same host.
1431
* Returns: the multicast loopback setting on @socket
1436
g_socket_get_multicast_loopback (GSocket *socket)
1439
guint value = 0, optlen;
1441
g_return_val_if_fail (G_IS_SOCKET (socket), FALSE);
1443
if (socket->priv->family == G_SOCKET_FAMILY_IPV4)
1445
optlen = sizeof (guchar);
1446
result = getsockopt (socket->priv->fd, IPPROTO_IP, IP_MULTICAST_LOOP,
1449
else if (socket->priv->family == G_SOCKET_FAMILY_IPV6)
1451
optlen = sizeof (guint);
1452
result = getsockopt (socket->priv->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
1456
g_return_val_if_reached (FALSE);
1460
int errsv = get_socket_errno ();
1461
g_warning ("error getting multicast loopback: %s", socket_strerror (errsv));
1469
* g_socket_set_multicast_loopback:
1470
* @socket: a #GSocket.
1471
* @loopback: whether @socket should receive messages sent to its
1472
* multicast groups from the local host
1474
* Sets whether outgoing multicast packets will be received by sockets
1475
* listening on that multicast address on the same host. This is %TRUE
1481
g_socket_set_multicast_loopback (GSocket *socket,
1486
g_return_if_fail (G_IS_SOCKET (socket));
1488
loopback = !!loopback;
1490
if (socket->priv->family == G_SOCKET_FAMILY_IPV4)
1492
guchar value = (guchar)loopback;
1494
result = setsockopt (socket->priv->fd, IPPROTO_IP, IP_MULTICAST_LOOP,
1495
&value, sizeof (value));
1497
else if (socket->priv->family == G_SOCKET_FAMILY_IPV6)
1499
guint value = (guint)loopback;
1501
result = setsockopt (socket->priv->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
1502
&value, sizeof (value));
1505
g_return_if_reached ();
1509
int errsv = get_socket_errno ();
1510
g_warning ("error setting multicast loopback: %s", socket_strerror (errsv));
1514
g_object_notify (G_OBJECT (socket), "multicast-loopback");
1518
* g_socket_get_multicast_ttl:
1519
* @socket: a #GSocket.
1521
* Gets the multicast time-to-live setting on @socket; see
1522
* g_socket_set_multicast_ttl() for more details.
1524
* Returns: the multicast time-to-live setting on @socket
1529
g_socket_get_multicast_ttl (GSocket *socket)
1532
guint value, optlen;
1534
g_return_val_if_fail (G_IS_SOCKET (socket), FALSE);
1536
if (socket->priv->family == G_SOCKET_FAMILY_IPV4)
1540
optlen = sizeof (optval);
1541
result = getsockopt (socket->priv->fd, IPPROTO_IP, IP_MULTICAST_TTL,
1545
else if (socket->priv->family == G_SOCKET_FAMILY_IPV6)
1547
optlen = sizeof (value);
1548
result = getsockopt (socket->priv->fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
1552
g_return_val_if_reached (FALSE);
1556
int errsv = get_socket_errno ();
1557
g_warning ("error getting multicast ttl: %s", socket_strerror (errsv));
1565
* g_socket_set_multicast_ttl:
1566
* @socket: a #GSocket.
1567
* @ttl: the time-to-live value for all multicast datagrams on @socket
1569
* Sets the time-to-live for outgoing multicast datagrams on @socket.
1570
* By default, this is 1, meaning that multicast packets will not leave
1571
* the local network.
1576
g_socket_set_multicast_ttl (GSocket *socket,
1581
g_return_if_fail (G_IS_SOCKET (socket));
1583
if (socket->priv->family == G_SOCKET_FAMILY_IPV4)
1585
guchar optval = (guchar)ttl;
1587
result = setsockopt (socket->priv->fd, IPPROTO_IP, IP_MULTICAST_TTL,
1588
&optval, sizeof (optval));
1590
else if (socket->priv->family == G_SOCKET_FAMILY_IPV6)
1592
result = setsockopt (socket->priv->fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
1593
&ttl, sizeof (ttl));
1596
g_return_if_reached ();
1600
int errsv = get_socket_errno ();
1601
g_warning ("error setting multicast ttl: %s", socket_strerror (errsv));
1605
g_object_notify (G_OBJECT (socket), "multicast-ttl");
1167
1609
* g_socket_get_family:
1168
1610
* @socket: a #GSocket.
1898
g_socket_multicast_group_operation (GSocket *socket,
1899
GInetAddress *group,
1900
gboolean source_specific,
1901
const gchar *interface,
1902
gboolean join_group,
1905
const guint8 *native_addr;
1906
gint optname, result;
1908
g_return_val_if_fail (G_IS_SOCKET (socket), FALSE);
1909
g_return_val_if_fail (socket->priv->type == G_SOCKET_TYPE_DATAGRAM, FALSE);
1910
g_return_val_if_fail (G_IS_INET_ADDRESS (group), FALSE);
1911
g_return_val_if_fail (g_inet_address_get_family (group) == socket->priv->family, FALSE);
1913
if (!check_socket (socket, error))
1916
native_addr = g_inet_address_to_bytes (group);
1917
if (socket->priv->family == G_SOCKET_FAMILY_IPV4)
1919
#ifdef HAVE_IP_MREQN
1920
struct ip_mreqn mc_req;
1922
struct ip_mreq mc_req;
1925
memcpy (&mc_req.imr_multiaddr, native_addr, sizeof (struct in_addr));
1927
#ifdef HAVE_IP_MREQN
1929
mc_req.imr_ifindex = if_nametoindex (interface);
1931
mc_req.imr_ifindex = 0; /* Pick any. */
1933
mc_req.imr_interface.s_addr = g_htonl (INADDR_ANY);
1936
if (source_specific)
1937
optname = join_group ? IP_ADD_SOURCE_MEMBERSHIP : IP_DROP_SOURCE_MEMBERSHIP;
1939
optname = join_group ? IP_ADD_MEMBERSHIP : IP_DROP_MEMBERSHIP;
1940
result = setsockopt (socket->priv->fd, IPPROTO_IP, optname,
1941
&mc_req, sizeof (mc_req));
1943
else if (socket->priv->family == G_SOCKET_FAMILY_IPV6)
1945
struct ipv6_mreq mc_req_ipv6;
1947
memcpy (&mc_req_ipv6.ipv6mr_multiaddr, native_addr, sizeof (struct in6_addr));
1949
mc_req_ipv6.ipv6mr_interface = if_nametoindex (interface);
1951
mc_req_ipv6.ipv6mr_interface = 0;
1953
optname = join_group ? IPV6_ADD_MEMBERSHIP : IPV6_DROP_MEMBERSHIP;
1954
result = setsockopt (socket->priv->fd, IPPROTO_IPV6, optname,
1955
&mc_req_ipv6, sizeof (mc_req_ipv6));
1958
g_return_val_if_reached (FALSE);
1962
int errsv = get_socket_errno ();
1964
g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv),
1966
_("Error joining multicast group: %s") :
1967
_("Error leaving multicast group: %s"),
1968
socket_strerror (errsv));
1976
* g_socket_join_multicast_group:
1977
* @socket: a #GSocket.
1978
* @group: a #GInetAddress specifying the group address to join.
1979
* @interface: Interface to use
1980
* @source_specific: %TRUE if source-specific multicast should be used
1981
* @error: #GError for error reporting, or %NULL to ignore.
1983
* Registers @socket to receive multicast messages sent to @group.
1984
* @socket must be a %G_SOCKET_TYPE_DATAGRAM socket, and must have
1985
* been bound to an appropriate interface and port with
1988
* If @source_specific is %TRUE, source-specific multicast as defined
1989
* in RFC 4604 is used.
1991
* Returns: %TRUE on success, %FALSE on error.
1996
g_socket_join_multicast_group (GSocket *socket,
1997
GInetAddress *group,
1998
gboolean source_specific,
1999
const gchar *interface,
2002
return g_socket_multicast_group_operation (socket, group, source_specific, interface, TRUE, error);
2006
* g_socket_leave_multicast_group:
2007
* @socket: a #GSocket.
2008
* @group: a #GInetAddress specifying the group address to leave.
2009
* @interface: Interface to use
2010
* @source_specific: %TRUE if source-specific multicast should be used
2011
* @error: #GError for error reporting, or %NULL to ignore.
2013
* Removes @socket from the multicast group @group (while still
2014
* allowing it to receive unicast messages).
2016
* If @source_specific is %TRUE, source-specific multicast as defined
2017
* in RFC 4604 is used.
2019
* Returns: %TRUE on success, %FALSE on error.
2024
g_socket_leave_multicast_group (GSocket *socket,
2025
GInetAddress *group,
2026
gboolean source_specific,
2027
const gchar *interface,
2030
return g_socket_multicast_group_operation (socket, group, source_specific, interface, FALSE, error);
1456
2034
* g_socket_speaks_ipv4:
1457
2035
* @socket: a #GSocket