当我阅读这个开源代码时。
我对这两个功能有两个问题:
func listenTCP() {
for {
conn, err := tcpListener.Accept()
if err != nil {
if netErr, ok := err.(net.Error); ok && netErr.Temporary() {
log.Printf("Temporary error while accepting connection: %s", netErr)
}
log.Fatalf("Unrecoverable error while accepting connection: %s", err)
return
}
go handleTCPConn(conn) // check below
}
}
func handleTCPConn(conn net.Conn) {
log.Printf("Accepting TCP connection from %s with destination of %s", conn.RemoteAddr().String(), conn.LocalAddr().String())
defer conn.Close()
remoteConn, err := conn.(*tproxy.Conn).DialOriginalDestination(false)
if err != nil {
log.Printf("Failed to connect to original destination [%s]: %s", conn.LocalAddr().String(), err)
return
}
defer remoteConn.Close()
var streamWait sync.WaitGroup
streamWait.Add(2)
streamConn := func(dst io.Writer, src io.Reader) {
io.Copy(dst, src)
streamWait.Done()
}
go streamConn(remoteConn, conn)
go streamConn(conn, remoteConn)
streamWait.Wait()
}
根据我的理解,我画了这张图:
你看,handleTCPConn 创建了两个 goroutines 来传输两个方向(左 -> 右;右 -> 左)的流量,
我的问题是:
你看代码使用sync.WaitGroup
,如果他们只发送left-> right
流量,没有相反方向的流量,那么handleTCPConn
不会结束,对吧?如果是这样,listenTCP
for 循环将创建许多这样的handleTCPConn
函数调用,这个程序没有问题吗?
每次handleTCPConn
使用时,它都会创建到远程服务器的 TCP 连接。
remoteConn, err := conn.(*tproxy.Conn).DialOriginalDestination(false)
我的问题还是问题1,你可以看到handleTCPConn
双向传输一次流量,然后结束,handleTCPConn结束时TCP连接是否关闭?如果他们只传输文件的部分数据(从应用层来看),它是否也被关闭了?(我的意思是,如果 A->B->C: part data ,则 C->B->A: ACK )。
www说
相关分类