Пример #1
0
        internal static async Task <EndPoint> ReadEndPointAsync(Stream s)
        {
            byte[] buffer = new byte[2];

            await s.ReadBytesAsync(buffer, 0, 1);

            SocksAddressType addressType = (SocksAddressType)buffer[0];

            switch (addressType)
            {
            case SocksAddressType.IPv4Address:
            {
                byte[] addressBytes = new byte[4];
                await s.ReadBytesAsync(addressBytes, 0, 4);

                await s.ReadBytesAsync(buffer, 0, 2);

                Array.Reverse(buffer, 0, 2);

                return(new IPEndPoint(new IPAddress(addressBytes), BitConverter.ToUInt16(buffer, 0)));
            }

            case SocksAddressType.IPv6Address:
            {
                byte[] addressBytes = new byte[16];
                await s.ReadBytesAsync(addressBytes, 0, 16);

                await s.ReadBytesAsync(buffer, 0, 2);

                Array.Reverse(buffer, 0, 2);

                return(new IPEndPoint(new IPAddress(addressBytes), BitConverter.ToUInt16(buffer, 0)));
            }

            case SocksAddressType.DomainName:
            {
                await s.ReadBytesAsync(buffer, 0, 1);

                byte[] addressBytes = new byte[buffer[0]];
                await s.ReadBytesAsync(addressBytes, 0, addressBytes.Length);

                string domain = Encoding.ASCII.GetString(addressBytes);

                await s.ReadBytesAsync(buffer, 0, 2);

                Array.Reverse(buffer, 0, 2);

                return(new DomainEndPoint(domain, BitConverter.ToUInt16(buffer, 0)));
            }

            default:
                return(null);
            }
        }
Пример #2
0
        public SocksEndPoint(byte[] buffer, int offset)
        {
            _type = (SocksAddressType)buffer[offset];

            switch (_type)
            {
            case SocksAddressType.IPv4Address:
            {
                _address = new byte[4];
                Buffer.BlockCopy(buffer, offset + 1, _address, 0, 4);

                byte[] port = new byte[2];
                Buffer.BlockCopy(buffer, offset + 1 + 4, port, 0, 2);
                Array.Reverse(port);
                _port = BitConverter.ToUInt16(port, 0);

                _addressString = (new IPAddress(_address)).ToString();
            }
            break;

            case SocksAddressType.DomainName:
            {
                byte length = buffer[offset + 1];

                _address    = new byte[length];
                _address[0] = length;

                Buffer.BlockCopy(buffer, offset + 1 + 1, _address, 1, length);

                byte[] port = new byte[2];
                Buffer.BlockCopy(buffer, offset + 1 + 1 + length, port, 0, 2);
                Array.Reverse(port);
                _port = BitConverter.ToUInt16(port, 0);

                _addressString = Encoding.ASCII.GetString(_address);
            }
            break;

            case SocksAddressType.IPv6Address:
            {
                _address = new byte[16];
                Buffer.BlockCopy(buffer, offset + 1, _address, 0, 16);

                byte[] port = new byte[2];
                Buffer.BlockCopy(buffer, offset + 1 + 16, port, 0, 2);
                Array.Reverse(port);
                _port = BitConverter.ToUInt16(port, 0);

                _addressString = (new IPAddress(_address)).ToString();
            }
            break;
            }
        }
Пример #3
0
        private void ParseIPAddress(IPAddress address)
        {
            switch (address.AddressFamily)
            {
            case AddressFamily.InterNetwork:
                _type = SocksAddressType.IPv4Address;
                break;

            case AddressFamily.InterNetworkV6:
                _type = SocksAddressType.IPv6Address;
                break;

            default:
                throw new NotSupportedException("Address family not supported.");
            }

            _address = address.GetAddressBytes();
        }
Пример #4
0
        public SocksEndPoint(string address, int port)
        {
            IPAddress ip;

            if (IPAddress.TryParse(address, out ip))
            {
                ParseIPAddress(ip);
            }
            else
            {
                _type = SocksAddressType.DomainName;

                byte[] addrBytes = Encoding.ASCII.GetBytes(address);
                _address = new byte[addrBytes.Length + 1];

                _address[0] = Convert.ToByte(addrBytes.Length);
                Buffer.BlockCopy(addrBytes, 0, _address, 1, addrBytes.Length);
            }

            _port          = Convert.ToUInt16(port);
            _addressString = address;
        }