Ejemplo n.º 1
0
        void JoinGroupV6(IPAddress group, uint ifindex)
        {
            System.Diagnostics.Debug.Assert(_socket.Handle != IntPtr.Zero);
            System.Diagnostics.Debug.Assert(group.AddressFamily == AddressFamily.InterNetworkV6);
            System.Diagnostics.Debug.Assert(ifindex != 0);

            if (_localIp == IPAddress.IPv6Any)
            {
                return;
            }

            IntPtr ptr = new IntPtr(ifindex);

            ipv6_mreq mr = new ipv6_mreq()
            {
                ipv6mr_multiaddr = group.GetAddressBytes(),
                ipv6mr_interface = ptr
            };

            int ret = setsockopt(_socket.Handle.ToInt32(), IPPROTO_IPV6, IPV6_JOIN_GROUP, ref mr, Marshal.SizeOf(mr));

            if (ret != 0)
            {
                throw new PeachException("Error, failed to join group '{0}' on interface '{1}', error {2}.".Fmt(group, _iface, ret));
            }

            ret = setsockopt(_socket.Handle.ToInt32(), IPPROTO_IPV6, IPV6_MULTICAST_IF, ref ptr, Marshal.SizeOf(typeof(IntPtr)));
            if (ret != 0)
            {
                throw new PeachException("Error, failed to set outgoing interface to '{1}' for group '{0}', error {2}.".Fmt(group, _iface, ret));
            }
        }
Ejemplo n.º 2
0
 static extern int setsockopt(int socket, int level, int optname, ref ipv6_mreq opt, int optlen);