如何在 socks5 代理中将 2 字节的端口号返回到客户端



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

我做了一个函数,它 tkes 一个 int 并返回 2 个字节。此函数首先将数字转换为二进制,然后将位拆分为字符串,然后将它们转换回字节。然而,这似乎是错误的,因为如果正确的大多数位是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,它将返回小数点 128 []byte{0x80, 0x0}但正如您所看到的,正确的位丢失了,只有一个 0 是无用的。

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

而且,您应该将第二个字节插入为 int 的低字节,将第一个字节插入为高字节,而不是从字面上剪切二进制字符串。 例如,4应该作为 [0x0,0x4] 而不是 [0x4,0x0] 哪个 should 是 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].

最新更新