`
dalan_123
  • 浏览: 86742 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

关于C#使用socks5做代理

    博客分类:
  • C#
阅读更多

在实际使用的过程中可能存在使用代理访问其他网站,以防因过度频繁访问,自己ip被封,如下提供C#使用socks5的大致代码,个人可以根据实际情况进行封装、加工。切勿乱用保密

 public class LoadProxyHelper
    {
        private static readonly log4net.ILog _logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        // 默认使用array 可以根据自己的爱好调整
        private static string[] ipdatas = new string[20];
// 如下代理ip未必可用,请自行找寻(本次只是作为一个样本)
        private static string ipFormat = "x.x.x.{0}";
        static LoadProxyHelper()
        {
            // 给的是固定的ip
            for (int i = 0; i < ipdatas.Length; i++)
            {
                ipdatas[i] = string.Format(ipFormat , 19+i);
            }
        }

        public bool m_RequireAuthorize = false;
        public string m_user = string.Empty;
        public string m_pass = string.Empty;
        public byte[] bytes  = new byte[1024];

        /// <summary>
        /// 设定byte
        /// </summary>
        public byte[] RequireBytes
        {
            get { return bytes; }
            set { bytes = value; }
        }
        /// <summary>
        /// default is false
        /// </summary>
        public bool RequireAuthorize
        {
            get { return m_RequireAuthorize; }
            set { m_RequireAuthorize = value; }
        }
        public string Username
        {
            get { return m_pass; }
            set { m_pass = value; }
        }
        public string Password
        {
            get { return m_user; }
            set { m_user = value; }
        }

        private static string GetEncodType(string ContentType)
        {
            string strTemp = string.Empty;
            strTemp = ContentType;
            if (strTemp != null && strTemp.IndexOf("charset") > -1)
            {
                int index = strTemp.IndexOf("charset=") + 8;
                strTemp = strTemp.Substring(index, strTemp.Length - index);
                return strTemp;
            }
            return Encoding.Default.BodyName;
        }
        /// <summary>
        /// 获取请求返回的结果
        /// 注意包头中的每一个内容后面不能缺失“\r\n”
        /// 同时注意targetHost需要为域名 
        /// </summary>
        /// <returns></returns>
        public string GetSocketBytes(string targetHost,int targetPort,string request,string encode,string refer="")
        {
            try
            {
                string messages = string.Empty;
                int rl = 0;
                string sr = string.Empty;

                Random rand = new Random();
                string ip = ipdatas[rand.Next(0, 20)];
                Socket sRH = GetSocket(ip, 8080);
                ConnectProxyServer(targetHost, targetPort, sRH);
                SocketSend(request + "\r\n", sRH);
                SocketSend("Accept-Language:zh-CN,zh;q=0.8\r\n", sRH);
                SocketSend("Connection:close\r\n", sRH);
                SocketSend(string.Format("Host:{0}\r\n", targetHost), sRH);
                SocketSend("User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36\r\n", sRH);
                SocketSend("\r\n", sRH);

                rl = sRH.Receive(bytes);
               sr = Encoding.GetEncoding(GetEncodType(encode)).GetString(bytes, 0, rl);
                //sr = GetResponseByEncode(encode, rl);

                StringBuilder messDatas = new StringBuilder();

                while (sr.Length > 0)
                {
                    rl = sRH.Receive(bytes);
                    //sr = GetResponseByEncode(encode, rl);
                    sr = Encoding.GetEncoding(GetEncodType(encode)).GetString(bytes, 0, rl);
                    messDatas.Append(sr);
                    Console.WriteLine(sr);
                }
                if (!string.IsNullOrWhiteSpace(messDatas.ToString()))
                {
                    messages = messDatas.ToString();
                }

                return messages;
            }
            catch(Exception ex)
            {
                StringBuilder sblog = new StringBuilder();
                sblog.AppendFormat("{0}异常信息( GetSocketBytes ):", "LoadProxyHelper");
                sblog.AppendFormat("{0}ex:{1},", Environment.NewLine, ex.ToString());
                sblog.AppendFormat("{0}StackTrace:{1},", Environment.NewLine, ex.StackTrace.ToString());
                _logger.Fatal(sblog.ToString(), ex);
            }
            return "";
        }

        /// <summary>
        /// 获取response内容
        /// </summary>
        /// <param name="encode"></param>
        /// <param name="rl"></param>
        /// <returns></returns>
        private string GetResponseByEncode(string encode,int rl)
        {
            string sr = string.Empty;
            switch (encode)
            {
                case "utf-8":
                    sr = Encoding.UTF8.GetString(bytes, 0, rl);
                    break;
                case "ascii":
                    sr = Encoding.ASCII.GetString(bytes, 0, rl);
                    break;
                case "unicode":
                    sr = Encoding.Unicode.GetString(bytes, 0, rl);
                    break;
                default:
                    sr = Encoding.Default.GetString(bytes, 0, rl);
                    break;
            }
            return sr;
        }

        /// <summary>
        /// 发送请求
        /// </summary>
        /// <param name="str"></param>
        /// <param name="sRH"></param>
        private void SocketSend(string str, Socket sRH)
        {
            try
            {
                byte[] b = Encoding.Default.GetBytes(str);
                sRH.Send(b);
            }
            catch (Exception ex)
            {
                StringBuilder sblog = new StringBuilder();
                sblog.AppendFormat("{0}异常信息( SocketSend ):", "LoadProxyHelper");
                sblog.AppendFormat("{0}ex:{1},", Environment.NewLine, ex.ToString());
                sblog.AppendFormat("{0}StackTrace:{1},", Environment.NewLine, ex.StackTrace.ToString());
                _logger.Fatal(sblog.ToString(), ex);
            }
        }

        /// <summary>
        /// 连接代理服务器
        /// </summary>
        /// <param name="strRemoteHost"></param>
        /// <param name="iRemotePort"></param>
        /// <param name="sProxyServer"></param>
        /// <returns></returns>
        public bool ConnectProxyServer(string strRemoteHost, int iRemotePort, Socket sProxyServer)
        {
            try
            {
                //构造Socks5代理服务器第一连接头(无用户名密码) 
                byte[] bySock5Send = new Byte[10];
                bySock5Send[0] = 5;
                bySock5Send[1] = 1;
                bySock5Send[2] = RequireAuthorize ? (byte)2 : (byte)0;

                //发送Socks5代理第一次连接信息 
                sProxyServer.Send(bySock5Send, 3, SocketFlags.None);

                byte[] bySock5Receive = new byte[10];

                int iRecCount = sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None);


                //用户验证
                if (bySock5Receive[1] == 2 && !RequireAuthorize)
                {
                    throw new Exception("代理服务器需要进行身份确认。");
                }
                else if (bySock5Receive[1] == 2)
                {
                    //构造Socks5代理服务器第一连接头(无用户名密码)
                    byte[] bUser = Encoding.Default.GetBytes(Username);
                    byte[] bPass = Encoding.Default.GetBytes(Password);

                    int dl = 3 + bUser.Length + bPass.Length;

                    bySock5Send = new Byte[dl];
                    bySock5Send[0] = 5;
                    bySock5Send[1] = (byte)bUser.Length;
                    Array.Copy(bUser, 0, bySock5Send, 2, bUser.Length);
                    bySock5Send[2 + bUser.Length] = (byte)bPass.Length;
                    Array.Copy(bPass, 0, bySock5Send, 3 + bUser.Length, bPass.Length);

                    //发送Socks5代理第一次连接信息 
                    sProxyServer.Send(bySock5Send, dl, SocketFlags.None);

                    bySock5Receive = new byte[100];
                    iRecCount = sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None);
                }

                if (iRecCount < 2)
                {
                    sProxyServer.Close();
                    throw new Exception("不能获得代理服务器正确响应。");
                }

                if (bySock5Receive[0] != 5 || (bySock5Receive[1] != 0 && bySock5Receive[1] != 2))
                {
                    sProxyServer.Close();
                    throw new Exception("代理服务其返回的响应错误。");
                }

                if (bySock5Receive[1] == 0)
                {
                    bySock5Send[0] = 5;
                    bySock5Send[1] = 1;
                    bySock5Send[2] = 0;
                    bySock5Send[3] = 1;

                    IPAddress ipAdd = Dns.Resolve(strRemoteHost).AddressList[0];
                    string strIp = ipAdd.ToString();
                    string[] strAryTemp = strIp.Split(new char[] { '.' });
                    bySock5Send[4] = Convert.ToByte(strAryTemp[0]);
                    bySock5Send[5] = Convert.ToByte(strAryTemp[1]);
                    bySock5Send[6] = Convert.ToByte(strAryTemp[2]);
                    bySock5Send[7] = Convert.ToByte(strAryTemp[3]);

                    bySock5Send[8] = (byte)(iRemotePort / 256);
                    bySock5Send[9] = (byte)(iRemotePort % 256);

                    sProxyServer.Send(bySock5Send, bySock5Send.Length, SocketFlags.None);
                    iRecCount = sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None);

                    if (bySock5Receive[0] != 5 || bySock5Receive[1] != 0)
                    {
                        sProxyServer.Close();
                        throw new Exception("第二次连接Socks5代理返回数据出错。");
                    }
                    return true;
                }

                else
                {
                    if (bySock5Receive[1] == 2)
                        throw new Exception("代理服务器需要进行身份确认。");
                    else
                        return false;
                }
            }
            catch(Exception ex)
            {
                StringBuilder sblog = new StringBuilder();
                sblog.AppendFormat("{0}异常信息( ConnectProxyServer ):", "LoadProxyHelper");
                sblog.AppendFormat("{0}ex:{1},", Environment.NewLine, ex.ToString());
                sblog.AppendFormat("{0}StackTrace:{1},", Environment.NewLine, ex.StackTrace.ToString());
                _logger.Fatal(sblog.ToString(), ex);
            }
            return false;
        }

        /// <summary>
        /// 获取连接的socket
        /// </summary>
        /// <param name="strIpAdd"></param>
        /// <param name="iPort"></param>
        /// <returns></returns>
        public Socket GetSocket(string strIpAdd, int iPort)
        {
            try
            {
                IPAddress hostadd = IPAddress.Parse(strIpAdd);//Dns.Resolve(strIpAdd).AddressList[0];
                IPEndPoint EPhost = new IPEndPoint(hostadd, iPort);
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                s.Connect(EPhost);
                return s;
            }
            catch (Exception ex)
            {
                StringBuilder sblog = new StringBuilder();
                sblog.AppendFormat("{0}异常信息( GetSocket ):", "LoadProxyHelper");
                sblog.AppendFormat("{0}ex:{1},", Environment.NewLine, ex.ToString());
                sblog.AppendFormat("{0}StackTrace:{1},", Environment.NewLine, ex.StackTrace.ToString());
                _logger.Fatal(sblog.ToString(), ex);
                throw (ex);
            }
        }
    }

 调用代码

 

string host = "www.baidu.com";
string encode = "UTF-8";
string requset = string.Format("GET / HTTP/1.1");
// socks5
strReceiveString = proxHelper.GetSocketBytes(host, 80, requset, encode);
根据实际情况填写

 关于socks5发送请求的包头,请参考附件图片自行添加或修改

如上基本上实现一个通过C#+socks5完成代理操作

关于socks5说明请参阅:http://www.cnblogs.com/zhujiechang/archive/2008/10/21/1316308.html

  • 大小: 78.9 KB
分享到:
评论

相关推荐

    用C#实现的SOCKS5代理服务器源代码.rar

    在C#中实现一个SOCKS5代理服务器涉及到多个关键概念和技术,这些包括网络编程、套接字(Sockets)、协议解析以及多线程等。下面我们将详细探讨这些知识点。 1. **网络编程基础**: 在网络编程中,我们通常使用TCP/...

    socks5 c#简单代理源码

    SOCKS5是一种广泛使用的互联网协议,用于在客户端和目标服务器之间建立安全的隧道,以实现代理服务。它支持多种网络协议,如TCP和UDP,同时提供了身份验证、IPv4、IPv6以及域名支持。SOCKS5代理协议主要分为以下几个...

    C#写的代理服务器源代码 功能强大 支持http和socks5

    标题中的"C#写的代理服务器源代码 功能强大 支持http和socks5"表明这是一个用C#编程语言编写的代理服务器程序,它具备处理HTTP和SOCKS5两种协议的能力。HTTP代理主要处理Web浏览器的请求,而SOCKS5代理则是一个更...

    Socks5_openlx9_socks5_C#soks5_socks5分享_.net_

    本项目名为"Socks5_openlx9_socks5_C#soks5_socks5分享_.net_",可能是由开发者openlx9贡献的一个C#实现的SOCKS5代理服务器源代码。文件列表中的"Socks5"可能是包含源代码的文件或文件夹。对于想要学习或使用该代码...

    用C#实现的SOCKS5代理服务器源代码

    作者:Kingthy早上看到breeze写了一篇Socks5代理协议的文章《C# 实现Socket5代理协议通讯 》,并在评论里看到howaaa说“顺便也讲讲用C#实现一个Socks5代理服务器吧,这方面资料很少,相信很有价值”,于是一时兴起,...

    HttpToSocks5Proxy:C#Http到Socks5代理的实现

    HttpToSocks5Proxy 使用.NET HttpClient时,该库允许您通过Socks5代理进行连接。 它实现了IWebProxy接口,因此可以与所有支持HTTP / HTTPS代理的库一起使用。HttpClient的用法 using MihaZupan ;var proxy = new ...

    代理IP检测工具,HTTP/HTTPS/SOCKS5协议连通率和延迟检测

    代理IP分为多种类型,其中HTTP和HTTPS代理主要处理基于HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)的网络请求,而SOCKS5代理则是一种通用的代理协议,支持TCP/IP层的各种协议,包括HTTP、FTP等。...

    C# SOCKS client 类库

    C# SOCKS client 类库,Socks4Client类、Socks4aClient类、Socks5Client类分别封装了socks4\4a\5的协议,方便你在代码里面直接使用socks代理。还有其它很多的工具类,比如FtpsClient、HttpClient

    C# 网络传输文件socks 网络编程

    在C#中进行网络传输文件和使用socks协议进行网络编程是高级的开发技能,涉及到多个关键知识点。这里我们将深入探讨这些主题。 首先,C#是Microsoft开发的一种面向对象的编程语言,它提供了丰富的库来支持网络编程。...

    c# socket设置代理

    如果是SOCKS代理,则可能需要特定的库,如`ManagedSocks`。 4. **设置Socket属性**:通过`Socket.Proxy`属性设置代理信息。但请注意,此属性在.NET Framework中不直接支持,需要自定义逻辑实现。对于HTTP代理,可能...

    C#做的代理服务器可以使用不同的代理访问网页

    3. **实现多代理功能**:要使代理服务器能够使用不同的代理访问网页,我们需要管理一个代理列表,包含多个HTTP或SOCKS代理服务器的配置信息。每次客户端请求时,代理服务器可以选择一个可用的代理进行转发。这可能...

    用C#编写的Proxy代理,网络编程参考

    7. **Proxy.chm**:这是一个帮助文件,可能包含了关于如何使用此代理程序的文档和API参考。 通过以上分析,我们可以看到这个项目涵盖了从基础的网络通信到代理服务器实现的多个方面。开发者不仅需要理解HTTP、FTP等...

    SocksProxy代理服务器

    c#编写的socks代理服务器 支持sock4 sock4a sock5 sock5支持tcp和udp sock5支持匿名模式和用户名密码验证模式 运行需.net framework 2.0 http://blog.csdn.net/laotse/archive/2011/04/07/6306767.aspx

    Socks Proxy 源代码

    《C#实现Socks Proxy详解》 在计算机网络领域,代理服务器是一种常见的工具,它作为客户端与目标服务器之间的中介,可以提供多种网络服务,如负载均衡、匿名访问、网络安全等。其中,Socks Proxy(SOCKS协议)是一...

    Visual C#实现HTTP代理服务程序

    下面详细介绍如何使用 Visual C# 实现一个简单的 Web 代理服务程序。 1. **项目创建**:首先在 Visual Studio .Net 中创建一个新的 Visual C# Windows 应用程序项目,命名为“WebProxy”,并保存在指定位置。 2. *...

    一个简单的C#代理程序

    【标题】"一个简单的C#代理程序" 涉及的核心知识点主要集中在C#编程语言和网络代理技术上。在C#中编写代理程序,主要是为了实现网络通信中的代理服务,这种服务允许客户端通过代理服务器访问其他网络资源,提供安全...

    C# 使用Proxy代理请求资源的方法步骤

    这是上周在开发 C# 中使用 Proxy 代理时开发的一些思考和实践。主要需求是这样的,用户可以配置每次请求是否需要代理,用户可以配置 HTTP代理,HTTPS代理和代理白名单。 还是太年轻 因为一直用的C# 网络库中的...

    socks5proxyclient-master_socks框架代码_socks5proxies下载_socks5proxy_f

    另一个代理客户端源码,基于c#,.net框架,代码相交简单。比较实用

Global site tag (gtag.js) - Google Analytics