不正确的数据重传

Incorrect data re-transmisson

我需要我的程序处于连接中间并在两个方向上正确传输数据。我写了这段代码,但它不能正常工作

package main

    import (
        "fmt"
        "net"
)

func main() {
    listener, err := net.Listen("tcp", ":8120")

    if err != nil {
        fmt.Println(err)
        return
    }
    defer listener.Close()
    fmt.Println("Server is listening...")
    for {
        var conn1, conn2 net.Conn
        var err error
        conn1, err = listener.Accept()
        if err != nil {
            fmt.Println(err)
            conn1.Close()
            continue
        }
        conn2, err = net.Dial("tcp", "185.151.245.51:80")
        if err != nil {
            fmt.Println(err)
            conn2.Close()
            continue
        }
        go handleConnection(conn1, conn2)
        go handleConnection(conn2, conn1)
    }
}

func handleConnection(conn1, conn2 net.Conn) {
    defer conn1.Close()
    for {
        input := make([]byte, 1024)
        n, err := conn1.Read(input)
        if n == 0 || err != nil {
            break
        }
        conn2.Write([]byte(input))
    }
}

问题是数据损坏了, 例如。 左边一个是原装的,右边一个是我买的。 最终得到的文件的结尾是不可读的。 但一开始一切正常。 我试图更改输入切片大小。如果大小 > 0 且 < 8,一切都很好,但速度很慢。如果我将输入大小设置得非常大,数据损坏会变得更加糟糕。 我做错了什么?

handleConnection中,你总是写1024字节,无论什么conn1.Read returns.

你要这样写数据:

conn2.Write(input[:n])

您还应该检查顶级 for 循环。你确定你不接受多个连接并将它们全部混在一起吗?我会添加一些日志语句,以便您可以查看何时建立和关闭连接。

另一个(可能无关紧要的)错误是您将 n==0 视为终止条件。 In the documentation of io.Reader 建议您忽略 n==0, err==nil。如果不检查代码,我无法确定,但我预计 conn.Read 永远不会 returns n==0, err==nil,所以这不太可能给你带来麻烦。

虽然它不影响正确性,但您也可以将 input 的定义移出循环,以便在每次迭代中重复使用它;它可能会减少垃圾收集器必须完成的工作量。