在 2019-2020 年初三期间接触到了翻墙,一直想写一个翻墙软件,但是当时什么也不会
后来高中自己学了点 go 语言,虽然知道了其中的法律风险,梦想早已放弃,但是前几天突然又记起来了,~~贼心不死,虽然并不打算搞这个,但是还是想实现一个带加密的 socks5 代理服务器,遇到一些问题,故来请教 V 友们~~
PS:我只是为了缅怀一下曾经的梦想,没有任何非法的打算!!!
依照 [你也能写个 Shadowsocks]( https://github.com/gwuhaolin/blog/issues/12) 这个教程,主要分为两端:
- 本地:将浏览器流量转发至服务器端
- 服务器端:完成和浏览器之间的 socks5 握手,解析出目标服务器,并转发流量至目标服务器
实现流量转发的关键代码:
```
go CopyData(srcConn, dstConn, cipher)
CopyData(dstConn, srcConn, cipher)
```
其中这个 CopyData 几乎完全按照标准库的 io.Copy 实现,只是加了一层加解密,长这样:
```
func CopyData(srcConn, dstConn net.Conn, cipher Cipher) (err error) {
buf := make([]byte, 32*1024)
for {
nr, er := srcConn.Read(buf)
if nr > 0 {
nw, ew := dstConn.Write(cipher.Encrypt(buf[0:nr]))
//fmt.Println("内容:", cipher.Encrypt(buf[0:nr]))
//time.Sleep(1 * time.Nanosecond)
if nw < 0 || nr < nw {
nw = 0
if ew == nil {
ew = errors.New("short write")
}
}
if ew != nil {
err = ew
break
}
if nr != nw {
err = io.ErrShortWrite
break
}
}
if er != nil {
if er != io.EOF {
err = er
}
break
}
}
fmt.Println("CopyData err:", err)
return err
}
```
问题来了,只要我把 ```fmt.Println("内容:", cipher.Encrypt(buf[0:nr]))``` 注释掉,程序就不能运行起来(不会报错),一旦取消注释,程序就能如预期一样运行 QAQ
然后我想了一下,可能是这行代码起到了延时的作用,于是我把它改成 ```time.Sleep(1 * time.Nanosecond)``` 发现依然可以正常运行,但是一旦注释掉就不能正常进行流量转发了,想请问一下是为什么 QAQ
我可以补充任何大家需要的详细信息 |
|