/// <summary> /// Performs the specified SOCKS5 request. /// </summary> /// <param name="request">The SOCKS5 request to issue to the server.</param> /// <returns>The SOCKS5 reply sent by the server.</returns> /// <exception cref="ArgumentNullException">The request parameter is /// null.</exception> /// <exception cref="ObjectDisposedException">The object has been /// disposed.</exception> /// <exception cref="Socks5Exception">The request could not be performed. /// Consult the InnerException property of the Socks5Exception to learn /// the reason.</exception> public SocksReply Request(SocksRequest request) { request.ThrowIfNull("request"); AssertValid(); try { byte[] bytes = request.Serialize(); stream.Write(bytes, 0, bytes.Length); ByteBuilder b = new ByteBuilder(); using (var r = new BinaryReader(stream, Encoding.UTF8, true)) { bytes = r.ReadBytes(4); b.Append(bytes); ATyp atyp = (ATyp)bytes[3]; switch (atyp) { case ATyp.IPv4: case ATyp.IPv6: b.Append(r.ReadBytes(atyp == ATyp.IPv4 ? 4 : 16)); break; case ATyp.Domain: byte length = r.ReadByte(); b.Append(length).Append(r.ReadBytes(length)); break; } b.Append(r.ReadBytes(2)); } return(SocksReply.Deserialize(b.ToArray())); } catch (Exception e) { throw new Socks5Exception("The request could not be performed.", e); } }
/// <summary> /// Waits until the connected client sends a SOCKS5 request. /// </summary> /// <returns>The SOCKS5 request sent by the client.</returns> /// <exception cref="Socks5Exception">The data sent by the client /// is not a valid SOCKS5 request.</exception> private SocksRequest WaitForRequest() { ByteBuilder b = new ByteBuilder(); using (var r = new BinaryReader(stream, Encoding.UTF8, true)) { byte[] bytes = r.ReadBytes(4); b.Append(bytes); ATyp atyp = (ATyp)bytes[3]; switch (atyp) { case ATyp.IPv4: case ATyp.IPv6: b.Append(r.ReadBytes(atyp == ATyp.IPv4 ? 4 : 16)); break; case ATyp.Domain: byte length = r.ReadByte(); b.Append(length).Append(r.ReadBytes(length)); break; } b.Append(r.ReadBytes(2)); } try { return(SocksRequest.Deserialize(b.ToArray())); } catch (Exception e) { throw new Socks5Exception("The request could not be serialized.", e); } }
/// <summary> /// Deserializes a new instance of the SocksRequest class from the /// specified byte array. /// </summary> /// <param name="buffer">An array of bytes to deserialize a new instance /// of the SocksRequest class from.</param> /// <returns>An initialized instance of the SocksRequest class.</returns> /// <exception cref="ArgumentNullException">The buffer parameter is /// null.</exception> /// <exception cref="SerializationException">The specified buffer does /// not contain a valid SOCKS5 request message.</exception> public static SocksRequest Deserialize(byte[] buffer) { using (var ms = new MemoryStream(buffer)) { using (BinaryReader r = new BinaryReader(ms)) { if (r.ReadByte() != version) { throw new SerializationException("Invalid SOCKS5 request."); } SocksCommand command = (SocksCommand)r.ReadByte(); // Skip reserved octet. r.ReadByte(); ATyp atyp = (ATyp)r.ReadByte(); IPAddress addr = null; string domain = null; switch (atyp) { case ATyp.IPv4: case ATyp.IPv6: addr = new IPAddress(r.ReadBytes(atyp == ATyp.IPv4 ? 4 : 16)); break; case ATyp.Domain: byte len = r.ReadByte(); domain = Encoding.ASCII.GetString(r.ReadBytes(len)); break; } ushort port = r.ReadUInt16(true); if (atyp == ATyp.Domain) { return(new SocksRequest(command, domain, port)); } return(new SocksRequest(command, addr, port)); } } }
public SocksReply Request(SocksRequest request) { SocksReply reply; request.ThrowIfNull <SocksRequest>("request"); this.AssertValid(); try { byte[] buffer = request.Serialize(); this.stream.Write(buffer, 0, buffer.Length); ByteBuilder builder = new ByteBuilder(); BinaryReader reader = new BinaryReader(this.stream, Encoding.UTF8); buffer = reader.ReadBytes(4); builder.Append(buffer); ATyp typ = (ATyp)buffer[3]; switch (typ) { case ATyp.IPv4: case ATyp.IPv6: builder.Append(reader.ReadBytes((typ == ATyp.IPv4) ? 4 : 0x10)); break; case ATyp.Domain: { byte count = reader.ReadByte(); builder.Append(new byte[] { count }).Append(reader.ReadBytes(count)); break; } } builder.Append(reader.ReadBytes(2)); reply = SocksReply.Deserialize(builder.ToArray()); } catch (Exception exception) { CommonConfig.Logger.WriteError("The request could not be performed.", exception); throw new Socks5Exception("The request could not be performed.", exception); } return(reply); }
private SocksRequest WaitForRequest() { SocksRequest request; ByteBuilder builder = new ByteBuilder(); using (BinaryReader reader = new BinaryReader(this.stream, Encoding.UTF8)) { byte[] values = reader.ReadBytes(4); builder.Append(values); ATyp typ = (ATyp)values[3]; switch (typ) { case ATyp.IPv4: case ATyp.IPv6: builder.Append(reader.ReadBytes((typ == ATyp.IPv4) ? 4 : 0x10)); break; case ATyp.Domain: { byte count = reader.ReadByte(); builder.Append(new byte[] { count }).Append(reader.ReadBytes(count)); break; } } builder.Append(reader.ReadBytes(2)); } try { request = SocksRequest.Deserialize(builder.ToArray()); } catch (Exception exception) { throw new Socks5Exception("The request could not be serialized.", exception); } return(request); }