Как узнать, что TCP-соединение закрыто в пакете Golang net? Я новичок в Голанге. Я реализую небольшой TCP-сервер и как узнать, закрылся ли один из моих клиентов? Должен ли я просто попытаться прочитать или написать и проверить, нет ли ошибки nil? Ответ 1 Этот поток " Лучший способ надежно обнаружить, что TCP-соединение закрыто", используя net.Conn для 'c' ( также см. в utils/ping.go или locale-backend/server.go или много других экземпляров): one := []byte{} c.SetReadDeadline(time.Now()) if _, err := c.Read(one); err == io.EOF { l.Printf(logger.LevelDebug, "%s detected closed LAN connection", id) c.Close() c = nil } else { var zero time.Time c.SetReadDeadline(time.Now().Add(10 * time.Millisecond)) } Для определения тайм-аута он предлагает: if neterr, ok := err.(net.Error); ok && neterr.Timeout() { ... Ответ 2 Просто попробуйте прочитать его, и он закроет ошибку, если она будет закрыта. Обращайтесь с грациозно, если хотите! Из-за риска слишком большого отдачи: func Read(c *net.Conn, buffer []byte) bool { bytesRead, err := c.Read(buffer) if err != nil { c.Close() log.Println(err) return false } log.Println("Read ", bytesRead, " bytes") return true } Вот хорошее введение в использование сетевого пакета для создания небольшого TCP-чата: http://www.badgerr.co.uk/2011/06/20/golang-away-tcp-chat-server/ Ответ 3 _, err := conn.Read(make([]byte, 0)) if err!=io.EOF{ // this connection is invalid logger.W("conn closed....",err) }else{ byt, _:= ioutil.ReadAll(conn); }
Ответ 1 Этот поток " Лучший способ надежно обнаружить, что TCP-соединение закрыто", используя net.Conn для 'c' ( также см. в utils/ping.go или locale-backend/server.go или много других экземпляров): one := []byte{} c.SetReadDeadline(time.Now()) if _, err := c.Read(one); err == io.EOF { l.Printf(logger.LevelDebug, "%s detected closed LAN connection", id) c.Close() c = nil } else { var zero time.Time c.SetReadDeadline(time.Now().Add(10 * time.Millisecond)) } Для определения тайм-аута он предлагает: if neterr, ok := err.(net.Error); ok && neterr.Timeout() { ...
Ответ 2 Просто попробуйте прочитать его, и он закроет ошибку, если она будет закрыта. Обращайтесь с грациозно, если хотите! Из-за риска слишком большого отдачи: func Read(c *net.Conn, buffer []byte) bool { bytesRead, err := c.Read(buffer) if err != nil { c.Close() log.Println(err) return false } log.Println("Read ", bytesRead, " bytes") return true } Вот хорошее введение в использование сетевого пакета для создания небольшого TCP-чата: http://www.badgerr.co.uk/2011/06/20/golang-away-tcp-chat-server/
Ответ 3 _, err := conn.Read(make([]byte, 0)) if err!=io.EOF{ // this connection is invalid logger.W("conn closed....",err) }else{ byt, _:= ioutil.ReadAll(conn); }