下面代码中的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)
}
}
可以看下io.copy的实现 ,里面有write
```go
for {
nr, er := src.Read(buf)
if nr > 0 {
nw, ew := dst.Write(buf[0:nr])
```
#1