public static CriticalAllocHandleSocketAddress FromIPAddress(IPAddress input) { if (input == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("input"); } CriticalAllocHandleSocketAddress result = null; int size = Marshal.SizeOf(typeof(sockaddr_in6)); result = CriticalAllocHandleSocketAddress.FromSize(size); sockaddr_in6 sa = new sockaddr_in6(input); Marshal.StructureToPtr(sa, (IntPtr)result, false); return(result); }
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)); }
public static SOCKET_ADDRESS_SAFE SocketAddressFromIPEndPoint(IPEndPoint endpoint) { SOCKET_ADDRESS_SAFE socketAddress = new SOCKET_ADDRESS_SAFE(); if (endpoint == null) return socketAddress; if (endpoint.AddressFamily == AddressFamily.InterNetwork) { socketAddress.iSockaddrLength = Marshal.SizeOf(typeof(sockaddr_in)); socketAddress.lpSockAddr = CriticalAllocHandle.FromSize(socketAddress.iSockaddrLength); sockaddr_in sa = new sockaddr_in(); sa.sin_family = (short)AddressFamily.InterNetwork; sa.sin_port = (ushort)endpoint.Port; sa.sin_addr = endpoint.Address.GetAddressBytes(); Marshal.StructureToPtr(sa, (IntPtr)socketAddress.lpSockAddr, false); } else if (endpoint.AddressFamily == AddressFamily.InterNetworkV6) { socketAddress.iSockaddrLength = Marshal.SizeOf(typeof(sockaddr_in6)); socketAddress.lpSockAddr = CriticalAllocHandle.FromSize(socketAddress.iSockaddrLength); sockaddr_in6 sa = new sockaddr_in6(); sa.sin6_family = (short)AddressFamily.InterNetworkV6; sa.sin6_port = (ushort)endpoint.Port; sa.sin6_addr = endpoint.Address.GetAddressBytes(); sa.sin6_scope_id = (uint)endpoint.Address.ScopeId; Marshal.StructureToPtr(sa, (IntPtr)socketAddress.lpSockAddr, false); } return socketAddress; }