示例#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;
        }
示例#2
0
        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);
        }