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; }
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); }