zoukankan      html  css  js  c++  java
  • Golang TCP转发到指定地址

    Golang TCP转发到指定地址

    第二个版本,设置指定ip地址

    代码

    // tcpForward
    package main
    
    import (
        "fmt"
        "net"
        "os"
    )
    
    func TcpForward(port int, forAddr string) {
        lisPort := fmt.Sprint(":", port)
        listen, err := net.Listen("tcp", lisPort)
        if err != nil {
            fmt.Printf("fault to listen,err: %s", err.Error())
            os.Exit(1)
        }
        defer listen.Close()
        fmt.Printf("listenning now!")
        for {
            fromConn, err := listen.Accept()
            if err != nil {
                fmt.Printf("fault,err: %s", err.Error())
                fromConn.Close()
                continue
            }
            //fmt.Printf(fromConn.LocalAddr(), " ", fromConn.RemoteAddr(), " ", fromConn)
            //buf := make([]byte, 2048)
            //fromConn.Read(buf)
            //fmt.Printf(string(buf))
    
            if forAddr == "" {
                go toDial(fromConn)
            } else {
                go forDial(fromConn, forAddr)
            }
        }
    
    }
    
    func forDial(fromConn net.Conn, forAddr string) {
        toConn, err := net.Dial("tcp", forAddr)
        if err != nil {
            fmt.Printf("fault,err: %s", err.Error())
            toConn.Close()
            return
        }
        fmt.Printf("%s to %s", fromConn.LocalAddr().String(), toConn.RemoteAddr().String())
        go copy(fromConn, toConn, 512)
        go copy(toConn, fromConn, 512)
    }
    
    func toDial(fromConn net.Conn) {
        toAddr := fromConn.RemoteAddr()
        toConn, err := net.Dial("tcp", toAddr.String())
        if err != nil {
            fmt.Printf("fault,err: %s", err.Error())
            toConn.Close()
            return
        }
        fmt.Printf("%s to %s", fromConn.LocalAddr().String(), toConn.RemoteAddr().String())
        go copy(fromConn, toConn, 512)
        go copy(toConn, fromConn, 512)
    }
    
    func copy(f, t net.Conn, n int) {
        defer f.Close()
        defer t.Close()
    
        var buf = make([]byte, n)
    
        for {
            count, err := f.Read(buf)
            if err != nil {
                fmt.Printf("fault,err: %s", err.Error())
                break
            }
    
            count, err = t.Write(buf[:count])
            if err != nil {
                fmt.Printf("fault,err: %s", err.Error())
                break
            }
        }
    }
    

    问题总结

    没有进行大量测试,未对详细错误进行错误处理,程序容易崩溃

  • 相关阅读:
    数组相似性计算
    关于GANs原论文里的数学证明
    Python 画个图
    Golang脱坑指南: goroutine(不断更新)
    Java面试细节整理(不断更新)
    从统计看机器学习(二) 多重共线性的一些思考
    从统计看机器学习(一) 一元线性回归
    数据库存储技术基础(一) 字典编码
    JVM内存管理笔记
    R语言rank函数详细解析
  • 原文地址:https://www.cnblogs.com/boxker/p/11041970.html
Copyright © 2011-2022 走看看