是否有可能找到导致 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
错误,因此您可能需要明确检查它。
在我的 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
错误,因此您可能需要明确检查它。