Поля порту 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.

Схожі статті