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

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

使反向 TCP 連接接受任意數量的連接(如普通 TCP 服務器)

使反向 TCP 連接接受任意數量的連接(如普通 TCP 服務器)

Go
森林海 2022-10-24 10:17:14
我正在嘗試為基于CONNECT的 HTTP 代理創建反向代理。想要使用代理的用戶只是將machine A其視為 HTTP 代理。它的工作方式如下:machine B打開一個 TCP 套接字到machine A.在 上machine A,TCP 套接字在端口上公開,所有傳入數據都通過隧道傳輸到machine B(io.Copy)。開啟machine B時,所有數據都通過隧道傳輸到本地 HTTP 服務器和套接字machine A。本質上,這是 HTTP 代理背后的反向代理。之所以如此復雜,是因為 HTTP 代理位于 NAT 之后(打開machine B),因此無法直接訪問。該用例能夠在 NAT 后面托管 HTTP 代理。機器A隧道(Go):package mainimport (    "log"    "net")func Conn(c *net.TCPConn) string {    return c.RemoteAddr().String() + " (" + c.LocalAddr().String() + ")"}func ProxifyConns(recipientConn, donorConn *net.TCPConn) {    log.Println("Proxying", ConnrecipientConn), "and", Conn(donorConn))    go func() {        _, err := io.Copy(recipientConn, donorConn)        if err != nil {            utils.StacktraceError(err)        }        recipientConn.Close()    }()    go func() {        _, err := io.Copy(donorConn, recipientConn)        if err != nil {            utils.StacktraceError(err)        }        recipientConn.Close()    }()}func main() {    // Open the donor listener    donorsAddr, err := net.ResolveTCPAddr("tcp4", ":11000")    if err != nil {        utils.StacktraceErrorAndExit(err)    }    listenerDonors, err := net.ListenTCP("tcp", donorsAddr)    if err != nil {        utils.StacktraceErrorAndExit(err)    }    defer listenerDonors.Close()    log.Println("Listening for donors on", listenerDonors.Addr())    // Open the recipient listener    recipientsAddr, err := net.ResolveTCPAddr("tcp4", ":10000")    if err != nil {        utils.StacktraceErrorAndExit(err)    }    listenerRecipients, err := net.ListenTCP("tcp", recipientsAddr)    if err != nil {        utils.StacktraceErrorAndExit(err)    }    defer listenerRecipients.Close()    log.Println("Listening for recipients on", listenerRecipients.Addr())
查看完整描述

1 回答

?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

當你這樣做


go func() {

    for {

        donorConn, err := listenerDonors.AcceptTCP()

        donorConn.SetKeepAlive(true)

        if err != nil {

            utils.StacktraceErrorAndExit(err)

            return

        }

        log.Println("New donor connection from", Conn(donorConn))

        donorConns <- donorConn

    }

}()

您開始處理第一個 TCP 連接。此代碼塊在donorConns <- donorConn. 在此發送到通道完成之前,循環不會進入第二次迭代(并且不會接受下一個 TCP 連接)。


你做了一個非常相似的第二個循環


// Handle recipient connections

for {

    recipientConn, err := listenerRecipients.AcceptTCP()

    recipientConn.SetKeepAlive(true)

    if err != nil {

        utils.StacktraceErrorAndExit(err)

        return

    }

    log.Println("New recipient connection from", Conn(recipientConn))

    donorConn := <-donorConns

    proxy.ProxifyConns(recipientConn, donorConn)

}

這需要donorConn := <-donorConns完成(從第一個循環開始)并且需要proxy.ProxifyConns(recipientConn, donorConn)完成。


我不確定你打算如何讓整個工作,但是,很可能,你需要一個很小的改變:

go proxy.ProxifyConns(recipientConn, donorConn)


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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