golang 实现tcp转发代理
发布时间:2020-12-16 19:19:23 所属栏目:大数据 来源:网络整理
导读:package mainimport ("flag""fmt""io""net""os""strings""sync")var lock sync.Mutexvar trueList []stringvar ip stringvar list stringfunc main() {flag.StringVar(ip,"l",":9897","-l=0.0.0.0:9897 指定服务监听的端口")flag.StringVar(list,"d","127.0.
package main import ( "flag" "fmt" "io" "net" "os" "strings" "sync" ) var lock sync.Mutex var trueList []string var ip string var list string func main() { flag.StringVar(&ip,"l",":9897","-l=0.0.0.0:9897 指定服务监听的端口") flag.StringVar(&list,"d","127.0.0.1:1789,127.0.0.1:1788","-d=127.0.0.1:1789,127.0.0.1:1788 指定后端的IP和端口,多个用','隔开") flag.Parse() trueList = strings.Split(list,",") if len(trueList) <= 0 { fmt.Println("后端IP和端口不能空,或者无效") os.Exit(1) } server() } func server() { lis,err := net.Listen("tcp",ip) if err != nil { fmt.Println(err) return } defer lis.Close() for { conn,err := lis.Accept() if err != nil { fmt.Println("建立连接错误:%vn",err) continue } fmt.Println(conn.RemoteAddr(),conn.LocalAddr()) go handle(conn) } } func handle(sconn net.Conn) { defer sconn.Close() ip,ok := getIP() if !ok { return } dconn,err := net.Dial("tcp",ip) if err != nil { fmt.Printf("连接%v失败:%vn",ip,err) return } ExitChan := make(chan bool,1) go func(sconn net.Conn,dconn net.Conn,Exit chan bool) { _,err := io.Copy(dconn,sconn) fmt.Printf("往%v发送数据失败:%vn",err) ExitChan <- true }(sconn,dconn,ExitChan) go func(sconn net.Conn,err := io.Copy(sconn,dconn) fmt.Printf("从%v接收数据失败:%vn",ExitChan) <-ExitChan dconn.Close() } func getIP() (string,bool) { lock.Lock() defer lock.Unlock() if len(trueList) < 1 { return "",false } ip := trueList[0] trueList = append(trueList[1:],ip) return ip,true } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |