<强>我就废话不多说了,直接上代码吧:强>
主要包 导入( “国旗” “fmt” “输入输出” “净” “操作系统” “弦” “同步” ) var锁sync.Mutex var trueList[]字符串 var ip字符串 var列表字符串 函数main () { flag.StringVar(和ip、“l”“: 9897”,“- l=0.0.0.0:9897指定服务监听的端口”) flag.StringVar(和列表,“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=字符串。分割(列表,",") 如果len (trueList) & lt;=0 { fmt.Println(“后端IP和端口不能空,或者无效”) os.Exit (1) } 服务器() } func服务器(){ lis,犯错:=净。听(“tcp ip) 如果犯错!=nil { fmt.Println (err) 返回 } 推迟lis.Close () 为{ 康涅狄格州,犯错:=lis.Accept () 如果犯错!=nil { fmt。Println(“建立连接错误:% v \ n”,呃) 继续 } conn.LocalAddr fmt.Println (conn.RemoteAddr () () 去处理(康涅狄格州) } } 函数句柄(sconn net.Conn) { 推迟sconn.Close () ip,好:=getIP () 如果!好{ 返回 } dconn犯错:=净。刻度盘(“tcp ip) 如果犯错!=nil { fmt。Printf("连接% v失败:% v \ n”, ip,犯错) 返回 } ExitChan:=(陈bool, 1) func (sconn网。康涅狄格州,dconn净。康涅狄格州,退出陈bool) { _,犯错:=io。复制(dconn sconn) fmt。Printf("往% v发送数据失败:% v \ n”, ip,犯错) ExitChan & lt; -真的 }(sconn dconn ExitChan) func (sconn网。康涅狄格州,dconn净。康涅狄格州,退出陈bool) { _,犯错:=io。复制(sconn dconn) fmt。Printf("从% v接收数据失败:% v \ n”, ip,犯错) ExitChan & lt; -真的 }(sconn dconn ExitChan) & lt; -ExitChan dconn.Close () } func getIP()(字符串,bool) { lock.Lock () 推迟lock.Unlock () 如果len (trueList) & lt;1) { 返回",假的 } 知识产权:=trueList [0] trueList=append (trueList [1:], ip) 返回的ip,真 } >之前以上这篇golang实现tcp转发代理的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
golang实现tcp转发代理的方法