C# socks5代理

9-06 1,589 views

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace TyphoonSocksClientCsharp
{
    class Socks5ProxyDemo
    {
        public static void func()
        {
            // 首先与本地 socks代理 建立连接
            var proxyAddr = "127.0.0.1:3000";
            var proxyIp = proxyAddr.Split(':')[0];
            var proxyPort = int.Parse(proxyAddr.Split(':')[1]);
            var client = new TcpClient(proxyIp, proxyPort);

            Console.WriteLine("Connected to proxy: {0} at port: {1}", proxyIp, proxyPort);

            // // socks5相关协议,@see http://www.faqs.org/rfcs/rfc1928.html
            var connection = client.GetStream();
            var writer = new BinaryWriter(connection);
            var reader = new BinaryReader(connection);
            writer.Write(new byte[] { 0x05, 0x01, 0x00 });
            var response = reader.ReadBytes(2);

            if (response[1] != 0x00)
                throw new WebException("Proxy doesn't support connection without authentication.");

            writer.Write(new byte[] { 0x05, 0x01, 0x00, 0x01 });    

            // socks5代理建立完成
            // 开始访问真正的目的服务器
            var ip = "115.29.53.33";
            foreach (var part in ip.Split('.'))
                writer.Write(byte.Parse(part));

            var port = 80;
            writer.Write(IntToNetworkByteOrder(port));

            response = reader.ReadBytes(10);
            var errorCode = response[1];

            if (errorCode != 0)
                throw new WebException("Connection to proxy failed. Errorcode " + errorCode);

            // 通过socks5代理连接访问目的主机成功
            Console.WriteLine("Connected to target over proxy.");
        }

        private static byte[] IntToNetworkByteOrder(int port)
        {
            var hb = port / 256;
            var lb = port % 256;
            return new byte[] { (byte)hb, (byte)lb };
        }
    }
}
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;
                }
              }
            }
          }
        }
      }
    }
  }
}

C# 调用 C++ DLL 回调函数

C++ library library.h #ifndef __LIBRARY_H__ #define __LIBRARY_H__ //exports.def #ifdef __cplusplus //__cplusplus是cpp中自定义的一个宏 extern...

阅读全文

1 条评论

  1. Мы предоставляем очень качественные услуги прокси-серверов пакетами. Вам требуется неизменный частный прокси для работы в Instagram, Вконтакте,Однокласниках или Авито? Вы интересуетесь букмекерскими ставками или покером? SEO,SMM, просто безопасный серфинг или другие цели? В том случае вы по нужному адресу.

    Мы готовы предоставить анонимные, элитные, прокси-сервера с надежной круглосуточной поддержкой. Все наши прокси могут применяться для любых программ,сервисов, социальных сетей, онлайн игр и не только. Авторизация по логин – паролю или IP адресу.

    Быстрые прокси ipv4 и ipv6 (до 100 мбит/с) обеспечат стабильную работу. Необходимы разные подсети, у нас их достаточно. Так же вы можете выбрать тип протокола HTTP/SOCKS.

    купить качественные прокси

欢迎留言