公司接入了联通的sgip协议通道,回执状态的鉴权放在了云主机,公司有三网ip各一个,要求在某一个网络出现故障时,回执能够从其他ip回来,不影响业务,运维找第三方实现软件无果,问题提交到我这里。
无他,唯祭出golang大法!
import (
"flag"
"fmt"
"io"
"math/rand"
"net"
"strings"
"time"
)
var internalServers []string
func main() {
var (
port = flag.String("port", ":1234", "Port")
hosts = flag.String("hosts", "", "Hosts")
)
flag.Parse()
internalServers = strings.Split(*hosts, ",")
listener, err := net.Listen("tcp", *port)
if err != nil {
fmt.Println("Error listening:", err)
return
}
defer listener.Close()
fmt.Println("Listening on port ", *port)
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting connection:", err)
continue
}
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
defer conn.Close()
// 将连接转发到内部服务器
forwardToInternalServer(conn)
}
func forwardToInternalServer(conn net.Conn) {
//internalServers := []string{"127.0.0.1:8081", "127.0.0.1:8082"}
server := internalServers[randInt(len(internalServers))]
fmt.Printf("Forwarding to %s\n", server)
// 建立与内部服务器的连接
internalConn, err := net.Dial("tcp", server)
if err != nil {
fmt.Println("Failed to connect to internal server:", err)
return
}
defer internalConn.Close()
// 使用io.Copy双向转发数据
go copyData(conn, internalConn)
go copyData(internalConn, conn)
}
func copyData(src, dst net.Conn) {
_, err := io.Copy(dst, src)
if err != nil {
fmt.Println("Error copying data:", err)
}
src.Close()
dst.Close()
}
func randInt(n int) int {
rand.Seed(time.Now().UnixNano())
return rand.Intn(n)
}
直接编译:go build -o tcp转发.exe
在云主机上运行:tcp转发.exe -port :7890 -hosts aaa.xxx.xxx.xx:2222,bbb.xxx.xxx.xx:2222
搞定!golang大法好!