當我閱讀這個開源代碼時。我對這兩個功能有兩個問題: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不會結束,對吧?如果是這樣,listenTCPfor 循環將創建許多這樣的handleTCPConn函數調用,這個程序沒有問題嗎?每次handleTCPConn使用時,它都會創建到遠程服務器的 TCP 連接。remoteConn, err := conn.(*tproxy.Conn).DialOriginalDestination(false)我的問題還是問題1,你可以看到handleTCPConn雙向傳輸一次流量,然后結束,handleTCPConn結束時TCP連接是否關閉?如果他們只傳輸文件的部分數據(從應用層來看),它是否也被關閉了?(我的意思是,如果 A->B->C: part data ,則 C->B->A: ACK )。
1 回答

www說
TA貢獻1775條經驗 獲得超8個贊
根據 golang 文檔,https: //pkg.go.dev/io#Copy
將副本從 src 復制到 dst,直到在 src 上到達 EOF 或發生錯誤。它返回復制的字節數和復制時遇到的第一個錯誤(如果有)。
所以當你啟動這個程序時,它會坐在那里等待你點擊“代理”,并將你的字節從源發送到目的地......當目的地響應時它會復制所有這些字節。如果目的地不寫入任何字節并且不關閉連接,我相信它會永遠坐在那里,等待遠端關閉套接字或響應。
如果您建立此連接并且遠程端開始發送數據(首先沒有請求),情況也是如此。如果“本地”端從不發送任何字節并且不關閉連接,則此代碼也將永遠等待。
只要遠程端優雅地關閉連接,這段代碼就應該在收到“0”字節并且沒有錯誤的情況下退出。如果遠端發送重置,你應該得到某種錯誤
- 1 回答
- 0 關注
- 107 瀏覽
添加回答
舉報
0/150
提交
取消