C++使用Socks5协议进行代理上网(三)
上一篇文章连接:https://blog.csdn.net/hu421160052/article/details/88870940
这里是账号密码认证之后,这里需要你提供你要到达的具体的目的server的IP和Port,以及连接的具体方式
index = 0;byte Msg3[100];//socks5协议部分(5.客户端认证成功后开始进行请求)//|-------|-------|-------|--------|-----------|------------| //| VER | CMD | RSV | ATYP | DST.ADDR | DST.ADDR |//|-------|-------|-------|--------|-----------|------------|//| 1 | 1 | 0x00 | 1 | Active | 2 |//|-------|-------|-------|--------|-----------|------------|// VER.是SOCKS协议版本,这里应该是0x05.// CMD.是SOCKS的命令码:// 0x01:表示CONNECT请求// 0x02:表示BIND请求// 0x03:表示UDP转发// RSV.0x00:保留,无实际作用// ATYP.DST.ADDR类型:// 0x01:表示IPV4地址// 0x03:表示域名格式// 0x04:表示IPV6地址// DST.ADDR.目的地址// 当ATYP=0x01 DST.ADDR部分为四字节长度,内容为IP本身// 当ATYP=0x03 第一个部分为一个1字节表示域名长度,第二部分就是剩余内容为具体域名。Active表示长度不定。没有\0作为结尾// DST.PORT 网络字节序表示的目的端口Msg3[index++] = 0x05; //Version 版本号5Msg3[index++] = 0x01; //CMD CONNECT请求Msg3[index++] = 0x00; //Reserve = 0x00 must be ;Msg3[index++] = 0x01; //ATYP=IPV4int ads1 = atoi(ByteAddress[0]);int ads2 = atoi(ByteAddress[1]);int ads3 = atoi(ByteAddress[2]);int ads4 = atoi(ByteAddress[3]);Msg3[index++] = (byte)(0xff & ads1);Msg3[index++] = (byte)(0xff & ads2);Msg3[index++] = (byte)(0xff & ads3);Msg3[index++] = (byte)(0xff & ads4);Msg3[index++] = (byte)(dest_port / 256); //PortMsg3[index++] = (byte)(dest_port % 256);sprintf(result, "VER:0x%d%d\r\n CMD:0x%d%d\r\n RSV:0x%d%d\r\n ATYP:0x%d%d\r\n IP1:0x%d%d\r\n IP2:0x%d%d\r\n IP3:0x%d%d\r\n IP4:0x%d%d\r\n Port1:0x%d%d\r\n Port2:0x%d%d\r\n", Msg3[0]/16, Msg3[0] % 16, Msg3[1]/16,Msg3[1] % 16, Msg3[2]/16, Msg3[2] % 16,Msg3[3] / 16, Msg3[3] % 16, Msg3[4] / 16, Msg3[4] % 16, Msg3[5] / 16, Msg3[5] % 16, Msg3[6] / 16, Msg3[6] % 16, Msg3[7] / 16, Msg3[7] % 16, Msg3[8] / 16, Msg3[8] % 16, Msg3[9] / 16, Msg3[9] % 16);MessageBoxA(NULL, result, "第三次发送数据:", NULL);//第一次认证,如果为1则正确,为0则错误send(sockClient, (char*)Msg3, index, 0);//socks5协议部分(6.代理服务器->客户端,确认连接)//|-------|-------|-------|--------|-----------|------------| //| VER | RCV | RSV | ATYP | DST.ADDR | DST.ADDR |//|-------|-------|-------|--------|-----------|------------|//| 1 | 1 | 0x00 | 1 | Active | 2 |//|-------|-------|-------|--------|-----------|------------|// VER.返回必须为0x05.// RCV.返回的状态码:// 0x00:succeeded// 0x01:general SOCKS server failure// 0x02:connection not allowed by ruleset// 0x03:Network unreachable// 0x04:Host unreachable// 0x05:Connection refused// 0x06:TTL expired// 0x07:Command not supported// 0x08: Address type not supported// 0x09:to X’FF’ unassigned// RSV.0x00:保留,无实际作用// ATYP.仅用于响应BIND命令:// 0x01:表示IPV4地址// 0x03:表示域名格式// 0x04:表示IPV6地址// DST.ADDR.目的地址,仅用于响应BIND命令// 当ATYP=0x01 DST.ADDR部分为四字节长度,内容为IP本身// 当ATYP=0x03 第一个部分为一个1字节表示域名长度,第二部分就是剩余内容为具体域名。Active表示长度不定。没有\0作为结尾// DST.PORT 网络字节序表示的目的端口,仅用于响应客户端BIND命令byte RecvMsg3[100];numl=recv(sockClient, (char*)RecvMsg3, sizeof((char*)RecvMsg3), 0);int t00 = (RecvMsg3[0] / 16), t01 = (RecvMsg3[0] % 16);int t10 = (RecvMsg3[1] / 16), t11 = (RecvMsg3[1] % 16);int t20 = (RecvMsg3[2] / 16), t21 = (RecvMsg3[2] % 16);int t30 = (RecvMsg3[3] / 16), t31 = (RecvMsg3[3] % 16);int t40 = (RecvMsg3[4] / 16), t41 = (RecvMsg3[4] % 16); int t50 = (RecvMsg3[5] / 16), t51 = (RecvMsg3[5] % 16);int t60 = (RecvMsg3[6] / 16), t61 = (RecvMsg3[6] % 16);int t70 = (RecvMsg3[7] / 16), t71 = (RecvMsg3[7] % 16);int t80 = (RecvMsg3[8] / 16), t81 = (RecvMsg3[8] % 16);int t90 = (RecvMsg3[9] / 16), t91 = (RecvMsg3[9] % 16);sprintf(result, "Length:%d \r\n VER:0x%d%d\r\n RCV:0x%d%d\r\n RSV:0x%d%d\r\n ATYP:0x%d%d\r\n IP1:0x%d%d\r\n IP2:0x%d%d\r\n IP3:0x%d%d\r\n IP4:0x%d%d\r\n Port1:0x%d%d\r\n Port2:0x%d%d\r\n", numl,t00, t01, t10, t11,t20,t21,t30,t31,t40,t41,t50,t51,t60,t61,t70,t71,t80,t81, t90, t91);MessageBoxA(NULL, result, "第三次返回结果:", NULL);//第一次认证,如果为1则正确,为0则错误
发送数据和服务器返回结果:
最后主要注意RCV的值,为0时表示验证成功,可以继续下一步,在这里也有些常见的错误我贴出来一下
1.账号密码错误
RCV返回值为2
看协议
0x02:connection not allowed by ruleset
意思大概就是,你虽然连接上了,但是规则不允许帮你后续转发消息。所以代理失败
2.超时及网络错误:
这里第一种主要注意返回值的长度Length为-1,这里说明在你请求数据的时候,服务器已经单方面关闭了socket,接受不到任何信息,我是这样理解的。
第二种RCV返回1
0x01:general SOCKS server failure
这个就是失败,反正我测试情况下,网络状态不好和超时,就会报错,超时时间大概就是10s左右。
好了,说回来,如果返回值正常,就可以继续最后一步,数据转发。
第四部分:
https://blog.csdn.net/hu421160052/article/details/88871757
C++使用Socks5协议进行代理上网(三)相关推荐
- C# Socket使用代理 及 Http协议、Socks5协议
Http协议: http://www.w3.org/Protocols/rfc2068/rfc2068 socks5 协议: http://www.faqs.org/rfcs/rfc1928.htm ...
- CentOS 7作为客户端使用socks5代理上网
GitHub这两天好像抽风了,正常访问都很难,自己搞了个gogs服务器后准备将github上的项目迁移到本地,先记录一下CentOS7作为客户端设置全局代理的方法 安装privoxy Linux貌似默 ...
- DNS隧道之DNS2TCP实现——dns2tcpc必须带server IP才可以,此外ssh可以穿过墙的,设置代理上网...
我自己的命令: server端: dns2tcpd -F -d 1 -f ./dns2tcpd.conf 输出: 09:08:59 : Debug options.c:97 Add resource ...
- linux命令行模式下实现代理上网 专题
有些公司的局域网环境,例如我们公司的只允许使用代理上网,图形界面的很好解决就设置一下浏览器的代理就好了,但是linux纯命令行的界面就....下面简单几步就可以实现了! 一.命令行界面的一般代理设置方 ...
- Proxifier设置代理上网详细操作
分享知识 传递快乐 Proxifier配置上网代理 Proxifier 是一款功能非常强大的socks5客户端,可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理或代理链.支持X ...
- socks5 转 http 代理
socks5 转 http 代理 在linux系统上安装shadowsocks软件,但是它使用的协议是socks5,对于一些只能使用http代理上网的软件就无能为力了,这就需要一个神器来把socks5 ...
- Regeorg 从python2改造为python3-从实战中学习socks5协议
Regeorg 从python2改造为python3-从实战中学习socks5协议 问题描述 解决过程 环境准备 过程 这两天没啥工作,一般这时候我都不会发挥自己的主观能动性去主动找活,于是乎只能上网 ...
- linux下代理上网设置
第一种情况是ISA服务器代理的设置 ubuntu12.04环境 ,如果公司用的是isa服务器,可能设置就稍微有些麻烦了,起初我也是在网络上查找了很久,终于找出了正确的方法: 浏览器上网就不用说了,直接 ...
- 基于WFP等网络驱动实现局域网内所有设备通过代理上网
by fanxiushu 2020-10-13 转载或引用请注明原始作者 开始之前,我们先来理解标题是什么意思. 这里所说的局域网内的所有设备通过代理上网,并不是在每台设备上安装某个代理软件然后再通过 ...
- CCProxy代理上网设置方法
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! CCPr ...
最新文章
- 计算机组成原理-第二章 数据表示与运算
- android realm删除对象,Android Realm-从服务访问Realm对象
- mysql seq 重置_需要在Oracle中重置序列的值
- python源码精要(9)-CPython内部原理快速指南(1)
- 百题大冲关系列课程更新啦!这次是 Golang
- 计算机软件水平考试调整,全国计算机等级考试调整方案
- windows下的workon env
- 随想录(git操作)
- 视觉里程计07 Qt的一些bug修改记录
- Redisson实现分布式锁
- 乌合之众(大众心理研究)之三:群体的一般特征
- 【五步完美整理Windows系统】
- 企业微信如何做社群运营?企业微信群运营新玩法(可复用)
- vscode C语言中文输出乱码问题的解决
- Ubuntu安装Google拼音
- idea在 keymap下的eclipse的快捷键
- 软件项目估算概念、步骤、方法、戒律总览
- 施一公:如何做一名优秀的博士生
- 如何提高 CSS 动画性能
- 一楼到十楼的每层电梯门口都放着一颗钻石,钻石大小不一。你乘坐电梯从一楼到十楼,每层楼电梯门都会打开一次,只能拿一次钻石,问怎样才能拿到最大的一颗?
热门文章
- 项目经理应该具备的四种能力
- 【考研数学】张宇:十月真题做题建议
- python中ahp的代码_AHP | 层次分析法原理及Python实现
- C语言实验—— 数值统计
- diadem2017注册机 ni_NI DIAdem2017下载
- css vue 内联_Vue学习之路第十二篇:为页面元素设置内联样式
- python数据分析软件包_Python数据分析软件包介绍
- Win10系统安装打印机提示未安装打印机驱动程序,试图将驱动程序添加到存储区
- X509证书结构解析
- android ts流解码,DVB开发之TS流的接收,解码与播放