• Golang tcp转发 remoteAddr错误


    Golang tcp 转发

    第一版本

    accept获取的Conn里的localAddr做为源地址,remoteAddr来做为目的地址

    // tcpForward
    package main
    
    import (
        "fmt"
        "net"
        "os"
    )
    
    func TcpForward(port int) {
        lisPort := fmt.Sprint(":", port)
        listen, err := net.Listen("tcp", lisPort)
        if err != nil {
            fmt.Println("fault to listen,err: %s", err.Error())
            os.Exit(1)
        }
        defer listen.Close()
        fmt.Println("listenning now!")
        for {
            fromConn, err := listen.Accept()
            if err != nil {
                fmt.Println("fault,err: %s", err.Error())
                fromConn.Close()
                continue
            }
            go toDial(fromConn)
        }
    
    }
    
    func toDial(fromConn net.Conn) {
        toAddr := fromConn.RemoteAddr()
        toConn, err := net.Dial("tcp", toAddr.String())
        if err != nil {
            fmt.Println("fault,err: %s", err.Error())
            toConn.Close()
        }
        fmt.Println("%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.Println("fault,err: %s", err.Error())
                break
            }
    
            count, err = t.Write(buf[:count])
            if err != nil {
                fmt.Println("fault,err: %s", err.Error())
                break
            }
        }
    }
    

    win设置代理,用edge访问网页报错!!!

    报错信息:

    C:/Go/bin/go.exe build [C:/Users/imcjb/Desktop/egoweb]
    成功: 进程退出代码 0.
    C:/Users/imcjb/Desktop/egoweb/egoweb.exe  [C:/Users/imcjb/Desktop/egoweb]
    Hello World!
    C:UsersimcjbDesktopegowebegoweb.exe
    listenning now!
    fault,err: %s dial tcp 127.0.0.1:53391: connectex: No connection could be made because the target machine actively refused it.
    panic: runtime error: invalid memory address or nil pointer dereference
    [signal 0xc0000005 code=0x0 addr=0x18 pc=0x6154cf]
    
    goroutine 20 [running]:
    main.toDial(0x6f4a20, 0xc000092038)
        C:/Users/imcjb/Desktop/egoweb/tcpForward.go:36 +0x3bf
    created by main.TcpForward
        C:/Users/imcjb/Desktop/egoweb/tcpForward.go:26 +0x2db
    fault,err: %s dial tcp 127.0.0.1:53392: connectex: No connection could be made because the target machine actively refused it.
    panic: runtime error: invalid memory address or nil pointer dereference
    [signal 0xc0000005 code=0x0 addr=0x18 pc=0x6154cf]
    
    goroutine 19 [running]:
    main.toDial(0x6f4a20, 0xc000092030)
        C:/Users/imcjb/Desktop/egoweb/tcpForward.go:36 +0x3bf
    created by main.TcpForward
        C:/Users/imcjb/Desktop/egoweb/tcpForward.go:26 +0x2db
    错误: 进程退出代码 2.
    

    错误猜测

    这里的remoteaddr返回的其实是转发前的真实ip,而非目的ip

    代码部分还有一个小问题println、sprintf使用错误,他们的参数是interface{}

  • 相关阅读:
    Python学习 Day 1-简介 安装 Hello world
    R Programming week2 Functions and Scoping Rules
    R in action读书笔记(6)-第七章:基本统计分析(中)
    R in action读书笔记(5)-第七章:基本统计分析
    Redis进阶应用:Redis+Lua脚本实现复合操作
    一个项目的SpringCloud微服务改造过程
    中间件增强框架之-CaptureFramework框架
    关系型数据库全表扫描分片详解
    AI中台——智能聊天机器人平台的架构与应用(分享实录)
    如何设计实时数据平台(设计篇)
  • 原文地址:https://www.cnblogs.com/boxker/p/11041049.html
Copyright © 2020-2023  润新知