如何在socks5代理中以2个字节的形式返回端口号到客户端?

问题描述 投票:0回答:1

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

我创建了一个函数,它获取一个int并返回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,它将返回[]byte{0x80, 0x0},它是十进制的128但是你看到正确的位丢失了只有一个0是没用的。

go binary network-programming binary-data socks
1个回答
1
投票

您的代码有多个问题。第一: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]

© www.soinside.com 2019 - 2024. All rights reserved.