SOCKS5のポートフィールドはネットワークバイトオーダーの2バイトの符号なし整数で、最上位バイトが先頭です。Goでは、検証済みのuint16をそのままエンコードします。

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

encoding/binaryをインポートします。ポート1080の場合、得られる16進数のバイトは04 38です。ポート4の場合は00 04です。先頭のゼロも固定幅フィールドの一部です。

入力がより大きな整数や文字列で始まる場合は、uint16に変換する前に数値範囲を検証してください。変換は範囲外の値を報告せずに上位ビットを捨てることがあります。

SOCKS5の応答では、BND.PORT、つまりサーバーのバインド済みポートフィールドをシリアライズします。どちらも2バイトだからといって、要求された宛先ポートをそのフィールドにコピーしないでください。エンコードしたフィールドは、長さがATYPに依存する応答のアドレスの後に置きます。

関連記事