Beispiel #1
0
        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;
        }
Beispiel #2
0
        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);
        }