如何在socks5代理中以2个字节的形式返回端口号到客户端?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在socks5代理中以2个字节的形式返回端口号到客户端?相关的知识,希望对你有一定的参考价值。
我正在尝试实现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是没用的。
答案
您的代码有多个问题。第一: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 & 255
和i = b[0]<<8 + b[1]
。
以上是关于如何在socks5代理中以2个字节的形式返回端口号到客户端?的主要内容,如果未能解决你的问题,请参考以下文章