我启动两个goroutine来转发两个io.ReadWriter
之间的消息,其中rw1
是类型为Conn.net
的TCP连接,而rw2
是*os.File
的类型使用pty
library构建telnet连接。这是转发代码:
func Connection(northConn net.Conn) {
// code omit ...
transport(northConn, sourthConn)
// code omit ...
sourthConn.Close() // close
}
func transport(rw1, rw2 io.ReadWriter) error {
errc := make(chan error, 1)
go func() {
_, err := io.Copy(rw1, rw2)
errc <- err
}()
go func() {
_, err := io.Copy(rw2, rw1)
errc <- err
}()
err := <-errc
if err != nil && err == io.EOF {
err = nil
}
return err
}
管道是“A
&lt; - &gt; rw1(northConn)
&lt; - &gt; rw2(sourthConn)
&lt; - &gt; telnet server
”其中A通过TCP与rw1通信连接,rw2
通过*os.File
读写来与telnet服务器通信。以上两个goroutine只是在rw1
和rw2
之间转发邮件
如果从exit
发送A
命令,则这两个goroutine可以正常关闭,以便rw2
和telnet server
之间的连接首先关闭,A
&lt; - &gt; {其次是{1}}。但是,如果我关闭A终端,这意味着仅rw1
发送到EOF
,rw1
&lt; - &gt; A
连接可以在rw1
&lt; rw2
时关闭; - &gt; telnet server
没有。第二个goroutine可以正常退出,而第一个goroutine仍然在io.Copy(rw1, rw2)
处阻挡。 sourthConn.Close()
也阻止了。{
所以我的问题是如何在这种情况下进行第一次goroutine退出并sourth.Close()
运行解锁?我提出了一个想法,即exit
收到rw1
之后在第二个goroutine中发送EOF
命令,但我不知道这是否是一个好方法,这是否会带来错误:< / p>
go func() {
_, err := io.Copy(rw2, rw1)
rw2.Write([]byte("exit\n")) // add this sentence
errc <- err
}()
如何直接从外部关闭*os.File
?