public unsafe void LeaveMulticastGroup(IPAddress groupAdress, uint interfaceIndex = 0)
        {
            var adress = groupAdress.GetAddressBytes();

            if (groupAdress.AddressFamily == AddressFamily.InterNetwork)
            {
                ip_mreq value = new ip_mreq();
                value.imr_interface.s_b4 = (byte)interfaceIndex;

                fixed(byte *a = adress)
                Unsafe.CopyBlock(value.imr_multiaddr.Address, a, (uint)adress.Length);

                if (SetSocketOption(IPPROTO_IP_SocketOptions.IP_DROP_MEMBERSHIP, (void *)&value, Marshal.SizeOf <ip_mreq>()) != 0)
                {
                    WinSock.ThrowLastWSAError();
                }
            }
            else if (groupAdress.AddressFamily == AddressFamily.InterNetworkV6)
            {
                ipv6_mreq value = new ipv6_mreq();
                value.ipv6mr_interface = interfaceIndex;

                fixed(byte *a = adress)
                Unsafe.CopyBlock(value.ipv6mr_multiaddr.Address, a, (uint)adress.Length);

                if (SetSocketOption(IPPROTO_IPV6_SocketOptions.IPV6_DROP_MEMBERSHIP, (void *)&value, Marshal.SizeOf <ipv6_mreq>()) != 0)
                {
                    WinSock.ThrowLastWSAError();
                }
            }
        }
        //public unsafe void JoinMulticastGroup(IPAddress groupAdress, uint interfaceIndex = 0)
        //{
        //    group_req value = new group_req();
        //    value.gr_interface = interfaceIndex;
        //    var adress = groupAdress.GetAddressBytes();
        //    fixed (byte* a = adress)
        //        Unsafe.CopyBlock(value.gr_group.padding1, a, (uint)adress.Length);
        //    if (groupAdress.AddressFamily == AddressFamily.InterNetwork)
        //        value.gr_group.AdressFamily = ADDRESS_FAMILIES.AF_INET;
        //    else if (groupAdress.AddressFamily == AddressFamily.InterNetwork)
        //        value.gr_group.AdressFamily = ADDRESS_FAMILIES.AF_INET6;
        //    var res = SetSocketOption(MCAST_SocketOptions.MCAST_JOIN_GROUP, (void*)&value, Marshal.SizeOf<group_req>());
        //    WinSock.ThrowLastWSAError();
        //}
        public unsafe void JoinMulticastGroup(IPAddress groupAdress, uint interfaceIndex = 0)
        {
            var adress = groupAdress.GetAddressBytes();
            if (groupAdress.AddressFamily == AddressFamily.InterNetwork)
            {
                ip_mreq value = new ip_mreq();
                value.imr_interface.s_b4 = (byte)interfaceIndex;
                fixed (byte* a = adress)
                    Unsafe.CopyBlock(value.imr_multiaddr.Address, a, (uint)adress.Length);

                if (SetSocketOption(IPPROTO_IP_SocketOptions.IP_ADD_MEMBERSHIP, (void*)&value, Marshal.SizeOf<ip_mreq>()) != 0)
                    WinSock.ThrowLastWSAError();
            }
            else if (groupAdress.AddressFamily == AddressFamily.InterNetworkV6)
            {
                ipv6_mreq value = new ipv6_mreq();
                value.ipv6mr_interface = interfaceIndex;
                fixed (byte* a = adress)
                    Unsafe.CopyBlock(value.ipv6mr_multiaddr.Address, a, (uint)adress.Length);

                if (SetSocketOption(IPPROTO_IPV6_SocketOptions.IPV6_ADD_MEMBERSHIP, (void*)&value, Marshal.SizeOf<ipv6_mreq>()) != 0)
                    WinSock.ThrowLastWSAError();
            }
        }