有效的代理地址并不能让手写的SOCKS消息变得有效。发送C或C++结构体可能把协议从未要求的填充或主机序整数一并发送。

对于SOCKS5域名CONNECT请求,在方法协商和任何选定认证之后,要显式序列化这个顺序:

  1. 版本、命令、保留字节和地址类型
  2. 域长度和域字节
  3. 按网络字节序排列的两字节目标端口

地址长度取决于SOCKS版本和地址类型。固定宽度的数字字段需要规定的表示;域字符串有自己的长度编码。C字符串终止符并不是向线消息追加零的通用指令。

实现中的捷径需要检查的问题
通过8位指针赋值32位值它不会输出全部四个字节
把缓冲区强制转换为更大整数的指针对齐和字节序仍需处理
假设一次读或写就是一条消息TCP只能传输协议序列的一部分

将每个字段与目标地址比较,并处理部分I/O。收到两个字节并不证明整个响应已经到达。检查这些边界可以区分格式错误的请求和拒绝连接的正确描述。

相关文章