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); } }
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; } }
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(); }
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; }