上一篇文章连接: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协议进行代理上网(三)相关推荐

  1. C# Socket使用代理 及 Http协议、Socks5协议

    Http协议:  http://www.w3.org/Protocols/rfc2068/rfc2068 socks5 协议: http://www.faqs.org/rfcs/rfc1928.htm ...

  2. CentOS 7作为客户端使用socks5代理上网

    GitHub这两天好像抽风了,正常访问都很难,自己搞了个gogs服务器后准备将github上的项目迁移到本地,先记录一下CentOS7作为客户端设置全局代理的方法 安装privoxy Linux貌似默 ...

  3. DNS隧道之DNS2TCP实现——dns2tcpc必须带server IP才可以,此外ssh可以穿过墙的,设置代理上网...

    我自己的命令: server端: dns2tcpd -F -d 1 -f ./dns2tcpd.conf 输出: 09:08:59 : Debug options.c:97 Add resource ...

  4. linux命令行模式下实现代理上网 专题

    有些公司的局域网环境,例如我们公司的只允许使用代理上网,图形界面的很好解决就设置一下浏览器的代理就好了,但是linux纯命令行的界面就....下面简单几步就可以实现了! 一.命令行界面的一般代理设置方 ...

  5. Proxifier设置代理上网详细操作

    分享知识 传递快乐 Proxifier配置上网代理 Proxifier 是一款功能非常强大的socks5客户端,可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理或代理链.支持X ...

  6. socks5 转 http 代理

    socks5 转 http 代理 在linux系统上安装shadowsocks软件,但是它使用的协议是socks5,对于一些只能使用http代理上网的软件就无能为力了,这就需要一个神器来把socks5 ...

  7. Regeorg 从python2改造为python3-从实战中学习socks5协议

    Regeorg 从python2改造为python3-从实战中学习socks5协议 问题描述 解决过程 环境准备 过程 这两天没啥工作,一般这时候我都不会发挥自己的主观能动性去主动找活,于是乎只能上网 ...

  8. linux下代理上网设置

    第一种情况是ISA服务器代理的设置 ubuntu12.04环境 ,如果公司用的是isa服务器,可能设置就稍微有些麻烦了,起初我也是在网络上查找了很久,终于找出了正确的方法: 浏览器上网就不用说了,直接 ...

  9. 基于WFP等网络驱动实现局域网内所有设备通过代理上网

    by fanxiushu 2020-10-13 转载或引用请注明原始作者 开始之前,我们先来理解标题是什么意思. 这里所说的局域网内的所有设备通过代理上网,并不是在每台设备上安装某个代理软件然后再通过 ...

  10. CCProxy代理上网设置方法

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! CCPr ...

最新文章

  1. 计算机组成原理-第二章 数据表示与运算
  2. android realm删除对象,Android Realm-从服务访问Realm对象
  3. mysql seq 重置_需要在Oracle中重置序列的值
  4. python源码精要(9)-CPython内部原理快速指南(1)
  5. 百题大冲关系列课程更新啦!这次是 Golang
  6. 计算机软件水平考试调整,全国计算机等级考试调整方案
  7. windows下的workon env
  8. 随想录(git操作)
  9. 视觉里程计07 Qt的一些bug修改记录
  10. Redisson实现分布式锁
  11. 乌合之众(大众心理研究)之三:群体的一般特征
  12. 【五步完美整理Windows系统】
  13. 企业微信如何做社群运营?企业微信群运营新玩法(可复用)
  14. vscode C语言中文输出乱码问题的解决
  15. Ubuntu安装Google拼音
  16. idea在 keymap下的eclipse的快捷键
  17. 软件项目估算概念、步骤、方法、戒律总览
  18. 施一公:如何做一名优秀的博士生
  19. 如何提高 CSS 动画性能
  20. 一楼到十楼的每层电梯门口都放着一颗钻石,钻石大小不一。你乘坐电梯从一楼到十楼,每层楼电梯门都会打开一次,只能拿一次钻石,问怎样才能拿到最大的一颗?

热门文章

  1. 项目经理应该具备的四种能力
  2. 【考研数学】张宇:十月真题做题建议
  3. python中ahp的代码_AHP | 层次分析法原理及Python实现
  4. C语言实验—— 数值统计
  5. diadem2017注册机 ni_NI DIAdem2017下载
  6. css vue 内联_Vue学习之路第十二篇:为页面元素设置内联样式
  7. python数据分析软件包_Python数据分析软件包介绍
  8. Win10系统安装打印机提示未安装打印机驱动程序,试图将驱动程序添加到存储区
  9. X509证书结构解析
  10. android ts流解码,DVB开发之TS流的接收,解码与播放