亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這段代碼中的 TCP 連接何時關閉?

這段代碼中的 TCP 連接何時關閉?

Go
慕容森 2022-12-05 16:27:56
當我閱讀這個開源代碼時。我對這兩個功能有兩個問題: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”字節并且沒有錯誤的情況下退出。如果遠端發送重置,你應該得到某種錯誤


查看完整回答
反對 回復 2022-12-05
  • 1 回答
  • 0 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號