public static CriticalAllocHandleSocketAddressList FromAddressList(ICollection<IPAddress> addresses)
 {
     if (addresses == null)
     {
         throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("addresses");
     }
     int count = addresses.Count;
     CriticalAllocHandleSocketAddress[] addressArray = new CriticalAllocHandleSocketAddress[50];
     SocketAddressList structure = new SocketAddressList(new System.ServiceModel.Channels.SocketAddress[50], count);
     int index = 0;
     foreach (IPAddress address in addresses)
     {
         if (index == 50)
         {
             break;
         }
         addressArray[index] = CriticalAllocHandleSocketAddress.FromIPAddress(address);
         structure.Addresses[index].InitializeFromCriticalAllocHandleSocketAddress(addressArray[index]);
         index++;
     }
     CriticalAllocHandleSocketAddressList list2 = FromSize(Marshal.SizeOf(structure));
     list2.count = count;
     list2.socketHandles = addressArray;
     Marshal.StructureToPtr(structure, (IntPtr) list2, false);
     return list2;
 }
Exemplo n.º 2
0
        public ReadOnlyCollection <IPAddress> SortAddresses(ReadOnlyCollection <IPAddress> addresses)
        {
            ReadOnlyCollection <IPAddress> onlys = SocketAddressList.SortAddresses(this.ipv6Socket, this.listenAddress, addresses);

            if (this.listenAddress != null)
            {
                if (this.listenAddress.IsIPv6LinkLocal)
                {
                    foreach (IPAddress address in onlys)
                    {
                        if (address.IsIPv6LinkLocal)
                        {
                            address.ScopeId = this.listenAddress.ScopeId;
                        }
                    }
                    return(onlys);
                }
                if (!this.listenAddress.IsIPv6SiteLocal)
                {
                    return(onlys);
                }
                foreach (IPAddress address2 in onlys)
                {
                    if (address2.IsIPv6SiteLocal)
                    {
                        address2.ScopeId = this.listenAddress.ScopeId;
                    }
                }
            }
            return(onlys);
        }
        public static CriticalAllocHandleSocketAddressList FromAddressList(ICollection <IPAddress> addresses)
        {
            if (addresses == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("addresses");
            }
            int count = addresses.Count;

            CriticalAllocHandleSocketAddress[] addressArray = new CriticalAllocHandleSocketAddress[50];
            SocketAddressList structure = new SocketAddressList(new System.ServiceModel.Channels.SocketAddress[50], count);
            int index = 0;

            foreach (IPAddress address in addresses)
            {
                if (index == 50)
                {
                    break;
                }
                addressArray[index] = CriticalAllocHandleSocketAddress.FromIPAddress(address);
                structure.Addresses[index].InitializeFromCriticalAllocHandleSocketAddress(addressArray[index]);
                index++;
            }
            CriticalAllocHandleSocketAddressList list2 = FromSize(Marshal.SizeOf(structure));

            list2.count         = count;
            list2.socketHandles = addressArray;
            Marshal.StructureToPtr(structure, (IntPtr)list2, false);
            return(list2);
        }
Exemplo n.º 4
0
        // Sorts the collection of addresses using sort ioctl
        public ReadOnlyCollection <IPAddress> SortAddresses(ReadOnlyCollection <IPAddress> addresses)
        {
            ReadOnlyCollection <IPAddress> sortedAddresses = SocketAddressList.SortAddresses(this.ipv6Socket, listenAddress, addresses);

            // If listening on specific address, copy the scope ID that we're listing on for the
            // link and site local addresses in the sorted list (so that the connect will work)
            if (this.listenAddress != null)
            {
                if (this.listenAddress.IsIPv6LinkLocal)
                {
                    foreach (IPAddress address in sortedAddresses)
                    {
                        if (address.IsIPv6LinkLocal)
                        {
                            address.ScopeId = this.listenAddress.ScopeId;
                        }
                    }
                }
                else if (this.listenAddress.IsIPv6SiteLocal)
                {
                    foreach (IPAddress address in sortedAddresses)
                    {
                        if (address.IsIPv6SiteLocal)
                        {
                            address.ScopeId = this.listenAddress.ScopeId;
                        }
                    }
                }
            }
            return(sortedAddresses);
        }
        public static CriticalAllocHandleSocketAddressList FromAddressList(ICollection <IPAddress> addresses)
        {
            if (addresses == null)
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("addresses");
            }
            int count = addresses.Count;

            CriticalAllocHandleSocketAddress[] socketHandles = new CriticalAllocHandleSocketAddress[SocketAddressList.maxAddresses];
            SocketAddressList socketAddressList = new SocketAddressList(new SocketAddress[SocketAddressList.maxAddresses], count);
            int i = 0;

            foreach (IPAddress address in addresses)
            {
                if (i == SocketAddressList.maxAddresses)
                {
                    break;                                      // due to Marshalling fixed sized array of SocketAddresses.
                }
                socketHandles[i] = CriticalAllocHandleSocketAddress.FromIPAddress(address);
                socketAddressList.Addresses[i].InitializeFromCriticalAllocHandleSocketAddress(socketHandles[i]);
                ++i;
            }

            int size = Marshal.SizeOf(socketAddressList);
            CriticalAllocHandleSocketAddressList result = CriticalAllocHandleSocketAddressList.FromSize(size);

            result.count         = count;
            result.socketHandles = socketHandles;
            Marshal.StructureToPtr(socketAddressList, result, false);
            return(result);
        }
 public static CriticalAllocHandleSocketAddressList FromAddressCount(int count)
 {
     SocketAddressList structure = new SocketAddressList(new System.ServiceModel.Channels.SocketAddress[50], 0);
     CriticalAllocHandleSocketAddressList list2 = FromSize(Marshal.SizeOf(structure));
     list2.count = count;
     Marshal.StructureToPtr(structure, (IntPtr) list2, false);
     return list2;
 }
        public static CriticalAllocHandleSocketAddressList FromAddressCount(int count)
        {
            SocketAddressList structure = new SocketAddressList(new System.ServiceModel.Channels.SocketAddress[50], 0);
            CriticalAllocHandleSocketAddressList list2 = FromSize(Marshal.SizeOf(structure));

            list2.count = count;
            Marshal.StructureToPtr(structure, (IntPtr)list2, false);
            return(list2);
        }
        public static CriticalAllocHandleSocketAddressList FromAddressCount(int count)
        {
            SocketAddressList socketAddressList = new SocketAddressList(new SocketAddress[SocketAddressList.maxAddresses], 0);
            int size = Marshal.SizeOf(socketAddressList);
            CriticalAllocHandleSocketAddressList result = CriticalAllocHandleSocketAddressList.FromSize(size);

            result.count = count;
            Marshal.StructureToPtr(socketAddressList, result, false);
            return(result);
        }
        public ReadOnlyCollection <IPAddress> ToAddresses()
        {
            SocketAddressList list = (SocketAddressList)Marshal.PtrToStructure((IntPtr)this, typeof(SocketAddressList));

            IPAddress[] array = new IPAddress[list.Count];
            for (int i = 0; i < array.Length; i++)
            {
                if (list.Addresses[i].SockAddrLength != Marshal.SizeOf(typeof(System.ServiceModel.Channels.sockaddr_in6)))
                {
                    throw Fx.AssertAndThrow("sockAddressLength in SOCKET_ADDRESS expected to be valid");
                }
                array[i] = ((System.ServiceModel.Channels.sockaddr_in6)Marshal.PtrToStructure(list.Addresses[i].SockAddr, typeof(System.ServiceModel.Channels.sockaddr_in6))).ToIPAddress();
            }
            return(Array.AsReadOnly <IPAddress>(array));
        }
        public ReadOnlyCollection <IPAddress> ToAddresses()
        {
            SocketAddressList socketAddressList = (SocketAddressList)Marshal.PtrToStructure(this, typeof(SocketAddressList));

            IPAddress[] addresses = new IPAddress[socketAddressList.Count];
            for (int i = 0; i < addresses.Length; i++)
            {
                if (!(socketAddressList.Addresses[i].SockAddrLength == Marshal.SizeOf(typeof(sockaddr_in6))))
                {
                    throw Fx.AssertAndThrow("sockAddressLength in SOCKET_ADDRESS expected to be valid");
                }
                sockaddr_in6 sockAddr = (sockaddr_in6)Marshal.PtrToStructure(socketAddressList.Addresses[i].SockAddr, typeof(sockaddr_in6));
                addresses[i] = sockAddr.ToIPAddress();
            }

            return(Array.AsReadOnly <IPAddress>(addresses));
        }