package comm import ( "fmt" "net" ) type QuitCtx map[string]interface{} type QuiteHandle func(ctx QuitCtx) bool var _quitCtx = make(map[string]interface{}) var _listeners = []QuiteHandle{} func InitQuitCtx(ctx QuitCtx) { _quitCtx = ctx } func PushQuitHandle(handle QuiteHandle) { _listeners = append(_listeners, handle) } func onQuite() { t := len(_listeners) for i, h := range _listeners { isBreak := h(_quitCtx) fmt.Println("[quit] ", i, "/", t, "breaking next =>", isBreak) if isBreak { break } } } var QuitChan = make(chan int) func InitQuitSocket(port int) error { if port <= 0 { p, e := GetFreePort() if e != nil { return e } port = p } ln, err := net.Listen("tcp", fmt.Sprintf(":%d", port)) if err != nil { fmt.Println("listen tcp err", err) return err } fmt.Println("quitsokect=>", port) go func() { // defer ln.Close() conn, err := ln.Accept() if err != nil { fmt.Println("Accept error=>", err) ln.Close() return } defer conn.Close() //接收 onQuite() message := "pong" _, err = conn.Write([]byte(message)) if err != nil { fmt.Println("Error sending message:", err) } QuitChan <- 1 }() return nil }