Golang トラフィック転送の実装方法【完全ガイド】
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に転送し、同時にターゲットアドレスからのデータをクライアントに転送します。最後に、接続を閉じます。
もちろん、これは単なる簡単な例に過ぎず、実際のアプリケーションではさらに多くのエラー処理や最適化、セキュリティの考慮が必要となる場合があります。