Неверная передача данных - PullRequest
0 голосов
/ 25 мая 2018

Мне нужно, чтобы моя программа была в середине соединения и правильно передавала данные в обоих направлениях.Я написал этот код, но он не работает должным образом

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))
    }
}

Проблема в том, что данные повреждены, например.enter image description here Левый оригинал, правый - то, что я получил.Конец полученного файла не читается.enter image description here Но в начале все в порядке.Я пытался изменить размер входного среза.Если размер> 0 и <8, все хорошо, но медленно.Если я установлю очень большой размер ввода, искажение данных станет более ужасным.Что я делаю не так? </p>

1 Ответ

0 голосов
/ 25 мая 2018

В handleConnection вы всегда пишете 1024 байта, независимо от того, что возвращает conn1.Read.

Вы хотите записать такие данные:

conn2.Write(input[:n])

Вы также должны проверитьваша верхняя петля for.Вы уверены, что не принимаете несколько соединений и не соединяете их все вместе?Я бы добавил несколько операторов журнала, чтобы вы могли видеть, когда соединения устанавливаются и закрываются.

Другая (вероятно, несущественная) ошибка заключается в том, что вы рассматриваете n==0 как условие завершения. В документации io.Reader рекомендуется игнорировать n==0, err==nil.Без проверки кода я не могу быть уверен, но я ожидаю, что conn.Read никогда не вернет n==0, err==nil, поэтому маловероятно, что это вызывает у вас проблемы.

Хотя это не влияет на правильность, вы могли бытакже уберите определение input из цикла, чтобы оно использовалось на каждой итерации;это может уменьшить объем работы, которую должен выполнять сборщик мусора.

...