Вы не можете вызывать close
на канале более одного раза, нет причин вызывать copy
в цикле for, поскольку он может работать только один раз, и вы копируете в неправильном направлении, записываяв stdin и чтение из stdout.
Просто спросить, как выйти из 2-х программ, просто, но это не единственное, что вам нужно сделать здесь.Поскольку io.Copy
блокирует, вам не нужна дополнительная синхронизация, чтобы определить, когда вызов завершен.Это позволяет значительно упростить код, что значительно упрощает рассуждения.
func interact(c net.Conn) {
go func() {
// You want to close this outside the goroutine if you
// expect to send data back over a half-closed connection
defer c.Close()
// Optionally close stdout here if you need to signal the
// end of the stream in a pipeline.
defer os.Stdout.Close()
_, err := io.Copy(os.Stdout, c)
if err != nil {
//
}
}()
_, err := io.Copy(c, os.Stdin)
if err != nil {
//
}
}
Также обратите внимание, что вы, возможно, не сможете вырваться из io.Copy
из стандартного ввода, поэтому вы можетене ожидайте, что функция interact
вернется.Вручную можно выполнить io.Copy
в теле функции и проверить наличие полузамкнутого соединения в каждом цикле, тогда вы можете быстрее разорвать соединение и убедиться, что вы полностью закрыли net.Conn
.