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 Socks5Request FormBytes(byte[] buffer) { var request = new Socks5Request { Version = buffer[0], Command = buffer[1], RSV = buffer[2], }; request.Remote = SocksRemote.Parse(new Memory <byte>(buffer, 3, buffer.Length - 3), out var left); return(request); }