商务合作加Q:411239339

来呀!用golang做个简单的tcpproxy

浏览:844次阅读
没有评论

共计 1084 个字符,预计需要花费 3 分钟才能阅读完成。

作为一个中间的 tcp 代理转发,来不及解释了,快上车!上 Code!

数据转发示意图:
来呀!用 golang 做个简单的 tcpproxy

package main

import (
    "fmt"
    "log"
    "net"
    //"os"
)

func main() {
    // 这里可以传入参数
    //if len(os.Args) != 5 {//  log.Fatalf("Usage: %s <source ip> <source port> <destination ip> <destination port>", os.Args[0])
    //}

    // 源端口,目的端口
    var fromport, toport int = 8888,43822
    fromaddr := fmt.Sprintf("0.0.0.0:%d",  fromport)
    toaddr := fmt.Sprintf("192.168.3.88:%d", toport)

    fromlistener, err := net.Listen("tcp", fromaddr)

    if err != nil {log.Fatal("Unable to listen on: %s, error: %s\n", fromaddr, err.Error())
    }
    defer fromlistener.Close()

    for {fromcon, err := fromlistener.Accept()
        if err != nil {fmt.Printf("Unable to accept a request, error: %s\n", err.Error())
        } else {fmt.Println("new connect:" + fromcon.RemoteAddr().String())
        }

        // 这边最好也做个协程,防止阻塞
        toCon, err := net.Dial("tcp", toaddr)
        if err != nil {fmt.Printf("can not connect to %s\n", toaddr)
            continue
        }

        go handleConnection(fromcon, toCon)
        go handleConnection(toCon, fromcon)

    }

}

func handleConnection(r, w net.Conn) {defer r.Close()
    defer w.Close()

    var buffer = make([]byte, 100000)
    for {n, err := r.Read(buffer)
        if err != nil {break}

        n, err = w.Write(buffer[:n])
        if err != nil {break}
    }

}

Code 跑起来:
来呀!用 golang 做个简单的 tcpproxy

使用 netstat 查看下监听端口:
来呀!用 golang 做个简单的 tcpproxy

新开一个 cmd 窗口,使用 telnet 探测一下 8888 端口:
来呀!用 golang 做个简单的 tcpproxy

说明代理转发成功,代码短小精悍。

正文完
扫码赞助
post-qrcode
 0
果子
版权声明:本站原创文章,由 果子 于2022-09-19发表,共计1084字。
转载说明:除特殊说明外本站文章皆由果较瘦原创发布,转载请注明出处。