Skip to content

Instantly share code, notes, and snippets.

@danp
Last active December 20, 2015 04:39
Show Gist options
  • Select an option

  • Save danp/6072293 to your computer and use it in GitHub Desktop.

Select an option

Save danp/6072293 to your computer and use it in GitHub Desktop.
Detect remote connection closing
% 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
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