public async ValueTask WriteAsync(ReadOnlyMemory <byte> buffer) { var packData = UdpPackData.Parse(buffer); if (!_addressMap.TryGetValue(packData.Remote, out var endPoint)) { if (IPAddress.TryParse(packData.Remote.Address, out var address)) { endPoint = new IPEndPoint(address, packData.Remote.Port); } else { foreach (var addr in await Dns.GetHostAddressesAsync(packData.Remote.Address)) { if (addr.AddressFamily == AddressFamily.InterNetwork) { address = addr; break; } } endPoint = new IPEndPoint(address, packData.Remote.Port); } _addressMap.TryAdd(packData.Remote, endPoint); _endPointMap.TryAdd(endPoint, packData.Remote); } await _udp.SendAsync(packData.Data, packData.Data.Length, endPoint); lastRemote = packData.Remote; }
public static Socks5UdpRelayRequest Parse(byte[] buffer) { var result = new Socks5UdpRelayRequest { Frag = buffer[2], Data = UdpPackData.Parse(new ReadOnlyMemory <byte>(buffer, 3, buffer.Length - 3)) }; return(result); }