Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不正确的数据重新传输 我需要我的程序在连接的中间,并在两个方向上正确地传送数据。我写了这段代码,但它不能正常工作 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)) } }_Go_Connection_Buffer_Slice - Fatal编程技术网

不正确的数据重新传输 我需要我的程序在连接的中间,并在两个方向上正确地传送数据。我写了这段代码,但它不能正常工作 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)) } }

不正确的数据重新传输 我需要我的程序在连接的中间,并在两个方向上正确地传送数据。我写了这段代码,但它不能正常工作 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)) } },go,connection,buffer,slice,Go,Connection,Buffer,Slice,问题是数据被破坏了, 例如 左边的是原创的,右边的是我得到的。 无法读取最终获取的文件的结尾。 但一开始一切都很好。 我试图改变输入片的大小。如果大小>0且小于8,则一切正常,但速度较慢。如果我将输入大小设置得非常大,数据的损坏会变得更加可怕。 我做错了什么?在handleConnection中,您总是写入1024字节,无论conn1如何。Read返回 您希望像这样写入数据: conn2.Write(input[:n]) 您还应该检查顶级的循环。你确定你没有接受多个连接并将它们全部弄脏吗?我会

问题是数据被破坏了, 例如 左边的是原创的,右边的是我得到的。 无法读取最终获取的文件的结尾。 但一开始一切都很好。 我试图改变输入片的大小。如果大小>0且小于8,则一切正常,但速度较慢。如果我将输入大小设置得非常大,数据的损坏会变得更加可怕。
我做错了什么?

handleConnection
中,您总是写入1024字节,无论
conn1如何。Read
返回

您希望像这样写入数据:

conn2.Write(input[:n])
您还应该检查顶级
循环。你确定你没有接受多个连接并将它们全部弄脏吗?我会加入一些日志语句,以便您可以看到连接何时建立和关闭

另一个(可能是无关紧要的)错误是,您将
n==0
视为终止条件。建议您忽略
n==0,err==nil
。如果不检查代码,我无法确定,但我希望
conn.Read
永远不会返回
n==0,err==nil
,因此这不太可能给您带来麻烦

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