Last active
December 20, 2015 04:39
-
-
Save danp/6072293 to your computer and use it in GitHub Desktop.
Detect remote connection closing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| % go run main.go | |
| 2013/07/24 13:47:30 accepted | |
| 2013/07/24 13:47:31 closing | |
| 2013/07/24 13:47:31 watcher read error EOF | |
| 2013/07/24 13:47:31 write error write tcp 127.0.0.1:5000: broken pipe |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package main | |
| import ( | |
| "log" | |
| "net" | |
| "time" | |
| ) | |
| var serverPort = "5000" | |
| func serve(conn net.Conn) { | |
| defer conn.Close() | |
| time.Sleep(1 * time.Second) | |
| log.Println("closing") | |
| } | |
| func server(port string, readyCh chan bool) { | |
| ln, err := net.Listen("tcp", ":"+port) | |
| if err != nil { | |
| log.Fatalln("listen error", err) | |
| } | |
| readyCh <- true | |
| for { | |
| conn, err := ln.Accept() | |
| if err != nil { | |
| log.Println("accept error", err) | |
| continue | |
| } | |
| log.Println("accepted") | |
| go serve(conn) | |
| } | |
| } | |
| func closeWatch(conn net.Conn) { | |
| b := make([]byte, 1) | |
| for { | |
| _, err := conn.Read(b) | |
| if err != nil { | |
| log.Println("watcher read error", err) | |
| break | |
| } | |
| } | |
| } | |
| func client(port string) { | |
| conn, err := net.Dial("tcp", "localhost:"+port) | |
| if err != nil { | |
| log.Fatalln("dial error", err) | |
| } | |
| go closeWatch(conn) | |
| for { | |
| _, err := conn.Write([]byte("hello")) | |
| if err != nil { | |
| log.Fatalln("write error", err) | |
| } | |
| } | |
| } | |
| func main() { | |
| readyCh := make(chan bool) | |
| go server(serverPort, readyCh) | |
| <-readyCh | |
| go client(serverPort) | |
| select {} | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment