public static SocketError GetMulticastOption(SafeSocketHandle handle, SocketOptionName optionName, out MulticastOption?optionValue) { Interop.Winsock.IPMulticastRequest ipmr = default; int optlen = Interop.Winsock.IPMulticastRequest.Size; // This can throw ObjectDisposedException. SocketError errorCode = Interop.Winsock.getsockopt( handle, SocketOptionLevel.IP, optionName, out ipmr, ref optlen); if (errorCode == SocketError.SocketError) { optionValue = default(MulticastOption); return(GetLastSocketError()); } #if BIGENDIAN ipmr.MulticastAddress = BinaryPrimitives.ReverseEndianness(ipmr.MulticastAddress); ipmr.InterfaceAddress = BinaryPrimitives.ReverseEndianness(ipmr.InterfaceAddress); #endif // BIGENDIAN IPAddress multicastAddr = new IPAddress(ipmr.MulticastAddress); IPAddress multicastIntr = new IPAddress(ipmr.InterfaceAddress); optionValue = new MulticastOption(multicastAddr, multicastIntr); return(SocketError.Success); }
public static SocketError SetMulticastOption(SafeCloseSocket handle, SocketOptionName optionName, MulticastOption optionValue) { Interop.Winsock.IPMulticastRequest ipmr = new Interop.Winsock.IPMulticastRequest(); #pragma warning disable CS0618 // Address is marked obsolete ipmr.MulticastAddress = unchecked ((int)optionValue.Group.Address); #pragma warning restore CS0618 if (optionValue.LocalAddress != null) { #pragma warning disable CS0618 // Address is marked obsolete ipmr.InterfaceAddress = unchecked ((int)optionValue.LocalAddress.Address); #pragma warning restore CS0618 } else { //this structure works w/ interfaces as well int ifIndex = IPAddress.HostToNetworkOrder(optionValue.InterfaceIndex); ipmr.InterfaceAddress = unchecked ((int)ifIndex); } #if BIGENDIAN ipmr.MulticastAddress = (int)(((uint)ipmr.MulticastAddress << 24) | (((uint)ipmr.MulticastAddress & 0x0000FF00) << 8) | (((uint)ipmr.MulticastAddress >> 8) & 0x0000FF00) | ((uint)ipmr.MulticastAddress >> 24)); if (optionValue.LocalAddress != null) { ipmr.InterfaceAddress = (int)(((uint)ipmr.InterfaceAddress << 24) | (((uint)ipmr.InterfaceAddress & 0x0000FF00) << 8) | (((uint)ipmr.InterfaceAddress >> 8) & 0x0000FF00) | ((uint)ipmr.InterfaceAddress >> 24)); } #endif // This can throw ObjectDisposedException. SocketError errorCode = Interop.Winsock.setsockopt( handle, SocketOptionLevel.IP, optionName, ref ipmr, Interop.Winsock.IPMulticastRequest.Size); return(errorCode == SocketError.SocketError ? GetLastSocketError() : SocketError.Success); }
public static SocketError GetMulticastOption(SafeCloseSocket handle, SocketOptionName optionName, out MulticastOption optionValue) { Interop.Winsock.IPMulticastRequest ipmr = new Interop.Winsock.IPMulticastRequest(); int optlen = Interop.Winsock.IPMulticastRequest.Size; // This can throw ObjectDisposedException. SocketError errorCode = Interop.Winsock.getsockopt( handle, SocketOptionLevel.IP, optionName, out ipmr, ref optlen); if (errorCode == SocketError.SocketError) { optionValue = default(MulticastOption); return(GetLastSocketError()); } #if BIGENDIAN ipmr.MulticastAddress = (int)(((uint)ipmr.MulticastAddress << 24) | (((uint)ipmr.MulticastAddress & 0x0000FF00) << 8) | (((uint)ipmr.MulticastAddress >> 8) & 0x0000FF00) | ((uint)ipmr.MulticastAddress >> 24)); ipmr.InterfaceAddress = (int)(((uint)ipmr.InterfaceAddress << 24) | (((uint)ipmr.InterfaceAddress & 0x0000FF00) << 8) | (((uint)ipmr.InterfaceAddress >> 8) & 0x0000FF00) | ((uint)ipmr.InterfaceAddress >> 24)); #endif // BIGENDIAN IPAddress multicastAddr = new IPAddress(ipmr.MulticastAddress); IPAddress multicastIntr = new IPAddress(ipmr.InterfaceAddress); optionValue = new MulticastOption(multicastAddr, multicastIntr); return(SocketError.Success); }
public static SocketError GetMulticastOption(SafeCloseSocket handle, SocketOptionName optionName, out MulticastOption optionValue) { Interop.Winsock.IPMulticastRequest ipmr = new Interop.Winsock.IPMulticastRequest(); int optlen = Interop.Winsock.IPMulticastRequest.Size; // This can throw ObjectDisposedException. SocketError errorCode = Interop.Winsock.getsockopt( handle, SocketOptionLevel.IP, optionName, out ipmr, ref optlen); if (errorCode == SocketError.SocketError) { optionValue = default(MulticastOption); return GetLastSocketError(); } #if BIGENDIAN ipmr.MulticastAddress = (int) (((uint) ipmr.MulticastAddress << 24) | (((uint) ipmr.MulticastAddress & 0x0000FF00) << 8) | (((uint) ipmr.MulticastAddress >> 8) & 0x0000FF00) | ((uint) ipmr.MulticastAddress >> 24)); ipmr.InterfaceAddress = (int) (((uint) ipmr.InterfaceAddress << 24) | (((uint) ipmr.InterfaceAddress & 0x0000FF00) << 8) | (((uint) ipmr.InterfaceAddress >> 8) & 0x0000FF00) | ((uint) ipmr.InterfaceAddress >> 24)); #endif // BIGENDIAN IPAddress multicastAddr = new IPAddress(ipmr.MulticastAddress); IPAddress multicastIntr = new IPAddress(ipmr.InterfaceAddress); optionValue = new MulticastOption(multicastAddr, multicastIntr); return SocketError.Success; }
public static SocketError SetMulticastOption(SafeCloseSocket handle, SocketOptionName optionName, MulticastOption optionValue) { Interop.Winsock.IPMulticastRequest ipmr = new Interop.Winsock.IPMulticastRequest(); ipmr.MulticastAddress = unchecked((int)optionValue.Group.GetAddress()); if (optionValue.LocalAddress != null) { ipmr.InterfaceAddress = unchecked((int)optionValue.LocalAddress.GetAddress()); } else { //this structure works w/ interfaces as well int ifIndex = IPAddress.HostToNetworkOrder(optionValue.InterfaceIndex); ipmr.InterfaceAddress = unchecked((int)ifIndex); } #if BIGENDIAN ipmr.MulticastAddress = (int) (((uint) ipmr.MulticastAddress << 24) | (((uint) ipmr.MulticastAddress & 0x0000FF00) << 8) | (((uint) ipmr.MulticastAddress >> 8) & 0x0000FF00) | ((uint) ipmr.MulticastAddress >> 24)); if (optionValue.LocalAddress != null) { ipmr.InterfaceAddress = (int) (((uint) ipmr.InterfaceAddress << 24) | (((uint) ipmr.InterfaceAddress & 0x0000FF00) << 8) | (((uint) ipmr.InterfaceAddress >> 8) & 0x0000FF00) | ((uint) ipmr.InterfaceAddress >> 24)); } #endif // This can throw ObjectDisposedException. SocketError errorCode = Interop.Winsock.setsockopt( handle, SocketOptionLevel.IP, optionName, ref ipmr, Interop.Winsock.IPMulticastRequest.Size); return errorCode == SocketError.SocketError ? GetLastSocketError() : SocketError.Success; }