乐趣区

关于go:go安全开发二实现tcp代理

git 地址

假如 用户和 dst 不通,然而部署这个服务的设施和 dst 通,将这台设施收到的内容发送给 dst,将 dst 返回的内容,返回给客户

  1. 用到的 go 根底库

    • net.Listen 和 listener.Accept 建设本地的 tcp 连贯
    • net.Dail() 向远端发动 tcp 申请
package main

import (
    "io"
    "log"
    "net"
)

const dst_host = "www.baidu.com:80"

// 假如 用户和 dst 不通,然而部署这个服务的设施和 dst 通,将这台设施收到的内容发送给 dst,将 dst 返回的内容,返回给客户

func main() {listener, err := net.Listen("tcp", ":80")
    if err != nil {log.Fatal("谬误", err)
    }

    for {conn, err := listener.Accept()
        if err != nil {log.Fatalln("accept 出错", err)
        }
        handler(conn)
    }
}

func handler(src net.Conn) {dst, err := net.Dial("tcp", dst_host)
    if err != nil {log.Fatalln("连贯出错", err)
    }
    defer dst.Close()

    // 避免阻塞,应用协程
    go func() {
        // 将源的内容发送给 dst
        _, err := io.Copy(dst, src)
        if err != nil {log.Fatalln("源到目标 copy 出错", err)
        }
    }()

    _, err = io.Copy(src, dst)

    if err != nil {log.Fatalln("目标到源 copy 出错", err)
    }
}
退出移动版