Go 新手求教

WilliamColton · 2024-8-19 01:50:01 · 138 次点击
在 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

我可以补充任何大家需要的详细信息
举报· 138 次点击
登录 注册 站外分享
1 条回复  
MooRider 小成 2024-8-19 03:10:40
试试 go test -race? 看看有没有 race condition
返回顶部