2021-03-24 17:43:23 +00:00
|
|
|
|
using Ryujinx.Common.Memory;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Net;
|
|
|
|
|
using System.Net.Sockets;
|
2022-01-12 16:43:00 +00:00
|
|
|
|
using System.Runtime.CompilerServices;
|
2021-03-24 17:43:23 +00:00
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
|
|
|
|
|
namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres.Types
|
|
|
|
|
{
|
|
|
|
|
[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 0x10)]
|
|
|
|
|
struct AddrInfo4
|
|
|
|
|
{
|
|
|
|
|
public byte Length;
|
|
|
|
|
public byte Family;
|
|
|
|
|
public short Port;
|
|
|
|
|
public Array4<byte> Address;
|
|
|
|
|
|
|
|
|
|
public AddrInfo4(IPAddress address, short port)
|
|
|
|
|
{
|
2022-01-12 16:43:00 +00:00
|
|
|
|
Length = (byte)Unsafe.SizeOf<Array4<byte>>();
|
2021-03-24 17:43:23 +00:00
|
|
|
|
Family = (byte)AddressFamily.InterNetwork;
|
|
|
|
|
Port = port;
|
2022-01-12 16:43:00 +00:00
|
|
|
|
Address = new Array4<byte>();
|
2021-03-24 17:43:23 +00:00
|
|
|
|
|
2022-08-11 21:07:37 +00:00
|
|
|
|
address.TryWriteBytes(Address.AsSpan(), out _);
|
2022-01-12 16:43:00 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void ToNetworkOrder()
|
|
|
|
|
{
|
|
|
|
|
Port = IPAddress.HostToNetworkOrder(Port);
|
|
|
|
|
|
|
|
|
|
RawIpv4AddressNetworkEndianSwap(ref Address);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void ToHostOrder()
|
|
|
|
|
{
|
|
|
|
|
Port = IPAddress.NetworkToHostOrder(Port);
|
|
|
|
|
|
|
|
|
|
RawIpv4AddressNetworkEndianSwap(ref Address);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void RawIpv4AddressNetworkEndianSwap(ref Array4<byte> address)
|
|
|
|
|
{
|
|
|
|
|
if (BitConverter.IsLittleEndian)
|
|
|
|
|
{
|
2022-08-11 21:07:37 +00:00
|
|
|
|
address.AsSpan().Reverse();
|
2022-01-12 16:43:00 +00:00
|
|
|
|
}
|
2021-03-24 17:43:23 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|