关于golang实现Socks5的io.Copy函数问题

JackMarshall · · 1030 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

下面代码中的io.Copy()便能实现数据流的转发,我的疑惑是 Copy不是一个复制的函数吗,将remote的数据赋值给conn,那么conn应该还需要有一个发送函数,才能将数据发出去吧? 谢谢各位大佬的解答! func handle_conn(conn net.Conn) { defer conn.Close() r := bufio.NewReader(conn) Hand_shake(r,conn) addr,err := Read_Addr(r) if err != nil { log.Print(err) } log.Print("得到的完整的地址是:",addr) resp := []byte{0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} conn.Write(resp) var ( remote net.Conn //定义远端的服务器连接。 ) remote,err = net.Dial("tcp",addr) //建立到目标服务器的连接。 if err != nil { log.Print(err) conn.Close() return } wg := new(sync.WaitGroup) wg.Add(2) go func() { defer wg.Done() io.Copy(remote,r) //读取原地址请求(conn),然后将读取到的数据发送给目标主机。这里建议用"r",不建议用conn哟!因为它有重传机制! remote.Close() }() go func() { defer conn.Close() io.Copy(conn,remote) //与上面相反,就是讲目标主机的数据返回给客户端。 conn.Close() }() wg.Wait() } func main( ) { flag.Parse() listener,err := net.Listen("tcp",":8888") if err != nil { log.Fatal(err) } for { conn,err := listener.Accept() if err != nil { log.Fatal(err) } go handle_conn(conn) } }

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1030 次点击  
加入收藏 微博
1 回复  |  直到 2022-01-22 22:24:11
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传