Кодирование портов SOCKS5 в Go двумя байтами big-endian
Используйте помощники binary.BigEndian в Go для полей порта 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.