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. 求N个集合的并集

    做容器放置实验时,需要计算下载N个Images的总size(Image之间可能会有可以共享的size). 一开始想到的是Images两两之间求交集,然后慢慢推到了容斥原理...时间复杂度大概就是O(N ...

  2. np.random.choices的使用

    在看莫烦python的RL源码时,他的DDPG记忆库Memory的实现是这样写的: class Memory(object): def __init__(self, capacity, dims): ...

  3. PHP学习之分页类

    <?php $page = new Page(2, 40); var_dump($page->allUrl()); class Page { //每页显示多少条数据 protected $ ...

  4. 《Flutter 实战》开源电子书

    <Flutter 实战>开源电子书 转 https://blog.csdn.net/OQjya206rsQ71/article/details/86619630   关于 Flutter ...

  5. pyCharm最新2017激活

    pyCharm最新2017:下载地址 下载完成后安装软件 启动pyCharm,进入下面窗口 选择License server 在 server选项里边输入 http://elporfirio.com: ...

  6. prometheus数据上报方式-pushgateway

    pushgateway 客户端使用push的方式上报监控数据到pushgateway,prometheus会定期从pushgateway拉取数据.使用它的原因主要是: Prometheus 采用 pu ...

  7. Nginx-windows

    1.下载 http://nginx.org/ 选择最新稳定版本,例如nginx-1.15.5 mainline version has been released. 点击后,跳转页面,选择Stable ...

  8. 知识点整理-bio、nio的简单demo

    BIO package com.io.bio; import java.io.IOException; import java.io.InputStream; import java.net.Serv ...

  9. python-数据库-优化

    数据库的优化? 1. 优化硬件:采用SSD(固态驱动器,俗称固态硬盘),使用磁盘队列技术(RAID0,RAID1,RDID5)等: 2. 进行架构级别的缓存,静态化和分布式:(数据库-->渲染页 ...

  10. 【计算机视觉】深度相机(六)--Kinect v2.0 手势样本库制作

    目录为1.如何使用Kinect Studio录制手势剪辑:2.如何使用Visual Gesture Builder创建手势项目:3.如何在我的C#程序中使用手势:4.关于录制.剪辑手势过程中的注意事项 ...