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。

相关文章