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)); } }
static extern int setsockopt(int socket, int level, int optname, ref ipv6_mreq opt, int optlen);