golang 实现tcp转发代理

时间:2025-03-03 08:48:34
package main

import (
	"flag"
	"fmt"
	"io"
	"net"
	"os"
	"strings"
	"sync"
)

var lock 
var trueList []string
var ip string
var list string

func main() {
	(&ip, "l", ":9897", "-l=0.0.0.0:9897 指定服务监听的端口")
	(&list, "d", "127.0.0.1:1789,127.0.0.1:1788", "-d=127.0.0.1:1789,127.0.0.1:1788 指定后端的IP和端口,多个用','隔开")
	()
	trueList = (list, ",")
	if len(trueList) <= 0 {
		("后端IP和端口不能空,或者无效")
		(1)
	}
	server()
}

func server() {
	lis, err := ("tcp", ip)
	if err != nil {
		(err)
		return
	}
	defer ()
	for {
		conn, err := ()
		if err != nil {
			("建立连接错误:%v\n", err)
			continue
		}
		((), ())
		go handle(conn)
	}
}

func handle(sconn ) {
	defer ()
	ip, ok := getIP()
	if !ok {
		return
	}
	dconn, err := ("tcp", ip)
	if err != nil {
		("连接%v失败:%v\n", ip, err)
		return
	}
	ExitChan := make(chan bool, 1)
	go func(sconn , dconn , Exit chan bool) {
		_, err := (dconn, sconn)
		("往%v发送数据失败:%v\n", ip, err)
		ExitChan <- true
	}(sconn, dconn, ExitChan)
	go func(sconn , dconn , Exit chan bool) {
		_, err := (sconn, dconn)
		("从%v接收数据失败:%v\n", ip, err)
		ExitChan <- true
	}(sconn, dconn, ExitChan)
	<-ExitChan
	()
}

func getIP() (string, bool) {
	()
	defer ()

	if len(trueList) < 1 {
		return "", false
	}
	ip := trueList[0]
	trueList = append(trueList[1:], ip)
	return ip, true
}