go - 是否有可能找出导致io.Copy失败的原因?

标签 go io

在我的golang程序中,我使用io.Copy()中继end1和end2之间的流。

func relay(src, dst net.Conn, stop chan bool) {
    stop <- (io.Copy(src, dst) == nil)
}
func myprog(e1, e2 net.Conn) {
    stop := make(chan bool)
    go relay(e1, e2, stop)
    go relay(e2, e1, stop)
    result := <-stop
    // Which end causes failure? Or both of them?
}
当其中一个继电器发生故障时,我如何找出哪一端闭合/掉线。结果呢?还是调用e1/e2的某些成员函数?
谢谢。

最佳答案

首先,使两个relay共享一个 channel 并返回一个错误,但不提供有关其来自哪个relay的信息,这显然无助于了解哪个端点出了问题。
其次,您可以包装每个端点的Read和Write方法来通知错误,例如:

type errReader struct {
    r   io.Reader
    err error
}

func (er *errReader) Read(b []byte) (int, error) {
    n, err := er.r.Read(b)
    er.err = err
    return n, err
}

type errWriter struct {
    w   io.Writer
    err error
}

func (ew *errWriter) Write(b []byte) (int, error) {
    n, err := ew.w.Write(b)
    ew.err = err
    return n, err
}
注意:上面的代码既不考虑并发读写,也不考虑错误后的继续(可能将err值再次设置为nil),尽管它对io.Copy来说不是问题。它还不会忽略io.EOF错误,因此您可能需要显式检查它。

关于go - 是否有可能找出导致io.Copy失败的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64832039/

相关文章:

java - 缓冲写入器 VS 内存 用于写入包含大量数据的 CSV 文件的映射 IO

go - go数据结构中的继承

mongodb - 为集合中的过期数据设置 TTL

go - 如何获得函数的返回类型

go - 解码忽略空字段

C: fscanf 导致未初始化变量错误

go - 将文件用作 Stdin (Golang) 时在第二次提示时获取 EOF

c++ - 如何将多个数组作为 C++ 中的输入?

c - 我的服务器程序只在第二个请求到达时才回答第一个请求?

java - 关于 I/O 中 write 方法我不明白的代码