为什么C结构体会生成错误的SOCKS请求
检查显式字段宽度、字节序和流式I/O,而不是把编译器布局当作线格式。
有效的代理地址并不能让手写的SOCKS消息变得有效。发送C或C++结构体可能把协议从未要求的填充或主机序整数一并发送。
对于SOCKS5域名CONNECT请求,在方法协商和任何选定认证之后,要显式序列化这个顺序:
- 版本、命令、保留字节和地址类型
- 域长度和域字节
- 按网络字节序排列的两字节目标端口
地址长度取决于SOCKS版本和地址类型。固定宽度的数字字段需要规定的表示;域字符串有自己的长度编码。C字符串终止符并不是向线消息追加零的通用指令。
| 实现中的捷径 | 需要检查的问题 |
|---|---|
| 通过8位指针赋值32位值 | 它不会输出全部四个字节 |
| 把缓冲区强制转换为更大整数的指针 | 对齐和字节序仍需处理 |
| 假设一次读或写就是一条消息 | TCP只能传输协议序列的一部分 |
将每个字段与目标地址比较,并处理部分I/O。收到两个字节并不证明整个响应已经到达。检查这些边界可以区分格式错误的请求和拒绝连接的正确描述。