关于C#使用socks5做代理
在实际使用的过程中可能存在使用代理访问其他网站,以防因过度频繁访问,自己ip被封,如下提供C#使用socks5的大致代码,个人可以根据实际情况进行封装、加工。切勿乱用
![](http://dalan-123.iteye.com/images/icon_star.png)
- 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);
根据实际情况填写
关于C#使用socks5做代理相关推荐
- .NET 使用sock5做代理(不是搭建服务端)
在日常开发中经常会遇到这些需求,爬取数据,都知道现在通常用python爬取是很方便的,但是免不了还有很多伙伴在用NET来爬取,在爬取数据的时候我们知道需要使用代理服务器,如果不用代理,你的IP很有可能 ...
- 使用fiddler4做代理调试手机页面
由于一般手机不能改host,手机页面如果涉及到各个域名ip的混合使用,在手机上调试看效果非常麻烦. 使用fiddler4做代理,手机跟电脑连到同一个局域网,手机上网通过电脑做个代理上网,那么一切请求就 ...
- 小菜成长记---【proxy 代理模式 ---西门庆干潘金莲——王婆做代理】
西门庆找潘金莲,潘金莲肯定不会答应,咋办找个王婆做代理呗. 西门庆干潘金莲的事我就不说了大家心里明的像镜似的.. 程序代码实现如下: 定义女人接口,以及方法. 潘金莲实现女人接口,以及方法. 王婆实现 ...
- 花生日记怎么做代理?花生日记官方邀请码AZR9NNO
花生日记怎么做代理?花生日记官方邀请码AZR9NNO,官方客服微信Tyi523花生日记app是一款生活购物服务软件,这款软件收集了大量的优惠好用产品,大量的电商都在这里售卖产品,想要免费做代理的伙伴, ...
- 做代理记账工作风险有哪些
做代理记账工作风险有: 1.来自经济环境的风险:不正规企业在代理记账是建立在市场经济基础上的,而在市场经济发展中最基本特征就是强烈的竞争,因此这些不正规代理企业或个人通常以盈利为目,为了争取更多 ...
- Linux做代理上网服务器
Linux做代理上网服务器--送给那些想用Linux做网吧代理上网服务器的朋友 首先声明,会这个的老鸟不用看,我这只是给新手看的 首先安装好Linux,准备一台有两块网卡的服务器,一网卡接内网,另一网 ...
- 使用ssh tunnel 来做代理或跳板
接前文 http://www.cnblogs.com/piperck/p/6188984.html 使用ssh config配置文件来管理ssh连接 前文说了如何配置自己的ssh config 来方 ...
- 如何选择socks5免费代理地址呢?
选择Socks5代理地址时,需要考虑以下几个因素: 1.代理服务提供商的信誉度和口碑.选择一个有良好信誉度的代理服务提供商,可以避免遭遇到诸如安全风险和数据丢失等问题. 2.地理位置:选择一个地理位置 ...
- PRX 通过LSP实现浏览器Socks5/Tcp代理(从发送数据上着手)
本文阐述针对市面上主流的浏览器 实现基于Socks5协议Tcp代理部分原理 它是浏览器翻墙的一种方法 这只是在LSP实现方式中一种类别 它具备很多不同方式 但在本文中不在累赘:此方法适应"C ...
最新文章
- 我最常用的Intellij IDEA快捷键
- 阻塞队列的使用案例-注册成功后增加积分
- CC2540、nRF51822应用开发比较
- cv::mat 颜色空间_网站设计基础:负空间
- mybatis中mysql转义讲解
- 三、规则组织的衍生组织——经山形组织数学模型的建立
- 从根本上解决 Infopath 2010 重复表的序号问题
- 齐浩亮 计算机科学与技术,齐浩亮
- C# ASP.NET 权限设计 完全支持多数据库多语言包的通用权限管理系统组件源码
- linux 改成utc时间_深度操作系统UTC时间设置怎样改?
- Ubuntu全盘备份与恢复,亲自总结,实测可靠
- ArcGIS Pro中的拓扑检查
- 2013计算机核心期刊,2013年度发表国内核心期刊论文
- Avril Lavigne: Complicated
- ui sketch_如何在Sketch中设计汽车应用程序设计UI
- 思科模拟器EVE-NG如何导入镜像
- 汽车电子之功能安全介绍
- 麦克风产品 麦克风元器件 市场调研
- LED有哪些优点,LED驱动电源方案
- 南京邮电大学计算机非全调剂,南京邮电大学2018年拟接收(非全日制)考研调剂公告...
热门文章
- Ubuntu 如何查看电脑内存条信息
- ttf字体库裁剪工具制作与使用
- 物联网概念下的B2C电子商务平台“开放”浅析
- 双显示器一个清晰一个模糊
- 魅蓝NOTE6怎么ROOT,一招最简单实用的方法
- CSDN 如何置顶文章
- GBase 8a 告警管理--页面告警
- 【Bash百宝箱】Android源码下载及编译
- 电脑硬件知识大全(二)
- cad缺失字体补全工具_字体下载预览缺失补齐助手-链图云字体助手下载v2.9.1.9 官方版-西西软件下载...