以下是上一篇文章链接
https://blog.csdn.net/hu421160052/article/details/88870402

协议第二部分:

//第二次发送数据index = 0;                 //重置长度byte Msg2[100];//socks5协议部分(3.发送账号密码数据至服务器认证)//|--------|-------------|-------------|--------|-------| //|  CVER  |  UserNameL  |   UserName  |  PWDL  |  PWD  |//|--------|-------------|-------------|--------|-------|//|   1       |      1      |     动态    |    1   |  动态 |//|--------|-------------|-------------|--------|-------|//  CVER是鉴定协议版本,这里应该是0x01.//   UserNameL是账户名的长度,大小为1位//  UserName是账户名本身 //  PWDL是密码的长度,大小为1位//   PWDL是PWD本身Msg2[index++] = 0x01;                      //Version 版本号5Msg2[index++] = (byte)strlen(Username);        //Username length 用户名长度for (int i = 0; i < strlen(Username); i++) //Username 用户名{Msg2[index++] = (byte)Username[i];}Msg2[index++] = (byte)strlen(Password);     //PWD 长度for (int i = 0; i < strlen(Password); i++)    //PWD 密码{Msg2[index++] = (byte)Password[i];}sprintf(Send_Msg, "CVER:0x%d%d\r\n UserNameL:0x%d%d\r\n UserName:0x%d%d 0x%d%d 0x%d%d 0x%d%d\r\n PWDL:0x%d%d\r\n PWD:0x%d%d 0x%d%d 0x%d%d 0x%d%d \r\n", (Msg2[0] / 16), (Msg2[0] % 16), (Msg2[1] / 16), (Msg2[1] % 16), (Msg2[2] / 16), (Msg2[2] % 16), (Msg2[3] / 16), (Msg2[3] % 16), (Msg2[4] / 16), (Msg2[4] % 16), (Msg2[5] / 16), (Msg2[5] % 16), (Msg2[6] / 16), (Msg2[6] % 16), (Msg2[7] / 16), (Msg2[7] % 16), (Msg2[8] / 16), (Msg2[8] % 16), (Msg2[9] / 16), (Msg2[9] % 16), (Msg2[10] / 16), (Msg2[10] % 16));MessageBoxA(NULL, (const char*)Send_Msg, "发送数据:", NULL);send(sockClient, (const char*)Msg2, index, 0);byte RecvMsg2[100];numl=recv(sockClient,(char*)RecvMsg2, sizeof((const char*)RecvMsg2), 0);int s00 = (RecvMsg2[0] / 16), s01 = (RecvMsg2[0] % 16);int s10 = (RecvMsg2[1] / 16), s11 = (RecvMsg2[1] % 16); //socks5协议部分(4.服务器响应数据)//|--------|------------|//|  CVER  |   Status   |//|--------|------------|//|   1    |     1      |//|--------|------------|// CVER是确认鉴定版本号// Status为状态码://        1.0x00表示成功//        1.0x01表示失败sprintf(result, "Length:%d\r\n CVER:0x%d%d\r\nStatus:0x%d%d\r\n", numl,s00, s01, s10, s11);MessageBoxA(NULL, result, "服务器认证账号密码返回结果:", NULL);//第一次认证,如果为1则正确,为0则错误

重点说一下:

send(sockClient, (const char*)Msg2, index, 0);

这里的index至关重要,代表了你要发送的数据长度,如果这里出了问题,接受到的数据一般都会是错误的,因为服务器那边接受不到正确信息。

numl=recv(sockClient,(char*)RecvMsg2, sizeof((const char*)RecvMsg2), 0);

同样接收数据的部分,sizeof((const char*)RecvMsg2),这里也是最终要的,在这里需要用sizeof()这个函数,如果是strlen(),也会出问题
在这一部分,账号/Username/密码/Password必须要正确才会有正确的返回值,测试的内容如下


这里CVER==1时,Status= =0 时表示账号密码认证无误,可以继续下一步

在这里我把一般的错误也记录一下
错误1:连接超时

在发送账号密码信息却一直不获取结果的情况下会收到这样的回应,这一点我没有看到RFC里面有介绍,或许不通的代理软件后台的返回值不一样,反正这样的结果就是错误的结果,现在我认为它就是超时的回应

错误2:账号密码认证失败
这里会返回和成功的结果一样,但是后面的验证回出现问题
第二部分就结束了
第三部分:
https://blog.csdn.net/hu421160052/article/details/88871480

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. 基于WFP等网络驱动实现局域网内所有设备通过代理上网

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

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

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

  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. CCProxy代理上网设置方法

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

  10. 04 - Object-C协议与代理设计

    2019独角兽企业重金招聘Python工程师标准>>> ##一. 简单使用 ###1. 基本用途 可以用来声明一大堆方法(不能声明成员变量) 只要某个类遵守了这个协议,就相当于拥有这 ...

最新文章

  1. python+flask+vue开发(1)--虚拟环境创建
  2. u-boot启动代码start.S详解360
  3. python3 llvmlite源码_将Paddle-Lite在树莓派上源码编译及编译python预测库
  4. Travis CI 配置文件 .travis.yml 的语法介绍和一些用法举例
  5. SAP ABAP实用技巧介绍系列之 XSLT copy和copy-of
  6. 学习总结:机器学习(一)
  7. python字典弱引用_如何使用弱引用优化 Python 程序的内存占用?
  8. lower版购物车模拟
  9. WIN10中DOCKER的安装
  10. POJ - 3026(BFS+最小生成树.krustal)
  11. 数据结构---堆的相关操作
  12. 计算32768晶体的负载电容,与晶体手册电容匹配
  13. layuiAdmin自定义模块
  14. 孤尽训练营打卡日记day17--面向对象
  15. HALCON获取区域的中心点、面积和最小外接圆半径
  16. linux服务器显卡监控脚本
  17. vue 脚手架 elementUi element-ui 兼容 ie 360 急速/兼容模式 完美处理
  18. 可编程计数器/定时器8253和8254
  19. python sum函数的用法
  20. 如何进行js的debug

热门文章

  1. java制作手机投射电脑_Android手机屏幕投射到电脑神器Vysor
  2. 华为校园招聘面试题目及流程
  3. 单片机c语言出租车计时程序,基于单片机的出租车计费(c语言
  4. 【音频】G711编码原理
  5. Kafka原理以及分区分配策略剖析
  6. JAVA查电话归属地
  7. 字节跳动python面试题校招_字节跳动校招----编程题(Python)
  8. 基于stm32的无线多点温度采集系统设计
  9. 初识ARM嵌入式系统
  10. 简单用BT3破解无线网络WEP, WPA密码