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 代理的更多相关文章

  1. socks5代理使用和安装配置

    Socks简介: 详情可以百度,不过我猜你对那一大堆术语也会像我一样觉得无语, 所以我觉得你可以简单理解为它可以比较完美代理http/ftp/smtp等多种协议的代理工具就行了. 其中最具有典型例子的 ...

  2. 配置Linux客户端使用socks5代理上网

    配置Linux客户端使用socks5代理上网   背景 有访问google或者其他海外网站需求的同学可能大都用过或者听过ss,在Windows.Mac.Android.IOS都有现成可用的客户端来协助 ...

  3. socks5代理原理解析

    sock5代理的工作程序是:       1.需要代理方向服务器发出请求信息.       2.代理方应答       3.需要代理方接到应答后发送向代理方发送目的ip和端口       4.代理方与 ...

  4. 浅谈SOCKS5代理与HTTP代理的应用区别

    [1]什么是SOCKS5协议. SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递.SOCKS是"Sockets”的缩写. 当防火墙后的客户端要访问外部的服务器时,就 ...

  5. 使用 EW 作Socks5代理

    简介: EarthWorm是一款用于开启 SOCKS v5 代理服务的工具,基于标准 C 开发,可提供多平台间的转接通讯,用于复杂网络环境下的数据转发. 主页: http://rootkiter.co ...

  6. [转帖]SOCKS5代理与HTTP代理

    SOCKS5代理与HTTP代理 https://blog.csdn.net/watson2017/article/details/79897693 [1]什么是SOCKS5协议. SOCKS是一种网络 ...

  7. 利用proxychains在终端使用socks5代理

    最近用各种脚本下载东西的时候发现有的站点需要当地IP才能下,比如.....nico, youtube等: 所以就找了下能在终端用socks5代理的工具,最后找到了proxychains,从此再无压力= ...

  8. http,socks4,socks5代理的区别

    HTTP代理 能够代理客户机的HTTP访问,主要是代理浏览器访问网页,它的端口一般为80.8080.3128等: SOCKS代理 SOCKS代理与其他类型的代理不同,它只是简单地传递数据包,而并不关心 ...

  9. 浏览器插件使用socks5代理

    服务端测试,经常会遇到需要通过代理访问的情景,比如公司内网不能访问测试环境,这时可以通过socks5代理来解决. 一.使用Chrome浏览器访问   1. 下载并安装SwitchyOmega插件   ...

随机推荐

  1. SpringMVC之ajax与表单 Post 数据提交差异小结

    最近在写一个富文本框的后台数据服务的时候遇到一些关于 ajax 提交与 表单提交的比较特殊的案例,这里拿来跟大家分享,希望能让大家有所启发. 1. 首先是常见表单提交在SpringMVC的控制器中的代 ...

  2. vue问题五:element ui组件的开始时间-结束时间验证

    <el-date-picker v-model="seach.before" type="date" placeholder="开始时间&quo ...

  3. Android:动态库(.so)调试技巧

    一.反汇编定位crash ①查看crash log: 上图已标出crash发生在 libdeflicker_gpu.so 库中的 default_fail_func() 函数,但是 libdeflic ...

  4. SpringMVC接收集合页面参数

    SpringMVC接收集合页面参数 Spring MVC在接收集合请求参数时,需要在Controller方法的集合参数里前添加@RequestBody,而@RequestBody默认接收的enctyp ...

  5. zip炸弹

    故障系统有人提了zip炸弹的故障,了解了一些关于zip炸弹的常识. 42.zip 是很有名的zip炸弹.一个42KB的文件,解压完其实是个4.5PB的“炸弹”. 更有甚者,一个叫做 droste.zi ...

  6. PowerDesigner设置code和name不联动的方法

    按照如下设置即可: 具体步骤:菜单:Tools--General Options--Name to Code mirroring的复选框不要选中.

  7. [C++/JavaScript]数据结构:栈和数列>案例引入(数制的转换)

    1 案例1:数制的转换 1.1 背景与原理 1.2 编程复现 (JavaScript版 复现) function convert(value, d){ stack = []; // 栈 result ...

  8. CockroachDB学习笔记——[译]为什么Go语言是CockroachDB的正确选择

    原文链接:https://www.cockroachlabs.com/blog/why-go-was-the-right-choice-for-cockroachdb/ 原作者:Jessica Edw ...

  9. MLN 讨论 —— 基础知识

    一. MLN相关知识的介绍 1. First-order logic A first-order logic knowledge base (KB) is a set of formulas in f ...

  10. DIV+CSS 让同一行的图片和文字对齐【转藏】

    DIV+CSS 让同一行的图片和文字对齐 DIV+CSS 让同一行的图片和文字对齐 在div+css布局中,如果一行(或一个DIV)内容中有图片和文字的话,图片和文字往往会一个在上一个在下,这是一个新 ...