如何在socks5代理中return2字节的端口号给客户端?

How to return the port number in 2 bytes to client in socks5 proxy?

我正在尝试实施 socks5 代理服务器。 根据 rfc,大多数事情都很清楚,但我仍然无法解释客户端端口并以字节为单位写入我的端口号。

我创建了一个函数,将一个 int 和 returns 2 个字节。此函数首先将数字转换为二进制,然后按字面意思将位拆分为字符串,然后将它们转换回 byte.However 这似乎是错误的,因为如果最右边的位为 0,它们就会丢失。 这是函数

func getBytesOfInt(i int) []byte {
    binary := fmt.Sprintf("%b", i)
    if i < 255 {
        return []byte{byte(i)}
    }
    first := binary[:8]
    last := binary[9:]
    fmt.Println(binary, first, last)
    i1, _ := strconv.ParseInt(first, 2, 64)
    i2, _ := strconv.ParseInt(last, 2, 64)
    return []byte{byte(i1), byte(i2)}
}

你能解释一下我应该如何解析数字并获得 2 个字节,最重要的是我如何将它转换回整数。

目前,如果您将 1024 赋值给此函数,它将 return []byte{0x80, 0x0} 即小数形式的 128,但如您所见,正确的位丢失了,只有一个无用的 0。

您的代码有多个问题。首先:8和9:漏了一个元素([8]),见:https://play.golang.org/p/yuhh4ZeJFNL

另外,您应该将第二个字节截取为 int 的低字节,将第一个字节截取为高字节,而不是按字面意思切割二进制字符串。例如 4 应该被截取为 [0x0,0x4] 而不是 [0x4,0x0] 应该是 1024.

如果您想继续使用 strconv,您应该使用:

n := len(binary)
first := binary[:n-8]
last := binary[n-8:]

但是效率很低。

我会建议 b[0],b[1] = i >> 8, i & 255i = b[0]<<8 + b[1] .