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插件 ...
随机推荐
- OpenResty之ngx_lua模块的加密接口
原文: ngx_Lua模块中的加密api接口 ngx.crc32_short digest = ngx.crc32_short(str) 该方法主要是计算给定字符串 str 的循环校验码(Cyclic ...
- arcpy 获得是否为布局mxd.activeView
arcpy 获得是否为布局mxd.activeView print mxd.activeView PAGE_LAYOUT mxd.pageSizePageSize(width=21.590043180 ...
- x86 linux下如何交叉编译?
答: 需要首先指定两个环境变量CROSS_COMPILE和ARCH 如交叉编译arm64的程序: export CROSS_COMPILE="aarch64-linux-gnu-" ...
- 数据分析 - sql 业务相关练习题
数据库 userinfo , orderinfo 表 两个 userId 彼此对应 题目 解题 不同月份的下单人数 用户在同一个月份会下多个单,这里进行去重 未支付的脏数据去除 统计用户三月份的 ...
- Markdown 图片的简单处理
0. 前言 最近写 md 文章的时候发现,在 markdown 里插入一些很长的图片的时候,会显得很不好看,于是去查了一下如何实现 markdown 里图片的并排显示,参考了各个博客内的内容和 mar ...
- tensorflow查看ckpt各节点名称
from tensorflow.python import pywrap_tensorflowimport os checkpoint_path=os.path.join('output/res101 ...
- python3 __mian和__name__的区别
1.新建 test.py 模块: def GetModuleName(): print('__name__ = ', __name__) def PrintName(): print('PrintNa ...
- JAVA 基础编程练习题17 【程序 17 猴子吃桃问题】
17 [程序 17 猴子吃桃问题] 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又 将剩下的桃子吃掉一半,又多吃了一个.以后每天早上都吃了前一天剩下的一 ...
- delphi7 treeview + 数据库 实现动态节点维护
首先说下树节点对应的表的基本结构,必需要有的字段(节点编号,父节点编号,节点名称),其他字段根据你开发的需要添加从添加节点开始,一开始就取出表中最大节点编号,每次添加节点的时候,该节点编号增加1;添加 ...
- phpcms前台无法退出无法清除cookie
phpcms前台无法退出无法清除cookie 如果caches\configs\system.php 中的cookie_path 设置为空..就会出现退不出的情况..设置为'cookie_path' ...