C# 连接 Socks5 代理
public class Socks5ProxyHelp
{
private Socks5ProxyHelp() { }
public static string[] errorMsgs = {
"Operation completed successfully.",//操作成功完成
"General SOCKS server failure.",//常规服务器失败
"Connection not allowed by ruleset.",//连接不被允许
"Network unreachable.",//网络不能到达
"Host unreachable.",//主机不能到达
"Connection refused.",//连接被拒绝
"TTL expired.",//TTL期满
"Command not supported.",//不支持的命令
"Address type not supported.",//不被支持的地址类型
"Unknown error."//未名的错误
};
// <summary>
// 连接到socks5代理
// </summary>
// <param name="proxyAdress">代理服务期地址</param>
// <param name="proxyPort">代理服务器端口</param>
// <param name="destAddress">目标地址 Destination: 目的地,UDP命令时是本机的地址</param>
// <param name="destPort">目标端口,UDP命令时是本机的UDP端口</param>
// <param name="userName">用户名</param>
// <param name="password">密码</param>
// <returns>用于TCP连接的SOCKET</returns>
public static void ConnectToSocks5Proxy(string proxyAdress, int proxyPort, string userName, string password, out string ErrorMsg)
{
ErrorMsg = "";
IPAddress proxyIP = null;
byte[] request = new byte[257]; //请求
byte[] response = new byte[257];//应答
ushort nIndex;
try
{
proxyIP = IPAddress.Parse(proxyAdress);
}
catch (FormatException)
{
proxyIP = Dns.GetHostEntry(proxyAdress).AddressList[0];
}
// 解析 destAddress (要求是类似 "212.116.65.112" 的string),否则是类似 "www.microsoft.com"的地址
IPEndPoint proxyEndPoint = new IPEndPoint(proxyIP, proxyPort);
Socket s = null;
try
{
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Connect(proxyEndPoint);//客户端连到服务器后,然后就发送请求来协商版本和认证方法:
nIndex = 0;
request[nIndex++] = 0x05; // V 5. [版本]
request[nIndex++] = 0x02; // 2种验证方式 [方法的数目]
request[nIndex++] = 0x00; // X'00' 不需要认证 [方法1]
request[nIndex++] = 0x02; // X'02' 用户名/密码[方法2]
s.Send(request, nIndex, SocketFlags.None);
// 收到2个字节的应答,填充到response中,如果不是两个字节,则抛出异常
int nGot = s.Receive(response, 2, SocketFlags.None);
if (nGot != 2) throw new Exception("从 proxy server 返回错误的应答.");
// 当前定义的方法有:
// X'00' 不需要认证
// X'01' GSSAPI
// X'02' 用户名/密码
// X'03' -- X'7F' 由IANA分配
// X'80' -- X'FE' 为私人方法所保留的
// X'FF' 没有可以接受的方法
switch (response[1])
{
case 0xFF:
没有可以接受的方法(s);
break;
case 0x02:
用户名密码验证(s, userName, password);
break;
}
}
catch (Exception ex)
{
ErrorMsg = ex.Message;
}
finally
{
if (s != null)
{
s.Close();
s.Dispose();
s = null;
}
}
//SendUDP.UDP命令(s);
}
static void 没有可以接受的方法(Socket s)
{
// 客户端没有一中验证方式能被服务器接受,则关闭该socket.
s.Close();
throw new Exception("客户端没有一中验证方式能被代理服务器接受.");
}
static bool 用户名密码验证(Socket s, string userName, string password)
{
byte[] request = new byte[257]; //请求
byte[] response = new byte[257];//应答
ushort nIndex;
byte[] rawBytes;
nIndex = 0;
request[nIndex++] = 0x05; // Version 5. 不清楚为什么报文的首字节是0x01(按照惯例应当是0x05)
// 加入 user name
request[nIndex++] = (byte)userName.Length; //一个字节,放UserName的长度
rawBytes = Encoding.Default.GetBytes(userName);
rawBytes.CopyTo(request, nIndex); //将userName 加入
nIndex += (ushort)rawBytes.Length;
// 加入 password
request[nIndex++] = (byte)password.Length; //一个字节,放PassWord的长度
rawBytes = Encoding.Default.GetBytes(password);
rawBytes.CopyTo(request, nIndex);
nIndex += (ushort)rawBytes.Length;
// 发送 Username/Password 请求
s.Send(request, nIndex, SocketFlags.None);
int nGot = s.Receive(response, 2, SocketFlags.None);
if (nGot != 2)
{
throw new Exception("从 proxy server 返回错误的应答.");
}
if (response[1] != 0x00) //返回如下的报文字节序列映像为:0x01 | 验证结果标志-->0x00 验证通过,其余均表示有故障
{
throw new Exception("账号或密码错误!");
}
Console.WriteLine("okpass");
return true;
}
}
C# 连接 Socks5 代理的更多相关文章
- socks5代理使用和安装配置
Socks简介: 详情可以百度,不过我猜你对那一大堆术语也会像我一样觉得无语, 所以我觉得你可以简单理解为它可以比较完美代理http/ftp/smtp等多种协议的代理工具就行了. 其中最具有典型例子的 ...
- 配置Linux客户端使用socks5代理上网
配置Linux客户端使用socks5代理上网 背景 有访问google或者其他海外网站需求的同学可能大都用过或者听过ss,在Windows.Mac.Android.IOS都有现成可用的客户端来协助 ...
- socks5代理原理解析
sock5代理的工作程序是: 1.需要代理方向服务器发出请求信息. 2.代理方应答 3.需要代理方接到应答后发送向代理方发送目的ip和端口 4.代理方与 ...
- 浅谈SOCKS5代理与HTTP代理的应用区别
[1]什么是SOCKS5协议. SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递.SOCKS是"Sockets”的缩写. 当防火墙后的客户端要访问外部的服务器时,就 ...
- 使用 EW 作Socks5代理
简介: EarthWorm是一款用于开启 SOCKS v5 代理服务的工具,基于标准 C 开发,可提供多平台间的转接通讯,用于复杂网络环境下的数据转发. 主页: http://rootkiter.co ...
- [转帖]SOCKS5代理与HTTP代理
SOCKS5代理与HTTP代理 https://blog.csdn.net/watson2017/article/details/79897693 [1]什么是SOCKS5协议. SOCKS是一种网络 ...
- 利用proxychains在终端使用socks5代理
最近用各种脚本下载东西的时候发现有的站点需要当地IP才能下,比如.....nico, youtube等: 所以就找了下能在终端用socks5代理的工具,最后找到了proxychains,从此再无压力= ...
- http,socks4,socks5代理的区别
HTTP代理 能够代理客户机的HTTP访问,主要是代理浏览器访问网页,它的端口一般为80.8080.3128等: SOCKS代理 SOCKS代理与其他类型的代理不同,它只是简单地传递数据包,而并不关心 ...
- 浏览器插件使用socks5代理
服务端测试,经常会遇到需要通过代理访问的情景,比如公司内网不能访问测试环境,这时可以通过socks5代理来解决. 一.使用Chrome浏览器访问 1. 下载并安装SwitchyOmega插件 ...
随机推荐
- Jmeter Web 性能测试入门 (五):Jmeter 参数化 Request
用来参数化的常用方法: 添加配置元件:用户定义的变量 使用函数助手 添加配置元件:CSV Data Set Config 添加前置处理器:BeanShell PreProcessor 添加配置元件:用 ...
- HearthBuddy Ai 调试实战2 在使用海巨人的时候,少召唤了一个图腾(费用是对的)
问题 游戏面板 8是青玉之爪13是海巨人17是恐狼前锋 64是萨满 66是圣骑士63,99,46,是微型木乃伊[其中99和46都是2血3攻,63是2血1攻]57是鱼人木乃伊 微型木乃伊 "L ...
- Centos - php5.4升级到7.1 yum安装
查看当前 PHP 版本 1 php -v 查看当前 PHP 相关的安装包,删除之 1 2 3 4 5 yum list installed | grep php yum remove php ...
- 数据库访问接口之ODBC
ODBC API 实现数据库操作的手段是句柄.在ODBC中,使用不同的句柄(HANDLE)来标志环境(environment).连接(Connection).语句(statement).描述符(des ...
- js 删除 按钮所在的行
<body> <table id="delte"> <caption>简易购物车</caption> <tr> < ...
- Delphi实现树型结构具体实例
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...
- 值得学习的C语言开源项目和库
收集一些C/C++相关的源码,如有更高效的库,请提醒我 补充上去 C/C++相关交流Q群 1414577 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具. ...
- JavaScript中new运算符的实现
废话不多说直接进入正题,首先我们需要先知道new运算符到底做了哪些事情,再来模拟它实现这一功能. 1. 建立一个空的Object对象: 2. 把这个空对象用__proto__链接到原型 3. 用app ...
- 单元测试ppt
单元测试ppt思路详解 目前的状况:1,现在很多单元测试只是利用@Test注解把代码或者整个请求接口内的business做测试2,单测的过程就很多查数据库的方法,但是没必要每次都测sql,因为sq ...
- 最新 搜狐java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.搜狐等10家互联网公司的校招Offer,因为某些自身原因最终选择了搜狐.6.7月主要是做系统复习.项目复盘.LeetCode ...