golang实现简单tcp端口转发功能

功能: 通过tcp端口转发功能实现通过777端口代理访问117.111.52.24的http服务。

    package main

    import (
        "fmt"
        "io"
        "net"
        "os"
    )

    func main() {
        host := "0.0.0.0"
        port := "777"
        l, err := net.Listen("tcp", fmt.Sprintf("%s:%s", host, port))
        if err != nil {
            fmt.Println(err, err.Error())
            os.Exit(0)
        }

        for {
            s_conn, err := l.Accept()
            if err != nil {
                continue
            }

            d_tcpAddr, _ := net.ResolveTCPAddr("tcp4", "117.111.52.24:80")
            d_conn, err := net.DialTCP("tcp", nil, d_tcpAddr)
            if err != nil {
                fmt.Println(err)
                s_conn.Write([]byte("can't connect 117.111.52.24:80"))
                s_conn.Close()
                continue
            }
            go io.Copy(s_conn, d_conn)
            go io.Copy(d_conn, s_conn)
        }
    }

代码实现说明:

本地监听777端口, 有tcp请求时,连接到117.111.52.24:80,开启二个协程,一个协程用于fd的读,一个协程序用于fd的写, io的重定向通过io.copy实现

io.Copy的功能,类似于将一个进程的标准输出重定向到另一个进程的标准输入。 io.Copy(dst Writer, src Reader) io.Copy(s_conn, d_conn) 从目标tcp链接fd中读取内容,写到源tcp链接fd中返回给客户端 io.Copy(d_conn, s_conn) 从接收到tcp链接fd中读取内容,写到目标tcp链接fd中,发往服务程序。

Published:
2015-09-28 16:40
Category:
Tag: