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);
        }
        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 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 static ReadOnlyCollection <IPAddress> SortAddresses(Socket socket, IPAddress listenAddress, ReadOnlyCollection <IPAddress> addresses)
        {
            ReadOnlyCollection <IPAddress> sortedAddresses = null;

            // Skip sort if ipv6 isn't installed or if address array has a single address
            if (socket == null || addresses.Count <= 1)
            {
                sortedAddresses = addresses;
            }
            else
            {
                CriticalAllocHandleSocketAddressList inputBuffer  = null;
                CriticalAllocHandleSocketAddressList outputBuffer = null;
                try
                {
                    inputBuffer  = CriticalAllocHandleSocketAddressList.FromAddressList(addresses);
                    outputBuffer = CriticalAllocHandleSocketAddressList.FromAddressCount(0);
                    // Invoke ioctl to sort the addresses
                    int realOutputBufferSize;
                    int error     = UnsafeNativeMethods.ERROR_SUCCESS;
                    int errorCode = PeerWinsock.WSAIoctl(socket.Handle,
                                                         unchecked ((int)IOControlCode.AddressListSort),
                                                         (IntPtr)inputBuffer,
                                                         inputBuffer.Size,
                                                         (IntPtr)outputBuffer,
                                                         outputBuffer.Size,
                                                         out realOutputBufferSize,
                                                         IntPtr.Zero,
                                                         IntPtr.Zero);
                    if (errorCode == -1)
                    {
                        // Get the Win32 error code before doing anything else
                        error = Marshal.GetLastWin32Error();
                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SocketException(error));
                    }

                    // Marshal the sorted SOCKET_ADDRESS_LIST into IPAddresses
                    sortedAddresses = outputBuffer.ToAddresses();
                }
                finally
                {
                    if (inputBuffer != null)
                    {
                        inputBuffer.Dispose();
                    }
                    if (outputBuffer != null)
                    {
                        outputBuffer.Dispose();
                    }
                }
            }
            return(sortedAddresses);
        }
        static new CriticalAllocHandleSocketAddressList FromSize(int size)
        {
            CriticalAllocHandleSocketAddressList result = new CriticalAllocHandleSocketAddressList();

            RuntimeHelpers.PrepareConstrainedRegions();
            try { }
            finally
            {
                result.SetHandle(Marshal.AllocHGlobal(size));
                result.size = size;
            }
            return(result);
        }
 private static CriticalAllocHandleSocketAddressList FromSize(int size)
 {
     CriticalAllocHandleSocketAddressList list = new CriticalAllocHandleSocketAddressList();
     RuntimeHelpers.PrepareConstrainedRegions();
     try
     {
     }
     finally
     {
         list.SetHandle(Marshal.AllocHGlobal(size));
         list.size = size;
     }
     return list;
 }
Esempio n. 8
0
        public static ReadOnlyCollection <IPAddress> SortAddresses(Socket socket, IPAddress listenAddress, ReadOnlyCollection <IPAddress> addresses)
        {
            ReadOnlyCollection <IPAddress> onlys = null;

            if ((socket == null) || (addresses.Count <= 1))
            {
                return(addresses);
            }
            CriticalAllocHandleSocketAddressList list  = null;
            CriticalAllocHandleSocketAddressList list2 = null;

            try
            {
                int num;
                list  = CriticalAllocHandleSocketAddressList.FromAddressList(addresses);
                list2 = CriticalAllocHandleSocketAddressList.FromAddressCount(0);
                int errorCode = 0;
                if (PeerWinsock.WSAIoctl(socket.Handle, -939524071, (IntPtr)list, list.Size, (IntPtr)list2, list2.Size, out num, IntPtr.Zero, IntPtr.Zero) == -1)
                {
                    errorCode = Marshal.GetLastWin32Error();
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SocketException(errorCode));
                }
                onlys = list2.ToAddresses();
            }
            finally
            {
                if (list != null)
                {
                    list.Dispose();
                }
                if (list2 != null)
                {
                    list2.Dispose();
                }
            }
            return(onlys);
        }