C # TcpClient.Connect a través de un proxy

He buscado alto y bajo tratando de resolver esto, pero todo lo que he visto hasta ahora, la gente me está diciendo que use otros métodos.

Con eso fuera del camino, mi problema es que estoy tratando de conectarme a un servidor a través de un TcpClient usando un proxy socks 5

Mi configuración actual es:

Client = new TcpClient(); Client.Connect(EndPoint); NetworkStream = Client.GetStream(); Stream = new new BufferedStream(NetworkStream); Stream.Write...//Write Packet information etc 

No estoy seguro de haber omitido ninguna información, así que si la tengo, la actualizaré con mucho gusto.

Realmente no creo que .Net venga equipado con soporte Socks5 o TCP con proxy.

Hay un par de implementaciones de terceros (Google sabe más), por supuesto, pero también es bastante fácil de implementar (parte de) RFC 1928 .

Aquí hay un ejemplo de cliente Socks5 que acabo de hackear juntos. Realmente querrás limpiarlo: p. Simplemente realiza la negociación de autenticación, la configuración de la conexión y, finalmente, una simple solicitud de http.

 using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; namespace tcpsocks5 { static class Program { static void ReadAll(this NetworkStream stream, byte[] buffer, int offset, int size) { while (size != 0) { var read = stream.Read(buffer, offset, size); if (read < 0) { throw new IOException("Premature end"); } size -= read; offset += read; } } static void Main(string[] args) { using (var client = new TcpClient()) { client.Connect(ip, port); // Provide IP, Port yourself using (var stream = client.GetStream()) { // Auth var buf = new byte[300]; buf[0] = 0x05; // Version buf[1] = 0x01; // NMETHODS buf[2] = 0x00; // No auth-method stream.Write(buf, 0, 3); stream.ReadAll(buf, 0, 2); if (buf[0] != 0x05) { throw new IOException("Invalid Socks Version"); } if (buf[1] == 0xff) { throw new IOException("Socks Server does not support no-auth"); } if (buf[1] != 0x00) { throw new Exception("Socks Server did choose bogus auth"); } // Request buf[0] = 0x05; // Version buf[1] = 0x01; // Connect (TCP) buf[2] = 0x00; // Reserved buf[3] = 0x03; // Dest.Addr: Domain name var domain = Encoding.ASCII.GetBytes("google.com"); buf[4] = (byte)domain.Length; // Domain name length (octet) Array.Copy(domain, 0, buf, 5, domain.Length); var port = BitConverter.GetBytes( IPAddress.HostToNetworkOrder((short)80)); buf[5 + domain.Length] = port[0]; buf[6 + domain.Length] = port[1]; stream.Write(buf, 0, domain.Length + 7); // Reply stream.ReadAll(buf, 0, 4); if (buf[0] != 0x05) { throw new IOException("Invalid Socks Version"); } if (buf[1] != 0x00) { throw new IOException(string.Format("Socks Error {0:X}", buf[1])); } var rdest = string.Empty; switch (buf[3]) { case 0x01: // IPv4 stream.ReadAll(buf, 0, 4); var v4 = BitConverter.ToUInt32(buf, 0); rdest = new IPAddress(v4).ToString(); break; case 0x03: // Domain name stream.ReadAll(buf, 0, 1); if (buf[0] == 0xff) { throw new IOException("Invalid Domain Name"); } stream.ReadAll(buf, 1, buf[0]); rdest = Encoding.ASCII.GetString(buf, 1, buf[0]); break; case 0x04: // IPv6 var octets = new byte[16]; stream.ReadAll(octets, 0, 16); rdest = new IPAddress(octets).ToString(); break; default: throw new IOException("Invalid Address type"); } stream.ReadAll(buf, 0, 2); var rport = (ushort)IPAddress.NetworkToHostOrder((short)BitConverter.ToUInt16(buf, 0)); Console.WriteLine("Connected via {0}:{1}", rdest, rport); // Make an HTTP request, aka. "do stuff ..." using (var writer = new StreamWriter(stream)) { writer.Write("GET / HTTP/1.1\r\nHost: google.com\r\n\r\n"); writer.Flush(); using (var reader = new StreamReader(stream)) { while (true) { var line = reader.ReadLine(); if (string.IsNullOrEmpty(line)) { break; } } } } } } } } } 

Yo uso starksoft-aspen . Es gratis y de código abierto.

En el siguiente ejemplo, el TcpClient se inicializó con el método “CreateConnection ()”, pero también puede inicializar el cliente por sí mismo, así como hacerlo todo de forma asíncrona.

 using Starksoft.Aspen.Proxy; Socks5ProxyClient proxyClient = new Socks5ProxyClient( socks5Proxy.Host, socks5Proxy.Port, socks5Proxy.Username, socks5Proxy.Password); TcpClient client = proxyClient.CreateConnection(destination.Host, destination.Port); NetworkStream stream = client.GetStream();