在Golang中實現流量轉發功能通常使用net包中的TCP或者UDP相關功能來實現。以下是一個簡單的示例代碼,實現了一個簡單的TCP流量轉發功能:
package main
import (
"fmt"
"net"
"os"
)
func main() {
// 監聽端口
ln, err := net.Listen("tcp", "localhost:8080")
if err != nil {
fmt.Println("Error listening:", err)
os.Exit(1)
}
defer ln.Close()
fmt.Println("Listening on localhost:8080")
// 接受客戶端連接
for {
conn, err := ln.Accept()
if err != nil {
fmt.Println("Error accepting connection:", err)
os.Exit(1)
}
fmt.Println("Accepted connection from", conn.RemoteAddr())
// 將數據轉發到目標地址
go func(conn net.Conn) {
targetAddr := "localhost:9090"
targetConn, err := net.Dial("tcp", targetAddr)
if err != nil {
fmt.Println("Error connecting to target:", err)
conn.Close()
return
}
defer targetConn.Close()
// 進行數據轉發
go func() {
_, err := io.Copy(targetConn, conn)
if err != nil {
fmt.Println("Error copying data to target:", err)
}
}()
_, err = io.Copy(conn, targetConn)
if err != nil {
fmt.Println("Error copying data to client:", err)
}
conn.Close()
}(conn)
}
}
以上代碼中,我們首先監聽localhost的8080端口,然后接受客戶端連接。每當有新的客戶端連接時,我們會創建一個新的goroutine來處理這個連接,將客戶端的數據轉發到目標地址localhost:9090上,同時也將目標地址的數據轉發回客戶端。最后,我們關閉連接。
當然,這只是一個簡單的示例,實際應用中可能需要考慮更多的錯誤處理,以及一些優化和安全性方面的考慮。