public static unsafe SocketError GetMulticastOption(SafeCloseSocket handle, SocketOptionName optionName, out MulticastOption optionValue) { int optLevel, optName; GetPlatformOptionInfo(SocketOptionLevel.IP, optionName, out optLevel, out optName); var mreqn = new Interop.libc.ip_mreqn(); var optLen = (uint)sizeof(Interop.libc.ip_mreqn); int err = Interop.libc.getsockopt(handle.FileDescriptor, optLevel, optName, &mreqn, &optLen); if (err == -1) { optionValue = default(MulticastOption); return GetLastSocketError(); } var multicastAddress = new IPAddress((long)mreqn.imr_multiaddr.s_addr); var multicastInterface = new IPAddress((long)mreqn.imr_address.s_addr); optionValue = new MulticastOption(multicastAddress, multicastInterface); return SocketError.Success; }
public static unsafe SocketError SetMulticastOption(SafeCloseSocket handle, SocketOptionName optionName, MulticastOption optionValue) { int optLevel, optName; GetPlatformOptionInfo(SocketOptionLevel.IP, optionName, out optLevel, out optName); var mreqn = new Interop.libc.ip_mreqn { imr_multiaddr = new Interop.libc.in_addr { s_addr = unchecked((uint)optionValue.Group.GetAddress()) } }; if (optionValue.LocalAddress != null) { mreqn.imr_address.s_addr = unchecked((uint)optionValue.LocalAddress.GetAddress()); } else { // TODO: what is the endianness of ipv6mr_ifindex? mreqn.imr_ifindex = optionValue.InterfaceIndex; } int err = Interop.libc.setsockopt(handle.FileDescriptor, optLevel, optName, &mreqn, (uint)sizeof(Interop.libc.ip_mreqn)); return err == -1 ? GetLastSocketError() : SocketError.Success; }