不正确的数据重传
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
的定义移出循环,以便在每次迭代中重复使用它;它可能会减少垃圾收集器必须完成的工作量。
我需要我的程序处于连接中间并在两个方向上正确传输数据。我写了这段代码,但它不能正常工作
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))
}
}
问题是数据损坏了,
例如。
在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
的定义移出循环,以便在每次迭代中重复使用它;它可能会减少垃圾收集器必须完成的工作量。