Полетата на 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.

Подобни статии