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

Is it possible to find which end causes io.Copy failure?

在我的 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?
}

当其中一端发生故障时,如何找出closed/dropped是哪一端。按结果?或者调用e1/e2?

的某个成员函数

谢谢。

首先,让两个 relay 共享一个通道并返回一个没有信息来自哪个 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
}

注意:上面的代码没有考虑并发读取或写入,也没有考虑错误后的继续(可能会再次将错误值设置回 nil),尽管这对 io.Copy 来说应该不是问题。它也不会忽略 io.EOF 错误,因此您可能需要明确检查它。