在 Go 中以两个大端字节编码 SOCKS5 端口
使用 Go 的 binary.BigEndian 辅助函数处理 SOCKS5 端口字段,而不是切分变长二进制字符串。
SOCKS5 端口字段是按网络字节序排列的两个无符号字节:最高有效字节在前。在 Go 中,直接编码一个已经校验过的 uint16:
var field [2]byte
binary.BigEndian.PutUint16(field[:], port)导入 encoding/binary。对于端口 1080,得到的大端十六进制字节是 04 38。对于端口 4,则是 00 04;前导零是该定宽字段的一部分。
如果输入起初是更大的整数或字符串,在转换为 uint16 之前先校验其数值范围。转换可能会丢弃高位,而不是报告超出范围的值。
在 SOCKS5 应答中,序列化 BND.PORT,即 服务器绑定的端口字段。不要仅仅因为两者都占两个字节,就把请求的目标端口复制到该字段。把编码后的字段放在应答地址之后,其长度取决于 ATYP。