Os campos de porta SOCKS5 são dois bytes sem sinal na ordem de bytes de rede: o byte mais significativo vem primeiro. Em Go, codifique diretamente um uint16 já validado:

var field [2]byte
binary.BigEndian.PutUint16(field[:], port)

Importe encoding/binary. Para a porta 1080, os bytes hexadecimais resultantes são 04 38. Para a porta 4, são 00 04; o zero inicial faz parte do campo de largura fixa.

Se a entrada começar como um inteiro maior ou uma string, valide seu intervalo numérico antes de converter para uint16. A conversão pode descartar os bits altos em vez de relatar um valor fora do intervalo.

Em uma resposta SOCKS5, serialize BND.PORT, o campo de porta vinculada do servidor. Não copie a porta de destino solicitada para esse campo só porque ambas ocupam dois bytes. Coloque o campo codificado após o endereço da resposta, cujo comprimento depende do ATYP.

Artigos relacionados