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("建立连接错误:%v\n",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失败:%v\n",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发送数据失败:%v\n",err) ExitChan <- true }(sconn,dconn,ExitChan) go func(sconn net.Conn,err := io.Copy(sconn,dconn) fmt.Printf("从%v接收数据失败:%v\n",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 }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。