Golang实现代理TCP客户端

目标网站xxx.com,代理服务器xxxproxy.com,通过代理服务器实现流量转发。

package main

func handle(src net.Conn){
    dst,err:=net.Dial("tcp","xxx.com:80")
    if err!=nil{
        log.Fatalln("Unable to connect out unreachable host")
    }
    defer dst.Close()
    //io.Copy确保第一次来自代理服务器的数据复制到目标主机
    //因为io.Copy函数是一个阻塞函数,阻塞直到关闭连接,所以将其包装进一个groutine中,并行执行。这样handle中的执行就可以继续进行,并可以进行第二次io.Copy
    go func(){
        if _,err:=io.Copy(dst,src);err!=nil{
            log.Fatalln(err)
        }
    }()
    if _,err:=io.Copy(src,dst);err!=nil{
        log.Fatalln(err)
    }
}
func main(){
    listener,err:=net.Listen("tcp","xxxproxy.com:80")
    if err!=nil{
        log.Fatalln("ubable to bin to port")
    }
    for {
        conn,err:=listener.Accept()
        if err!=nil{
            log.Fatalln("Ubable to accept connection")
        }
        go handle(conn)
    }
}
posted @ 2023-04-23 16:15  Weber·Bon  阅读(145)  评论(0编辑  收藏  举报